src/eric7/EricWidgets/EricZoomWidget.py

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

eric ide

mercurial