summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainview.cpp87
-rw-r--r--src/mainview.h12
2 files changed, 97 insertions, 2 deletions
diff --git a/src/mainview.cpp b/src/mainview.cpp
index a662bbb0..e2b6e1bb 100644
--- a/src/mainview.cpp
+++ b/src/mainview.cpp
@@ -51,6 +51,7 @@
#include <KMessageBox>
#include <KDebug>
#include <KStandardDirs>
+#include <KPassivePopup>
// Qt Includes
#include <QtCore/QTimer>
@@ -62,17 +63,22 @@
#include <QtGui/QMovie>
#include <QtGui/QWidget>
#include <QtGui/QMouseEvent>
-
+#include <QtGui/QPainter>
+#include <QtGui/QVBoxLayout>
MainView::MainView(QWidget *parent)
: KTabWidget(parent)
, m_urlBar(new UrlBar(this))
, m_tabBar(new TabBar(this))
, m_currentTabIndex(0)
+ , m_currentTabPreview(-1)
{
// setting tabbar
setTabBar(m_tabBar);
+ // set mouse tracking for tab previews
+ setMouseTracking(true);
+
// loading pixmap path
m_loadingGitPath = KStandardDirs::locate("appdata" , "pics/loading.mng");
@@ -595,3 +601,82 @@ KUrl::List MainView::recentlyClosedTabs()
{
return m_recentlyClosedTabs;
}
+
+void MainView::mouseMoveEvent(QMouseEvent *event)
+{
+ //Find the tab under the mouse
+ int i = 0;
+ int tab = -1;
+ while (i<count() && tab==-1)
+ {
+ if (m_tabBar->tabRect(i).contains(event->pos())) tab = i;
+ i++;
+ }
+
+ //if found and not the current tab then show tab preview
+ if (tab!=-1 && tab!=m_tabBar->currentIndex() && m_currentTabPreview!=tab)
+ {
+ showTabPreview(tab);
+ m_currentTabPreview=tab;
+ }
+
+ //if current tab then hide previous tab preview
+ if (tab==m_tabBar->currentIndex())
+ {
+ if ( m_previewPopup)
+ {
+ m_previewPopup->hide();
+ }
+ m_currentTabPreview=-1;
+ }
+
+ KTabWidget::mouseMoveEvent(event);
+}
+
+void MainView::leaveEvent(QEvent *event)
+{
+ //if leave tabwidget then hide previous tab preview
+ if ( m_previewPopup)
+ {
+ m_previewPopup->hide();
+ }
+ m_currentTabPreview=-1;
+ KTabWidget::leaveEvent(event);
+}
+
+QPixmap MainView::renderTabPreview(int tab, int w, int h)
+{
+ QPixmap image = QPixmap(webView(tab)->width(), webView(tab)->height());
+ image.fill(Qt::transparent);
+ QPainter p(&image);
+ webView(tab)->page()->mainFrame()->render(&p);
+ p.end();
+ image = image.scaled(w, h, Qt::KeepAspectRatioByExpanding);
+
+ return image;
+}
+
+void MainView::showTabPreview(int tab)
+{
+ int w=200;
+ int h=w*((0.0+webView(tab)->height())/webView(tab)->width());
+
+ //delete previous tab preview
+ if (m_previewPopup)
+ {
+ delete m_previewPopup;
+ }
+
+ m_previewPopup = new KPassivePopup(this);
+ m_previewPopup->setAutoDelete(true);
+ m_previewPopup->setFrameShape(QFrame::NoFrame);
+ m_previewPopup->setFixedSize(w, h);
+ QLabel *l = new QLabel();
+ l->setPixmap(renderTabPreview(tab, w, h));
+ m_previewPopup->setView(l);
+ m_previewPopup->layout()->setAlignment(Qt::AlignTop);
+ m_previewPopup->layout()->setMargin(0);
+
+ QPoint pos(m_tabBar->tabRect(tab).x(),m_tabBar->tabRect(tab).y()+m_tabBar->tabRect(tab).height());
+ m_previewPopup->show(mapToGlobal(pos));
+} \ No newline at end of file
diff --git a/src/mainview.h b/src/mainview.h
index 297871b0..cd212dbd 100644
--- a/src/mainview.h
+++ b/src/mainview.h
@@ -43,10 +43,12 @@
class QUrl;
class QWebFrame;
class QLabel;
+class QMouseEvent;
class TabBar;
class UrlBar;
+class KPassivePopup;
/**
* This class represent rekonq Main View. It contains all WebViews and a stack widget
@@ -90,7 +92,12 @@ public:
* @return the webview embedded in the new tab
*/
WebView *newWebView(bool focused = true, bool nearParent = false);
-
+
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void leaveEvent(QEvent *event);
+ void showTabPreview(int tab);
+ QPixmap renderTabPreview(int tab, int w, int h);
+
signals:
// tab widget signals
void tabsChanged();
@@ -162,6 +169,9 @@ private:
int m_currentTabIndex;
KUrl::List m_recentlyClosedTabs;
+
+ QPointer<KPassivePopup> m_previewPopup;
+ int m_currentTabPreview;
};
#endif // MAINVIEW_H