summaryrefslogtreecommitdiff
path: root/src/tabbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tabbar.cpp')
-rw-r--r--src/tabbar.cpp124
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);
}