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 """ |