Wed, 01 Jan 2014 14:40:41 +0100
Updated copyright for 2014.
# -*- coding: utf-8 -*- # Copyright (c) 2010 - 2014 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing a specialized tab bar for the web browser. """ from PyQt4.QtCore import Qt, QPoint, QTimer, QEvent from PyQt4.QtGui import QFrame, QLabel from E5Gui.E5TabWidget import E5WheelTabBar from E5Gui.E5PassivePopup import E5PassivePopup from .HelpSnap import renderTabPreview import Preferences class HelpTabBar(E5WheelTabBar): """ Class implementing the tab bar of the web browser. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget (HelpTabWidget) """ E5WheelTabBar.__init__(self, parent) self.__tabWidget = parent self.__previewPopup = None self.__currentTabPreviewIndex = -1 self.setMouseTracking(True) def __showTabPreview(self): """ Private slot to show the tab preview. """ indexedBrowser = self.__tabWidget.browserAt(self.__currentTabPreviewIndex) currentBrowser = self.__tabWidget.currentBrowser() if indexedBrowser is None or currentBrowser is None: return # no previews during load if indexedBrowser.progress() != 0: return w = self.tabSizeHint(self.__currentTabPreviewIndex).width() h = int(w * currentBrowser.height() / currentBrowser.width()) self.__previewPopup = E5PassivePopup(self) self.__previewPopup.setFrameShape(QFrame.StyledPanel) self.__previewPopup.setFrameShadow(QFrame.Plain) self.__previewPopup.setFixedSize(w, h) l = QLabel() l.setPixmap(renderTabPreview(indexedBrowser.page(), w, h)) self.__previewPopup.setView(l) self.__previewPopup.layout().setAlignment(Qt.AlignTop) self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0) tr = self.tabRect(self.__currentTabPreviewIndex) pos = QPoint(tr.x(), tr.y() + tr.height()) self.__previewPopup.show(self.mapToGlobal(pos)) def mouseMoveEvent(self, evt): """ Protected method to handle mouse move events. @param reference to the mouse move event (QMouseEvent) """ if self.count() == 1: return E5WheelTabBar.mouseMoveEvent(self, evt) if Preferences.getHelp("ShowPreview"): # Find the tab under the mouse i = 0 tabIndex = -1 while i < self.count() and tabIndex == -1: if self.tabRect(i).contains(evt.pos()): tabIndex = i i += 1 # If found and not the current tab then show tab preview if tabIndex != -1 and \ tabIndex != self.currentIndex() and \ self.__currentTabPreviewIndex != tabIndex and \ evt.buttons() == Qt.NoButton: self.__currentTabPreviewIndex = tabIndex QTimer.singleShot(200, self.__showTabPreview) # If current tab or not found then hide previous tab preview if tabIndex == self.currentIndex() or \ tabIndex == -1: if self.__previewPopup is not None: self.__previewPopup.hide() self.__currentTabPreviewIndex = -1 def leaveEvent(self, evt): """ Protected method to handle leave events. @param evt reference to the leave event (QEvent) """ if Preferences.getHelp("ShowPreview"): # If leave tabwidget then hide previous tab preview if self.__previewPopup is not None: self.__previewPopup.hide() self.__currentTabPreviewIndex = -1 E5WheelTabBar.leaveEvent(self, evt) def mousePressEvent(self, evt): """ Protected method to handle mouse press events. @param evt reference to the mouse press event (QMouseEvent) """ if Preferences.getHelp("ShowPreview"): if self.__previewPopup is not None: self.__previewPopup.hide() self.__currentTabPreviewIndex = -1 E5WheelTabBar.mousePressEvent(self, evt) def event(self, evt): """ Protected method to handle event. This event handler just handles the tooltip event and passes the handling of all others to the superclass. @param evt reference to the event to be handled (QEvent) @return flag indicating, if the event was handled (boolean) """ if evt.type() == QEvent.ToolTip and \ Preferences.getHelp("ShowPreview"): # suppress tool tips if we are showing previews evt.setAccepted(True) return True return E5WheelTabBar.event(self, evt) def tabRemoved(self, index): """ Protected slot to handle the removal of a tab. @param index index of the removed tab (integer) """ if Preferences.getHelp("ShowPreview"): if self.__previewPopup is not None: self.__previewPopup.hide() self.__currentTabPreviewIndex = -1