eric6/E5Gui/E5ZoomWidget.py

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

eric ide

mercurial