From 87243819be1b5d3ffa6997d97beea48e86b2b39d Mon Sep 17 00:00:00 2001 From: megabigbug Date: Sat, 19 Sep 2009 21:20:28 +0200 Subject: Show a preview when mouse is over a tab --- src/mainview.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/mainview.h | 12 +++++++- 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 #include #include +#include // Qt Includes #include @@ -62,17 +63,22 @@ #include #include #include - +#include +#include 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 (itabRect(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 m_previewPopup; + int m_currentTabPreview; }; #endif // MAINVIEW_H -- cgit v1.2.1