diff options
Diffstat (limited to 'src/tabbar.cpp')
-rw-r--r-- | src/tabbar.cpp | 124 |
1 files changed, 118 insertions, 6 deletions
diff --git a/src/tabbar.cpp b/src/tabbar.cpp index 651265d1..815a153d 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -36,24 +36,35 @@ #include "mainwindow.h" #include "urlbar.h" #include "webview.h" +#include "websnap.h" // KDE Includes #include <KShortcut> #include <KStandardShortcut> #include <KDebug> #include <KGlobalSettings> +#include <KPassivePopup> // Qt Includes #include <QtCore/QString> #include <QtGui/QFont> #include <QtGui/QToolButton> +#include <QtGui/QLabel> +#include <QtGui/QMouseEvent> +#include <QtGui/QPainter> +#include <QtGui/QVBoxLayout> -TabBar::TabBar(QWidget *parent) +#define BASE_WIDTH_DIVISOR 4 +#define MIN_WIDTH_DIVISOR 8 + + +TabBar::TabBar(MainView *parent) : KTabBar(parent) , m_parent(parent) , m_addTabButton(new QToolButton(this)) + , m_currentTabPreview(-1) { setElideMode(Qt::ElideRight); @@ -77,6 +88,11 @@ TabBar::~TabBar() void TabBar::postLaunch() { + // HACK this is used to fix add tab button position + QToolButton *secondAddTabButton = new QToolButton(this); + secondAddTabButton->setAutoRaise(true); + secondAddTabButton->setToolButtonStyle(Qt::ToolButtonIconOnly); + // Find the correct MainWindow of this tab button MainWindowList list = Application::instance()->mainWindowList(); Q_FOREACH(QPointer<MainWindow> w, list) @@ -84,6 +100,7 @@ void TabBar::postLaunch() if (w->isAncestorOf(this)) { m_addTabButton->setDefaultAction(w->actionByName("new_tab")); + secondAddTabButton->setDefaultAction(w->actionByName("new_tab")); break; } } @@ -91,17 +108,19 @@ void TabBar::postLaunch() m_addTabButton->setAutoRaise(true); m_addTabButton->setToolButtonStyle(Qt::ToolButtonIconOnly); m_addTabButton->show(); + + // stupid tabbar, that's what you gain... + m_parent->setCornerWidget(secondAddTabButton); + m_parent->cornerWidget()->hide(); } QSize TabBar::tabSizeHint(int index) const { - //TODO Create a SuperTabWidget class - int buttonSize = m_addTabButton->size().width(); int tabBarWidth = m_parent->size().width() - buttonSize; - int baseWidth = m_parent->sizeHint().width()/4; - int minWidth = m_parent->sizeHint().width()/8; + int baseWidth = m_parent->sizeHint().width()/BASE_WIDTH_DIVISOR; + int minWidth = m_parent->sizeHint().width()/MIN_WIDTH_DIVISOR; int w; if (baseWidth*count()<tabBarWidth) @@ -187,13 +206,106 @@ void TabBar::reloadTab() void TabBar::setTabButtonPosition() { + if(count() >= MIN_WIDTH_DIVISOR - 1) + { + if(m_addTabButton->isVisible()) + { + m_addTabButton->hide(); + m_parent->cornerWidget()->show(); + } + return; + } + + if(m_addTabButton->isHidden()) + { + m_addTabButton->show(); + m_parent->cornerWidget()->hide(); + } + int tabWidgetWidth = frameSize().width(); int tabBarWidth = tabSizeHint(0).width()*count(); - int newPosY = height()/2.0 - m_addTabButton->height()/2.0; + int newPosY = height() - m_addTabButton->height(); int newPosX = tabWidgetWidth - m_addTabButton->width(); if (tabBarWidth + m_addTabButton->width() < tabWidgetWidth) newPosX = tabBarWidth; m_addTabButton->move(newPosX, newPosY); + m_addTabButton->show(); +} + + +void TabBar::showTabPreview(int tab) +{ + WebView *view = m_parent->webView(tab); + + int w = tabSizeHint(tab).width(); + int h = w*((0.0 + view->height())/view->width()); + + //delete previous tab preview + if (m_previewPopup) + { + delete m_previewPopup; + } + + m_previewPopup = new KPassivePopup(this); + m_previewPopup->setFrameShape(QFrame::StyledPanel); + m_previewPopup->setFrameShadow(QFrame::Plain); + m_previewPopup->setFixedSize(w, h); + QLabel *l = new QLabel(); + l->setPixmap(WebSnap::renderPreview(*(view->page()), w, h)); + m_previewPopup->setView(l); + m_previewPopup->layout()->setAlignment(Qt::AlignTop); + m_previewPopup->layout()->setMargin(0); + + QPoint pos( tabRect(tab).x() , tabRect(tab).y() + tabRect(tab).height() ); + m_previewPopup->show(mapToGlobal(pos)); +} + + +void TabBar::mouseMoveEvent(QMouseEvent *event) +{ + //Find the tab under the mouse + int i = 0; + int tab = -1; + while (i<count() && tab==-1) + { + if (tabRect(i).contains(event->pos())) + { + tab = i; + } + i++; + } + + //if found and not the current tab then show tab preview + if (tab != -1 && tab != currentIndex() && m_currentTabPreview != tab) + { + showTabPreview(tab); + m_currentTabPreview = tab; + } + + //if current tab or not found then hide previous tab preview + if (tab==currentIndex() || tab==-1) + { + if ( m_previewPopup) + { + m_previewPopup->hide(); + } + m_currentTabPreview = -1; + } + + KTabBar::mouseMoveEvent(event); +} + + +void TabBar::leaveEvent(QEvent *event) +{ + //if leave tabwidget then hide previous tab preview + if ( m_previewPopup) + { + m_previewPopup->hide(); + } + m_currentTabPreview = -1; + + KTabBar::leaveEvent(event); } |