E5Gui/E5MapWidget.py

changeset 3339
d0a603f1bfcd
parent 3329
1ee38e29ed4f
child 3484
645c12de6b0c
equal deleted inserted replaced
3337:49faa820151a 3339:d0a603f1bfcd
5 5
6 """ 6 """
7 Module implementing a base class for showing a document map. 7 Module implementing a base class for showing a document map.
8 """ 8 """
9 9
10 from PyQt4.QtCore import Qt, QSize, QRect 10 from PyQt4.QtCore import Qt, QSize, QRect, QCoreApplication
11 from PyQt4.QtGui import QWidget, QAbstractScrollArea, QColor, QBrush, QPainter 11 from PyQt4.QtGui import QWidget, QAbstractScrollArea, QColor, QBrush, QPainter
12 12
13 13
14 class E5MapWidget(QWidget): 14 class E5MapWidget(QWidget):
15 """ 15 """
26 26
27 self.__width = 14 27 self.__width = 14
28 self.__lineBorder = 1 28 self.__lineBorder = 1
29 self.__lineHeight = 2 29 self.__lineHeight = 2
30 self.__backgroundColor = QColor("#e7e7e7") 30 self.__backgroundColor = QColor("#e7e7e7")
31 self.__sliderBorderColor = QColor(Qt.black) 31 self.__setSliderColor()
32 self.__sliderBackgroundColor = QColor(Qt.white)
33 32
34 self._master = None 33 self._master = None
35 self.__enabled = False 34 self.__enabled = False
36 35
37 if parent is not None and isinstance(parent, QAbstractScrollArea): 36 if parent is not None and isinstance(parent, QAbstractScrollArea):
38 self.setMaster(parent) 37 self.setMaster(parent)
38
39 def __setSliderColor(self):
40 """
41 Set the slider color depending upon the background color.
42 """
43 if self.__backgroundColor.toHsv().value() < 128:
44 # dark background, use white slider
45 self.__sliderColor = Qt.white
46 else:
47 # light background, use black slider
48 self.__sliderColor = Qt.black
39 49
40 def __updateMasterViewportWidth(self): 50 def __updateMasterViewportWidth(self):
41 """ 51 """
42 Private method to update the master's viewport width. 52 Private method to update the master's viewport width.
43 """ 53 """
53 Public method to set the map master widget. 63 Public method to set the map master widget.
54 64
55 @param master map master widget (QAbstractScrollArea) 65 @param master map master widget (QAbstractScrollArea)
56 """ 66 """
57 self._master = master 67 self._master = master
68 self._master.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
58 self._master.verticalScrollBar().valueChanged.connect(self.repaint) 69 self._master.verticalScrollBar().valueChanged.connect(self.repaint)
59 self.__updateMasterViewportWidth() 70 self.__updateMasterViewportWidth()
60 71
61 def setWidth(self, width): 72 def setWidth(self, width):
62 """ 73 """
122 133
123 @param color color for the background (QColor) 134 @param color color for the background (QColor)
124 """ 135 """
125 if color != self.__backgroundColor: 136 if color != self.__backgroundColor:
126 self.__backgroundColor = color 137 self.__backgroundColor = color
138 self.__setSliderColor()
127 self.update() 139 self.update()
128 140
129 def backgroundColor(self): 141 def backgroundColor(self):
130 """ 142 """
131 Public method to get the background color. 143 Public method to get the background color.
132 144
133 @return background color (QColor) 145 @return background color (QColor)
134 """ 146 """
135 return QColor(self.__backgroundColor) 147 return QColor(self.__backgroundColor)
136
137 def setSliderColors(self, border, background):
138 """
139 Public method to set the slider colors.
140
141 @param border border color (QColor)
142 @param background background color (QColor)
143 """
144 if border != self.__sliderBorderColor or \
145 background != self.__sliderBackgroundColor:
146 self.__sliderBorderColor = border
147 self.__sliderBackgroundColor = background
148 self.update()
149
150 def sliderColors(self):
151 """
152 Public method to get the slider colors.
153
154 @return tuple with the slider's border color (QColor) and
155 background color (QColor)
156 """
157 return (QColor(self.__sliderBorderColor),
158 QColor(self.__sliderBackgroundColor))
159 148
160 def sizeHint(self): 149 def sizeHint(self):
161 """ 150 """
162 Public method to give an indication about the preferred size. 151 Public method to give an indication about the preferred size.
163 152
178 # step 2: paint the indicators 167 # step 2: paint the indicators
179 self._paintIt(painter) 168 self._paintIt(painter)
180 169
181 # step 3: paint the slider 170 # step 3: paint the slider
182 if self._master: 171 if self._master:
183 penColor = self.__sliderBorderColor 172 penColor = self.__sliderColor
184 penColor.setAlphaF(0.8)
185 painter.setPen(penColor) 173 painter.setPen(penColor)
186 brushColor = self.__sliderBackgroundColor 174 brushColor = Qt.transparent
187 brushColor.setAlphaF(0.5)
188 painter.setBrush(QBrush(brushColor)) 175 painter.setBrush(QBrush(brushColor))
189 painter.drawRect(self.__generateSliderRange( 176 painter.drawRect(self.__generateSliderRange(
190 self._master.verticalScrollBar())) 177 self._master.verticalScrollBar()))
191 178
192 def _paintIt(self, painter): 179 def _paintIt(self, painter):
197 184
198 @param painter reference to the painter object (QPainter) 185 @param painter reference to the painter object (QPainter)
199 """ 186 """
200 pass 187 pass
201 188
202 def mouseReleaseEvent(self, event): 189 def mousePressEvent(self, event):
203 """ 190 """
204 Protected method to handle a mouse button release. 191 Protected method to handle a mouse button press.
205 192
206 @param event mouse event (QMouseEvent) 193 @param event reference to the mouse event (QMouseEvent)
207 """ 194 """
208 if event.button() == Qt.LeftButton and self._master: 195 if event.button() == Qt.LeftButton and self._master:
209 vsb = self._master.verticalScrollBar() 196 vsb = self._master.verticalScrollBar()
210 value = self.position2Value(event.pos().y() - 1) 197 value = self.position2Value(event.pos().y() - 1)
211 vsb.setValue(value - 0.5 * vsb.pageStep()) # center on page 198 vsb.setValue(value - 0.5 * vsb.pageStep()) # center on page
212 199 self.__mousePressPos = None
213 # TODO: add support for dragging the slider 200
214 201 def mouseMoveEvent(self, event):
215 # TODO: add support for mouse wheel 202 """
203 Protected method to handle a mouse moves.
204
205 @param event reference to the mouse event (QMouseEvent)
206 """
207 if event.buttons() & Qt.LeftButton and self._master:
208 vsb = self._master.verticalScrollBar()
209 value = self.position2Value(event.pos().y() - 1)
210 vsb.setValue(value - 0.5 * vsb.pageStep()) # center on page
211
212 def wheelEvent(self, event):
213 """
214 Protected slot handling mouse wheel events.
215
216 @param event reference to the wheel event (QWheelEvent)
217 """
218 if self._master and \
219 event.modifiers() == Qt.NoModifier and \
220 event.orientation() == Qt.Vertical:
221 QCoreApplication.sendEvent(self._master.verticalScrollBar(), event)
216 222
217 def calculateGeometry(self): 223 def calculateGeometry(self):
218 """ 224 """
219 Public method to recalculate the map widget's geometry. 225 Public method to recalculate the map widget's geometry.
220 """ 226 """

eric ide

mercurial