Added support for wheel events and mouse move events to the map widget and made some adjustments to the representation (colors).

Thu, 06 Mar 2014 19:17:09 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 06 Mar 2014 19:17:09 +0100
changeset 3339
d0a603f1bfcd
parent 3337
49faa820151a
child 3340
05bea6fa0845

Added support for wheel events and mouse move events to the map widget and made some adjustments to the representation (colors).

Documentation/Source/eric5.E5Gui.E5MapWidget.html file | annotate | diff | comparison | revisions
E5Gui/E5MapWidget.py file | annotate | diff | comparison | revisions
QScintilla/EditorMarkerMap.py file | annotate | diff | comparison | revisions
--- a/Documentation/Source/eric5.E5Gui.E5MapWidget.html	Thu Mar 06 18:34:59 2014 +0100
+++ b/Documentation/Source/eric5.E5Gui.E5MapWidget.html	Thu Mar 06 19:17:09 2014 +0100
@@ -63,6 +63,9 @@
 <td><a href="#E5MapWidget.__generateSliderRange">__generateSliderRange</a></td>
 <td>Private method to generate the slider rectangle.</td>
 </tr><tr>
+<td><a href="#E5MapWidget.__setSliderColor">__setSliderColor</a></td>
+<td>Set the slider color depending upon the background color.</td>
+</tr><tr>
 <td><a href="#E5MapWidget.__updateMasterViewportWidth">__updateMasterViewportWidth</a></td>
 <td>Private method to update the master's viewport width.</td>
 </tr><tr>
@@ -84,8 +87,11 @@
 <td><a href="#E5MapWidget.lineDimensions">lineDimensions</a></td>
 <td>Public method to get the line (indicator) dimensions.</td>
 </tr><tr>
-<td><a href="#E5MapWidget.mouseReleaseEvent">mouseReleaseEvent</a></td>
-<td>Protected method to handle a mouse button release.</td>
+<td><a href="#E5MapWidget.mouseMoveEvent">mouseMoveEvent</a></td>
+<td>Protected method to handle a mouse moves.</td>
+</tr><tr>
+<td><a href="#E5MapWidget.mousePressEvent">mousePressEvent</a></td>
+<td>Protected method to handle a mouse button press.</td>
 </tr><tr>
 <td><a href="#E5MapWidget.paintEvent">paintEvent</a></td>
 <td>Protected method to handle a paint event.</td>
@@ -108,21 +114,18 @@
 <td><a href="#E5MapWidget.setMaster">setMaster</a></td>
 <td>Public method to set the map master widget.</td>
 </tr><tr>
-<td><a href="#E5MapWidget.setSliderColors">setSliderColors</a></td>
-<td>Public method to set the slider colors.</td>
-</tr><tr>
 <td><a href="#E5MapWidget.setWidth">setWidth</a></td>
 <td>Public method to set the widget width.</td>
 </tr><tr>
 <td><a href="#E5MapWidget.sizeHint">sizeHint</a></td>
 <td>Public method to give an indication about the preferred size.</td>
 </tr><tr>
-<td><a href="#E5MapWidget.sliderColors">sliderColors</a></td>
-<td>Public method to get the slider colors.</td>
-</tr><tr>
 <td><a href="#E5MapWidget.value2Position">value2Position</a></td>
 <td>Public method to convert a scrollbar value into a position.</td>
 </tr><tr>
+<td><a href="#E5MapWidget.wheelEvent">wheelEvent</a></td>
+<td>Protected slot handling mouse wheel events.</td>
+</tr><tr>
 <td><a href="#E5MapWidget.width">width</a></td>
 <td>Public method to get the widget's width.</td>
 </tr>
@@ -156,7 +159,12 @@
 <dd>
 slider rectangle (QRect)
 </dd>
-</dl><a NAME="E5MapWidget.__updateMasterViewportWidth" ID="E5MapWidget.__updateMasterViewportWidth"></a>
+</dl><a NAME="E5MapWidget.__setSliderColor" ID="E5MapWidget.__setSliderColor"></a>
+<h4>E5MapWidget.__setSliderColor</h4>
+<b>__setSliderColor</b>(<i></i>)
+<p>
+        Set the slider color depending upon the background color.
+</p><a NAME="E5MapWidget.__updateMasterViewportWidth" ID="E5MapWidget.__updateMasterViewportWidth"></a>
 <h4>E5MapWidget.__updateMasterViewportWidth</h4>
 <b>__updateMasterViewportWidth</b>(<i></i>)
 <p>
@@ -223,15 +231,25 @@
 <dd>
 tuple with border width (integer) and line height (integer)
 </dd>
-</dl><a NAME="E5MapWidget.mouseReleaseEvent" ID="E5MapWidget.mouseReleaseEvent"></a>
-<h4>E5MapWidget.mouseReleaseEvent</h4>
-<b>mouseReleaseEvent</b>(<i>event</i>)
+</dl><a NAME="E5MapWidget.mouseMoveEvent" ID="E5MapWidget.mouseMoveEvent"></a>
+<h4>E5MapWidget.mouseMoveEvent</h4>
+<b>mouseMoveEvent</b>(<i>event</i>)
 <p>
-        Protected method to handle a mouse button release.
+        Protected method to handle a mouse moves.
 </p><dl>
 <dt><i>event</i></dt>
 <dd>
-mouse event (QMouseEvent)
+reference to the mouse event (QMouseEvent)
+</dd>
+</dl><a NAME="E5MapWidget.mousePressEvent" ID="E5MapWidget.mousePressEvent"></a>
+<h4>E5MapWidget.mousePressEvent</h4>
+<b>mousePressEvent</b>(<i>event</i>)
+<p>
+        Protected method to handle a mouse button press.
+</p><dl>
+<dt><i>event</i></dt>
+<dd>
+reference to the mouse event (QMouseEvent)
 </dd>
 </dl><a NAME="E5MapWidget.paintEvent" ID="E5MapWidget.paintEvent"></a>
 <h4>E5MapWidget.paintEvent</h4>
@@ -321,19 +339,6 @@
 <dd>
 map master widget (QAbstractScrollArea)
 </dd>
-</dl><a NAME="E5MapWidget.setSliderColors" ID="E5MapWidget.setSliderColors"></a>
-<h4>E5MapWidget.setSliderColors</h4>
-<b>setSliderColors</b>(<i>border, background</i>)
-<p>
-        Public method to set the slider colors.
-</p><dl>
-<dt><i>border</i></dt>
-<dd>
-border color (QColor)
-</dd><dt><i>background</i></dt>
-<dd>
-background color (QColor)
-</dd>
 </dl><a NAME="E5MapWidget.setWidth" ID="E5MapWidget.setWidth"></a>
 <h4>E5MapWidget.setWidth</h4>
 <b>setWidth</b>(<i>width</i>)
@@ -354,17 +359,6 @@
 <dd>
 preferred size (QSize)
 </dd>
-</dl><a NAME="E5MapWidget.sliderColors" ID="E5MapWidget.sliderColors"></a>
-<h4>E5MapWidget.sliderColors</h4>
-<b>sliderColors</b>(<i></i>)
-<p>
-        Public method to get the slider colors.
-</p><dl>
-<dt>Returns:</dt>
-<dd>
-tuple with the slider's border color (QColor) and
-            background color (QColor)
-</dd>
 </dl><a NAME="E5MapWidget.value2Position" ID="E5MapWidget.value2Position"></a>
 <h4>E5MapWidget.value2Position</h4>
 <b>value2Position</b>(<i>value, slider=False</i>)
@@ -384,6 +378,16 @@
 <dd>
 position (integer)
 </dd>
+</dl><a NAME="E5MapWidget.wheelEvent" ID="E5MapWidget.wheelEvent"></a>
+<h4>E5MapWidget.wheelEvent</h4>
+<b>wheelEvent</b>(<i>event</i>)
+<p>
+        Protected slot handling mouse wheel events.
+</p><dl>
+<dt><i>event</i></dt>
+<dd>
+reference to the wheel event (QWheelEvent)
+</dd>
 </dl><a NAME="E5MapWidget.width" ID="E5MapWidget.width"></a>
 <h4>E5MapWidget.width</h4>
 <b>width</b>(<i></i>)
--- 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):
         """
--- a/QScintilla/EditorMarkerMap.py	Thu Mar 06 18:34:59 2014 +0100
+++ b/QScintilla/EditorMarkerMap.py	Thu Mar 06 19:17:09 2014 +0100
@@ -44,7 +44,7 @@
         @param color color to be used (QColor)
         """
         position = self.value2Position(line)
-        painter.setPen(color.darker(120))
+        painter.setPen(color)
         painter.setBrush(color)
         painter.drawRect(self.generateIndicatorRect(position))
     

eric ide

mercurial