14 |
14 |
15 |
15 |
16 class EricZoomWidget(QWidget, Ui_EricZoomWidget): |
16 class EricZoomWidget(QWidget, Ui_EricZoomWidget): |
17 """ |
17 """ |
18 Class implementing a zoom widget for the status bar. |
18 Class implementing a zoom widget for the status bar. |
19 |
19 |
20 @signal valueChanged(value) emitted to indicate the new zoom value (int) |
20 @signal valueChanged(value) emitted to indicate the new zoom value (int) |
21 """ |
21 """ |
|
22 |
22 valueChanged = pyqtSignal(int) |
23 valueChanged = pyqtSignal(int) |
23 |
24 |
24 def __init__(self, outPix, inPix, resetPix, parent=None): |
25 def __init__(self, outPix, inPix, resetPix, parent=None): |
25 """ |
26 """ |
26 Constructor |
27 Constructor |
27 |
28 |
28 @param outPix pixmap for the zoom out button (QPixmap) |
29 @param outPix pixmap for the zoom out button (QPixmap) |
29 @param inPix pixmap for the zoom in button (QPixmap) |
30 @param inPix pixmap for the zoom in button (QPixmap) |
30 @param resetPix pixmap for the zoom reset button (QPixmap) |
31 @param resetPix pixmap for the zoom reset button (QPixmap) |
31 @param parent reference to the parent widget (QWidget) |
32 @param parent reference to the parent widget (QWidget) |
32 """ |
33 """ |
33 super().__init__(parent) |
34 super().__init__(parent) |
34 self.setupUi(self) |
35 self.setupUi(self) |
35 |
36 |
36 self.zoomOutLabel.setPixmap(outPix.scaled(16, 16)) |
37 self.zoomOutLabel.setPixmap(outPix.scaled(16, 16)) |
37 self.zoomInLabel.setPixmap(inPix.scaled(16, 16)) |
38 self.zoomInLabel.setPixmap(inPix.scaled(16, 16)) |
38 self.zoomResetLabel.setPixmap(resetPix.scaled(16, 16)) |
39 self.zoomResetLabel.setPixmap(resetPix.scaled(16, 16)) |
39 |
40 |
40 self.zoomOutLabel.clicked.connect(self.__zoomOut) |
41 self.zoomOutLabel.clicked.connect(self.__zoomOut) |
41 self.zoomInLabel.clicked.connect(self.__zoomIn) |
42 self.zoomInLabel.clicked.connect(self.__zoomIn) |
42 self.zoomResetLabel.clicked.connect(self.__zoomReset) |
43 self.zoomResetLabel.clicked.connect(self.__zoomReset) |
43 |
44 |
44 self.slider.valueChanged.connect(self._sliderValueChanged) |
45 self.slider.valueChanged.connect(self._sliderValueChanged) |
45 |
46 |
46 self.__default = 0 |
47 self.__default = 0 |
47 self.__percent = False |
48 self.__percent = False |
48 |
49 |
49 # mapped slider |
50 # mapped slider |
50 self.__mapped = False |
51 self.__mapped = False |
51 self.__mapping = [] |
52 self.__mapping = [] |
52 |
53 |
53 self.__setValueLabelWidth() |
54 self.__setValueLabelWidth() |
54 |
55 |
55 @pyqtSlot(int) |
56 @pyqtSlot(int) |
56 def on_slider_sliderMoved(self, value): |
57 def on_slider_sliderMoved(self, value): |
57 """ |
58 """ |
58 Private slot to handle changes of the zoom value. |
59 Private slot to handle changes of the zoom value. |
59 |
60 |
60 @param value value of the slider (integer) |
61 @param value value of the slider (integer) |
61 """ |
62 """ |
62 if self.__mapped: |
63 if self.__mapped: |
63 self.valueChanged.emit(self.__mapping[value]) |
64 self.valueChanged.emit(self.__mapping[value]) |
64 else: |
65 else: |
65 self.valueChanged.emit(value) |
66 self.valueChanged.emit(value) |
66 |
67 |
67 def setValue(self, value): |
68 def setValue(self, value): |
68 """ |
69 """ |
69 Public slot to set the value. |
70 Public slot to set the value. |
70 |
71 |
71 @param value new zoom value (integer) |
72 @param value new zoom value (integer) |
72 """ |
73 """ |
73 self.slider.setValue(self.__indexForValue(value)) |
74 self.slider.setValue(self.__indexForValue(value)) |
74 |
75 |
75 def value(self): |
76 def value(self): |
76 """ |
77 """ |
77 Public method to get the current value. |
78 Public method to get the current value. |
78 |
79 |
79 @return current zoom value (integer) |
80 @return current zoom value (integer) |
80 """ |
81 """ |
81 if self.__mapped: |
82 if self.__mapped: |
82 return self.__mapping[self.slider.value()] |
83 return self.__mapping[self.slider.value()] |
83 else: |
84 else: |
84 return self.slider.value() |
85 return self.slider.value() |
85 |
86 |
86 def setMinimum(self, minimum): |
87 def setMinimum(self, minimum): |
87 """ |
88 """ |
88 Public method to set the minimum value. |
89 Public method to set the minimum value. |
89 |
90 |
90 @param minimum new minimum value (integer) |
91 @param minimum new minimum value (integer) |
91 """ |
92 """ |
92 if not self.__mapped: |
93 if not self.__mapped: |
93 self.slider.setMinimum(minimum) |
94 self.slider.setMinimum(minimum) |
94 self.__setValueLabelWidth() |
95 self.__setValueLabelWidth() |
95 |
96 |
96 def minimum(self): |
97 def minimum(self): |
97 """ |
98 """ |
98 Public method to get the minimum value. |
99 Public method to get the minimum value. |
99 |
100 |
100 @return minimum value (integer) |
101 @return minimum value (integer) |
101 """ |
102 """ |
102 if self.__mapped: |
103 if self.__mapped: |
103 return self.__mapping[0] |
104 return self.__mapping[0] |
104 else: |
105 else: |
105 return self.slider.minimum() |
106 return self.slider.minimum() |
106 |
107 |
107 def setMaximum(self, maximum): |
108 def setMaximum(self, maximum): |
108 """ |
109 """ |
109 Public method to set the maximum value. |
110 Public method to set the maximum value. |
110 |
111 |
111 @param maximum new maximum value (integer) |
112 @param maximum new maximum value (integer) |
112 """ |
113 """ |
113 if not self.__mapped: |
114 if not self.__mapped: |
114 self.slider.setMaximum(maximum) |
115 self.slider.setMaximum(maximum) |
115 self.__setValueLabelWidth() |
116 self.__setValueLabelWidth() |
116 |
117 |
117 def maximum(self): |
118 def maximum(self): |
118 """ |
119 """ |
119 Public method to get the maximum value. |
120 Public method to get the maximum value. |
120 |
121 |
121 @return maximum value (integer) |
122 @return maximum value (integer) |
122 """ |
123 """ |
123 if self.__mapped: |
124 if self.__mapped: |
124 return self.__mapping[-1] |
125 return self.__mapping[-1] |
125 else: |
126 else: |
126 return self.slider.maximum() |
127 return self.slider.maximum() |
127 |
128 |
128 def setSingleStep(self, value): |
129 def setSingleStep(self, value): |
129 """ |
130 """ |
130 Public method to set the single step value. |
131 Public method to set the single step value. |
131 |
132 |
132 @param value value for the single step (integer) |
133 @param value value for the single step (integer) |
133 """ |
134 """ |
134 self.slider.setSingleStep(value) |
135 self.slider.setSingleStep(value) |
135 |
136 |
136 def singleStep(self): |
137 def singleStep(self): |
137 """ |
138 """ |
138 Public method to get the single step value. |
139 Public method to get the single step value. |
139 |
140 |
140 @return single step value (integer) |
141 @return single step value (integer) |
141 """ |
142 """ |
142 return self.slider.singleStep() |
143 return self.slider.singleStep() |
143 |
144 |
144 def setPageStep(self, value): |
145 def setPageStep(self, value): |
145 """ |
146 """ |
146 Public method to set the page step value. |
147 Public method to set the page step value. |
147 |
148 |
148 @param value page step value (integer) |
149 @param value page step value (integer) |
149 """ |
150 """ |
150 self.slider.setPageStep(value) |
151 self.slider.setPageStep(value) |
151 |
152 |
152 def pageStep(self): |
153 def pageStep(self): |
153 """ |
154 """ |
154 Public method to get the page step value. |
155 Public method to get the page step value. |
155 |
156 |
156 @return page step value (integer) |
157 @return page step value (integer) |
157 """ |
158 """ |
158 return self.slider.pageStep() |
159 return self.slider.pageStep() |
159 |
160 |
160 def setDefault(self, value): |
161 def setDefault(self, value): |
161 """ |
162 """ |
162 Public method to set the default zoom value. |
163 Public method to set the default zoom value. |
163 |
164 |
164 @param value default zoom value (integer) |
165 @param value default zoom value (integer) |
165 """ |
166 """ |
166 self.__default = self.__indexForValue(value) |
167 self.__default = self.__indexForValue(value) |
167 |
168 |
168 def default(self): |
169 def default(self): |
169 """ |
170 """ |
170 Public method to get the default zoom value. |
171 Public method to get the default zoom value. |
171 |
172 |
172 @return default zoom value (integer) |
173 @return default zoom value (integer) |
173 """ |
174 """ |
174 if self.__mapped: |
175 if self.__mapped: |
175 return self.__mapping[self.__default] |
176 return self.__mapping[self.__default] |
176 else: |
177 else: |
177 return self.__default |
178 return self.__default |
178 |
179 |
179 def setPercent(self, on): |
180 def setPercent(self, on): |
180 """ |
181 """ |
181 Public method to set the percent mode of the widget. |
182 Public method to set the percent mode of the widget. |
182 |
183 |
183 @param on flag indicating percent mode (boolean) |
184 @param on flag indicating percent mode (boolean) |
184 """ |
185 """ |
185 self.__percent = on |
186 self.__percent = on |
186 self.__setValueLabelWidth() |
187 self.__setValueLabelWidth() |
187 |
188 |
188 def isPercent(self): |
189 def isPercent(self): |
189 """ |
190 """ |
190 Public method to get the percent mode. |
191 Public method to get the percent mode. |
191 |
192 |
192 @return flag indicating percent mode (boolean) |
193 @return flag indicating percent mode (boolean) |
193 """ |
194 """ |
194 return self.__percent |
195 return self.__percent |
195 |
196 |
196 def setMapping(self, mapping, default, percent=True): |
197 def setMapping(self, mapping, default, percent=True): |
197 """ |
198 """ |
198 Public method to set a zoom level mapping. |
199 Public method to set a zoom level mapping. |
199 |
200 |
200 When zoom level mapping is activated, the slider covers |
201 When zoom level mapping is activated, the slider covers |
201 values from 0 to the max. index of the mapping list. The |
202 values from 0 to the max. index of the mapping list. The |
202 default value is the value of the default zoom level. If |
203 default value is the value of the default zoom level. If |
203 percent is given, the zoom level is shown as a percent value. |
204 percent is given, the zoom level is shown as a percent value. |
204 |
205 |
205 @param mapping list of mapping values (list of integer) |
206 @param mapping list of mapping values (list of integer) |
206 @param default index of the default value (integer) |
207 @param default index of the default value (integer) |
207 @param percent flag indicating to show zoom value in percent |
208 @param percent flag indicating to show zoom value in percent |
208 (boolean) |
209 (boolean) |
209 """ |
210 """ |
223 self.slider.setMaximum(20) |
224 self.slider.setMaximum(20) |
224 self.__default = 0 |
225 self.__default = 0 |
225 self.__percent = False |
226 self.__percent = False |
226 self.slider.setValue(0) |
227 self.slider.setValue(0) |
227 self.__setValueLabelWidth() |
228 self.__setValueLabelWidth() |
228 |
229 |
229 def mapping(self): |
230 def mapping(self): |
230 """ |
231 """ |
231 Public method to get the current mapping. |
232 Public method to get the current mapping. |
232 |
233 |
233 @return tuple of the mapping and the default index |
234 @return tuple of the mapping and the default index |
234 (list of integer, integer) |
235 (list of integer, integer) |
235 """ |
236 """ |
236 return self.__mapping[:], self.__default |
237 return self.__mapping[:], self.__default |
237 |
238 |
238 def isMapped(self): |
239 def isMapped(self): |
239 """ |
240 """ |
240 Public method to check for a mapped zoom widget. |
241 Public method to check for a mapped zoom widget. |
241 |
242 |
242 @return flag indicating a mapped zoom widget (boolean) |
243 @return flag indicating a mapped zoom widget (boolean) |
243 """ |
244 """ |
244 return self.__mapped |
245 return self.__mapped |
245 |
246 |
246 def __zoomReset(self): |
247 def __zoomReset(self): |
247 """ |
248 """ |
248 Private slot to reset the value. |
249 Private slot to reset the value. |
249 """ |
250 """ |
250 self.slider.setValue(self.__default) |
251 self.slider.setValue(self.__default) |
251 self.valueChanged.emit(self.value()) |
252 self.valueChanged.emit(self.value()) |
252 |
253 |
253 def __zoomOut(self): |
254 def __zoomOut(self): |
254 """ |
255 """ |
255 Private slot to zoom out one step. |
256 Private slot to zoom out one step. |
256 """ |
257 """ |
257 self.slider.setValue(self.slider.value() - self.slider.singleStep()) |
258 self.slider.setValue(self.slider.value() - self.slider.singleStep()) |
258 self.valueChanged.emit(self.value()) |
259 self.valueChanged.emit(self.value()) |
259 |
260 |
260 def __zoomIn(self): |
261 def __zoomIn(self): |
261 """ |
262 """ |
262 Private slot to zoom in one step. |
263 Private slot to zoom in one step. |
263 """ |
264 """ |
264 self.slider.setValue(self.slider.value() + self.slider.singleStep()) |
265 self.slider.setValue(self.slider.value() + self.slider.singleStep()) |
265 self.valueChanged.emit(self.value()) |
266 self.valueChanged.emit(self.value()) |
266 |
267 |
267 def _sliderValueChanged(self, value): |
268 def _sliderValueChanged(self, value): |
268 """ |
269 """ |
269 Protected slot to handle changes of the slider value. |
270 Protected slot to handle changes of the slider value. |
270 |
271 |
271 @param value slider value (integer) |
272 @param value slider value (integer) |
272 """ |
273 """ |
273 val = self.__mapping[value] if self.__mapped else value |
274 val = self.__mapping[value] if self.__mapped else value |
274 fmtStr = "{0}%" if self.__percent else "{0}" |
275 fmtStr = "{0}%" if self.__percent else "{0}" |
275 self.valueLabel.setText(fmtStr.format(val)) |
276 self.valueLabel.setText(fmtStr.format(val)) |
276 self.valueChanged.emit(val) |
277 self.valueChanged.emit(val) |
277 |
278 |
278 def __setValueLabelWidth(self): |
279 def __setValueLabelWidth(self): |
279 """ |
280 """ |
280 Private slot to determine the width of the zoom value label. |
281 Private slot to determine the width of the zoom value label. |
281 """ |
282 """ |
282 labelLen = ( |
283 labelLen = ( |
283 max(len(str(v)) for v in self.__mapping) |
284 max(len(str(v)) for v in self.__mapping) |
284 if self.__mapped else |
285 if self.__mapped |
285 max(len(str(self.slider.maximum())), |
286 else max(len(str(self.slider.maximum())), len(str(self.slider.minimum()))) |
286 len(str(self.slider.minimum()))) |
|
287 ) |
287 ) |
288 fmtStr = "{0}%" if self.__percent else "{0}" |
288 fmtStr = "{0}%" if self.__percent else "{0}" |
289 label = fmtStr.format("0" * labelLen) |
289 label = fmtStr.format("0" * labelLen) |
290 try: |
290 try: |
291 width = self.valueLabel.fontMetrics().horizontalAdvance(label) |
291 width = self.valueLabel.fontMetrics().horizontalAdvance(label) |
292 except AttributeError: |
292 except AttributeError: |
293 width = self.valueLabel.fontMetrics().width(label) |
293 width = self.valueLabel.fontMetrics().width(label) |
294 self.valueLabel.setMinimumWidth(width) |
294 self.valueLabel.setMinimumWidth(width) |
295 self.valueLabel.setMaximumWidth(width) |
295 self.valueLabel.setMaximumWidth(width) |
296 |
296 |
297 def __indexForValue(self, value): |
297 def __indexForValue(self, value): |
298 """ |
298 """ |
299 Private method to get the nearest index for a given value. |
299 Private method to get the nearest index for a given value. |
300 |
300 |
301 @param value value to get the index for (integer) |
301 @param value value to get the index for (integer) |
302 @return index into the mapping list or the unchanged value, |
302 @return index into the mapping list or the unchanged value, |
303 if mapping is not set (integer) |
303 if mapping is not set (integer) |
304 """ |
304 """ |
305 if self.__mapped: |
305 if self.__mapped: |