E5Gui/E5ZoomWidget.py

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

eric ide

mercurial