E5Gui/E5MapWidget.py

changeset 3339
d0a603f1bfcd
parent 3329
1ee38e29ed4f
child 3484
645c12de6b0c
diff -r 49faa820151a -r d0a603f1bfcd E5Gui/E5MapWidget.py
--- a/E5Gui/E5MapWidget.py	Thu Mar 06 18:34:59 2014 +0100
+++ b/E5Gui/E5MapWidget.py	Thu Mar 06 19:17:09 2014 +0100
@@ -7,7 +7,7 @@
 Module implementing a base class for showing a document map.
 """
 
-from PyQt4.QtCore import Qt, QSize, QRect
+from PyQt4.QtCore import Qt, QSize, QRect, QCoreApplication
 from PyQt4.QtGui import QWidget, QAbstractScrollArea, QColor, QBrush, QPainter
 
 
@@ -28,8 +28,7 @@
         self.__lineBorder = 1
         self.__lineHeight = 2
         self.__backgroundColor = QColor("#e7e7e7")
-        self.__sliderBorderColor = QColor(Qt.black)
-        self.__sliderBackgroundColor = QColor(Qt.white)
+        self.__setSliderColor()
         
         self._master = None
         self.__enabled = False
@@ -37,6 +36,17 @@
         if parent is not None and isinstance(parent, QAbstractScrollArea):
             self.setMaster(parent)
     
+    def __setSliderColor(self):
+        """
+        Set the slider color depending upon the background color.
+        """
+        if self.__backgroundColor.toHsv().value() < 128:
+            # dark background, use white slider
+            self.__sliderColor = Qt.white
+        else:
+            # light background, use black slider
+            self.__sliderColor = Qt.black
+    
     def __updateMasterViewportWidth(self):
         """
         Private method to update the master's viewport width.
@@ -55,6 +65,7 @@
         @param master map master widget (QAbstractScrollArea)
         """
         self._master = master
+        self._master.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
         self._master.verticalScrollBar().valueChanged.connect(self.repaint)
         self.__updateMasterViewportWidth()
     
@@ -124,6 +135,7 @@
         """
         if color != self.__backgroundColor:
             self.__backgroundColor = color
+            self.__setSliderColor()
             self.update()
     
     def backgroundColor(self):
@@ -134,29 +146,6 @@
         """
         return QColor(self.__backgroundColor)
     
-    def setSliderColors(self, border, background):
-        """
-        Public method to set the slider colors.
-        
-        @param border border color (QColor)
-        @param background background color (QColor)
-        """
-        if border != self.__sliderBorderColor or \
-                background != self.__sliderBackgroundColor:
-            self.__sliderBorderColor = border
-            self.__sliderBackgroundColor = background
-            self.update()
-    
-    def sliderColors(self):
-        """
-        Public method to get the slider colors.
-        
-        @return tuple with the slider's border color (QColor) and
-            background color (QColor)
-        """
-        return (QColor(self.__sliderBorderColor),
-                QColor(self.__sliderBackgroundColor))
-    
     def sizeHint(self):
         """
         Public method to give an indication about the preferred size.
@@ -180,11 +169,9 @@
         
         # step 3: paint the slider
         if self._master:
-            penColor = self.__sliderBorderColor
-            penColor.setAlphaF(0.8)
+            penColor = self.__sliderColor
             painter.setPen(penColor)
-            brushColor = self.__sliderBackgroundColor
-            brushColor.setAlphaF(0.5)
+            brushColor = Qt.transparent
             painter.setBrush(QBrush(brushColor))
             painter.drawRect(self.__generateSliderRange(
                 self._master.verticalScrollBar()))
@@ -199,20 +186,39 @@
         """
         pass
     
-    def mouseReleaseEvent(self, event):
+    def mousePressEvent(self, event):
         """
-        Protected method to handle a mouse button release.
+        Protected method to handle a mouse button press.
         
-        @param event mouse event (QMouseEvent)
+        @param event reference to the mouse event (QMouseEvent)
         """
         if event.button() == Qt.LeftButton and self._master:
             vsb = self._master.verticalScrollBar()
             value = self.position2Value(event.pos().y() - 1)
             vsb.setValue(value - 0.5 * vsb.pageStep())  # center on page
+        self.__mousePressPos = None
     
-    # TODO: add support for dragging the slider
+    def mouseMoveEvent(self, event):
+        """
+        Protected method to handle a mouse moves.
+        
+        @param event reference to the mouse event (QMouseEvent)
+        """
+        if event.buttons() & Qt.LeftButton and self._master:
+            vsb = self._master.verticalScrollBar()
+            value = self.position2Value(event.pos().y() - 1)
+            vsb.setValue(value - 0.5 * vsb.pageStep())  # center on page
     
-    # TODO: add support for mouse wheel
+    def wheelEvent(self, event):
+        """
+        Protected slot handling mouse wheel events.
+        
+        @param event reference to the wheel event (QWheelEvent)
+        """
+        if self._master and \
+            event.modifiers() == Qt.NoModifier and \
+                event.orientation() == Qt.Vertical:
+            QCoreApplication.sendEvent(self._master.verticalScrollBar(), event)
     
     def calculateGeometry(self):
         """

eric ide

mercurial