@@ -185,6 +185,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
185
185
self ._slider = self ._slider_class (parent = self )
186
186
self ._label = SliderLabel (self ._slider , connect = self ._setValue , parent = self )
187
187
self ._edge_label_mode : EdgeLabelMode = EdgeLabelMode .LabelIsValue
188
+ self ._edge_label_position : LabelPosition = LabelPosition .LabelsRight
188
189
189
190
self ._rename_signals ()
190
191
self ._slider .actionTriggered .connect (self .actionTriggered .emit )
@@ -205,18 +206,29 @@ def setOrientation(self, orientation: Qt.Orientation) -> None:
205
206
marg = (0 , 0 , 0 , 0 )
206
207
if orientation == Qt .Orientation .Vertical :
207
208
layout = QVBoxLayout ()
208
- layout .addWidget (self ._slider , alignment = Qt .AlignmentFlag .AlignHCenter )
209
- layout .addWidget (self ._label , alignment = Qt .AlignmentFlag .AlignHCenter )
209
+ if not self ._edge_label_position :
210
+ layout .addWidget (self ._slider , alignment = Qt .AlignmentFlag .AlignHCenter )
211
+ elif self ._edge_label_position == LabelPosition .LabelsBelow :
212
+ layout .addWidget (self ._slider , alignment = Qt .AlignmentFlag .AlignHCenter )
213
+ layout .addWidget (self ._label , alignment = Qt .AlignmentFlag .AlignHCenter )
214
+ else :
215
+ layout .addWidget (self ._label , alignment = Qt .AlignmentFlag .AlignHCenter )
216
+ layout .addWidget (self ._slider , alignment = Qt .AlignmentFlag .AlignHCenter )
210
217
self ._label .setAlignment (Qt .AlignmentFlag .AlignCenter )
211
218
layout .setSpacing (1 )
212
219
else :
213
- if self ._edge_label_mode == EdgeLabelMode .NoLabel :
214
- marg = (0 , 0 , 5 , 0 )
215
-
216
220
layout = QHBoxLayout () # type: ignore
217
- layout .addWidget (self ._slider )
218
- layout .addWidget (self ._label )
219
- self ._label .setAlignment (Qt .AlignmentFlag .AlignRight )
221
+ if not self ._edge_label_position :
222
+ layout .addWidget (self ._slider )
223
+ elif self ._edge_label_position == LabelPosition .LabelsRight :
224
+ layout .addWidget (self ._slider )
225
+ layout .addWidget (self ._label )
226
+ self ._label .setAlignment (Qt .AlignmentFlag .AlignRight )
227
+ else :
228
+ layout .addWidget (self ._label )
229
+ layout .addWidget (self ._slider )
230
+ self ._label .setAlignment (Qt .AlignmentFlag .AlignLeft )
231
+ marg = (0 , 0 , 5 , 0 )
220
232
layout .setSpacing (6 )
221
233
222
234
old_layout = self .layout ()
@@ -249,27 +261,46 @@ def setEdgeLabelMode(self, opt: EdgeLabelMode) -> None:
249
261
)
250
262
251
263
self ._edge_label_mode = opt
264
+ self ._on_slider_range_changed (self .minimum (), self .maximum ())
252
265
if not self ._edge_label_mode :
253
266
self ._label .hide ()
254
267
w = 5 if self .orientation () == Qt .Orientation .Horizontal else 0
255
- self .layout ().setContentsMargins (0 , 0 , w , 0 )
268
+ if self ._edge_label_position == LabelPosition .LabelsRight :
269
+ self .layout ().setContentsMargins (0 , 0 , w , 0 )
270
+ elif self ._edge_label_position == LabelPosition .LabelsLeft :
271
+ self .layout ().setContentsMargins (0 , 0 , 0 , w )
256
272
if opt & EdgeLabelMode .LabelIsValue :
257
273
if self .isVisible ():
258
274
self ._label .show ()
259
275
self ._label .setMode (opt )
260
276
self ._label .setValue (self ._slider .value ())
261
277
self .layout ().setContentsMargins (0 , 0 , 0 , 0 )
262
- self ._on_slider_range_changed (self .minimum (), self .maximum ())
278
+
279
+ def edgeLabelPosition (self ) -> LabelPosition :
280
+ """Return where/whether a label is shown at the edge of the slider."""
281
+ return self ._edge_label_position
282
+
283
+ def setEdgeLabelPosition (self , opt : LabelPosition ) -> None :
284
+ """Set where/whether a label is shown at the edge of the slider."""
285
+ if opt is LabelPosition .LabelsOnHandle :
286
+ raise ValueError ("position cannot be 'LabelPosition.LabelsOnHandle'" )
287
+
288
+ self ._edge_label_position = opt
289
+ self ._label .setVisible (bool (opt ))
290
+ # TODO: make double clickable to edit
291
+ self .setOrientation (self .orientation ())
263
292
264
293
# putting this after labelMode methods for the sake of mypy
265
294
EdgeLabelMode = EdgeLabelMode
295
+ LabelPosition = LabelPosition
266
296
267
297
# --------------------- private api --------------------
268
298
269
299
def _on_slider_range_changed (self , min_ : int , max_ : int ) -> None :
270
- slash = " / " if self ._edge_label_mode & EdgeLabelMode .LabelIsValue else ""
271
300
if self ._edge_label_mode & EdgeLabelMode .LabelIsRange :
272
- self ._label .setSuffix (f"{ slash } { max_ } " )
301
+ self ._label .setSuffix (f" / { max_ } " )
302
+ else :
303
+ self ._label .setSuffix ("" )
273
304
self .rangeChanged .emit (min_ , max_ )
274
305
275
306
def _on_slider_value_changed (self , v : Any ) -> None :
0 commit comments