E5Gui/E5MapWidget.py

changeset 3329
1ee38e29ed4f
parent 3327
1338767b5315
child 3339
d0a603f1bfcd
--- a/E5Gui/E5MapWidget.py	Wed Mar 05 18:40:12 2014 +0100
+++ b/E5Gui/E5MapWidget.py	Wed Mar 05 19:52:15 2014 +0100
@@ -24,14 +24,14 @@
         super().__init__(parent)
         self.setAttribute(Qt.WA_OpaquePaintEvent)
         
-        self.__width = 12
-        self.__lineBorder = 2
+        self.__width = 14
+        self.__lineBorder = 1
         self.__lineHeight = 2
-        self.__backgroundColor = QColor(Qt.lightGray).lighter(120)
+        self.__backgroundColor = QColor("#e7e7e7")
         self.__sliderBorderColor = QColor(Qt.black)
         self.__sliderBackgroundColor = QColor(Qt.white)
         
-        self.__master = None
+        self._master = None
         self.__enabled = False
         
         if parent is not None and isinstance(parent, QAbstractScrollArea):
@@ -41,12 +41,12 @@
         """
         Private method to update the master's viewport width.
         """
-        if self.__master:
+        if self._master:
             if self.__enabled:
                 width = self.__width
             else:
                 width = 0
-            self.__master.setViewportMargins(0, 0, width, 0)
+            self._master.setViewportMargins(0, 0, width, 0)
     
     def setMaster(self, master):
         """
@@ -54,8 +54,8 @@
         
         @param master map master widget (QAbstractScrollArea)
         """
-        self.__master = master
-        self.__master.verticalScrollBar().valueChanged.connect(self.repaint)
+        self._master = master
+        self._master.verticalScrollBar().valueChanged.connect(self.repaint)
         self.__updateMasterViewportWidth()
     
     def setWidth(self, width):
@@ -64,7 +64,10 @@
         
         @param width widget width (integer)
         """
-        self.__width = width
+        if width != self.__width:
+            self.__width = max(6, width)    # minimum width 6 pixels
+            self.__updateMasterViewportWidth()
+            self.update()
     
     def width(self):
         """
@@ -81,8 +84,10 @@
         @param border border width on each side in x-direction (integer)
         @param height height of the line in pixels (integer)
         """
-        self.__lineBorder = border
-        self.__lineHeight = max(2, height)  # min height is 2 pixels
+        if border != self.__lineBorder or height != self.__lineHeight:
+            self.__lineBorder = max(1, border)  # min border 1 pixel
+            self.__lineHeight = max(1, height)  # min height 1 pixel
+            self.update()
     
     def lineDimensions(self):
         """
@@ -98,9 +103,10 @@
         
         @param enable flag indicating the enabled state (boolean)
         """
-        self.__enabled = enable
-        self.setVisible(enable)
-        self.__updateMasterViewportWidth()
+        if enable != self.__enabled:
+            self.__enabled = enable
+            self.setVisible(enable)
+            self.__updateMasterViewportWidth()
     
     def isEnabled(self):
         """
@@ -116,7 +122,9 @@
         
         @param color color for the background (QColor)
         """
-        self.__backgroundColor = color
+        if color != self.__backgroundColor:
+            self.__backgroundColor = color
+            self.update()
     
     def backgroundColor(self):
         """
@@ -133,8 +141,11 @@
         @param border border color (QColor)
         @param background background color (QColor)
         """
-        self.__sliderBorderColor = border
-        self.__sliderBackgroundColor = background
+        if border != self.__sliderBorderColor or \
+                background != self.__sliderBackgroundColor:
+            self.__sliderBorderColor = border
+            self.__sliderBackgroundColor = background
+            self.update()
     
     def sliderColors(self):
         """
@@ -168,7 +179,7 @@
         self._paintIt(painter)
         
         # step 3: paint the slider
-        if self.__master:
+        if self._master:
             penColor = self.__sliderBorderColor
             penColor.setAlphaF(0.8)
             painter.setPen(penColor)
@@ -176,7 +187,7 @@
             brushColor.setAlphaF(0.5)
             painter.setBrush(QBrush(brushColor))
             painter.drawRect(self.__generateSliderRange(
-                self.__master.verticalScrollBar()))
+                self._master.verticalScrollBar()))
     
     def _paintIt(self, painter):
         """
@@ -188,29 +199,33 @@
         """
         pass
     
-    def mousePressEvent(self, event):
+    def mouseReleaseEvent(self, event):
         """
-        Protected method to handle a mouse button press.
+        Protected method to handle a mouse button release.
         
         @param event mouse event (QMouseEvent)
         """
-        if event.button() == Qt.LeftButton and self.__master:
-            vsb = self.__master.verticalScrollBar()
+        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
     
+    # TODO: add support for dragging the slider
+    
+    # TODO: add support for mouse wheel
+    
     def calculateGeometry(self):
         """
         Public method to recalculate the map widget's geometry.
         """
-        if self.__master:
-            cr = self.__master.contentsRect()
-            vsb = self.__master.verticalScrollBar()
+        if self._master:
+            cr = self._master.contentsRect()
+            vsb = self._master.verticalScrollBar()
             if vsb.isVisible():
                 vsbw = vsb.contentsRect().width()
             else:
                 vsbw = 0
-            left, top, right, bottom = self.__master.getContentsMargins()
+            left, top, right, bottom = self._master.getContentsMargins()
             if right > vsbw:
                 vsbw = 0
             self.setGeometry(QRect(cr.right() - self.__width - vsbw, cr.top(),
@@ -224,9 +239,9 @@
             (boolean)
         @return scale factor (float)
         """
-        if self.__master:
+        if self._master:
             delta = 0 if slider else 2
-            vsb = self.__master.verticalScrollBar()
+            vsb = self._master.verticalScrollBar()
             posHeight = vsb.height() - delta - 1
             valHeight = vsb.maximum() - vsb.minimum() + vsb.pageStep()
             return posHeight / valHeight
@@ -242,9 +257,9 @@
             (boolean)
         @return position (integer)
         """
-        if self.__master:
+        if self._master:
             offset = 0 if slider else 1
-            vsb = self.__master.verticalScrollBar()
+            vsb = self._master.verticalScrollBar()
             return (value - vsb.minimum()) * self.scaleFactor(slider) + offset
         else:
             return value
@@ -258,9 +273,9 @@
             (boolean)
         @return scrollbar value (integer)
         """
-        if self.__master:
+        if self._master:
             offset = 0 if slider else 1
-            vsb = self.__master.verticalScrollBar()
+            vsb = self._master.verticalScrollBar()
             return vsb.minimum() + max(
                 0, (position - offset) / self.scaleFactor(slider))
         else:
@@ -286,5 +301,4 @@
         pos1 = self.value2Position(scrollbar.value(), slider=True)
         pos2 = self.value2Position(scrollbar.value() + scrollbar.pageStep(),
                                    slider=True)
-        return QRect(1, pos1, self.__width - 2, pos2 - pos1 + 1)
-        # TODO: check slider appearance and adjust to self.__width
+        return QRect(0, pos1, self.__width - 1, pos2 - pos1)

eric ide

mercurial