Skip to content

Commit a9fa720

Browse files
authored
Allow setting label position on labeled slider (#294)
1 parent 257d97a commit a9fa720

File tree

1 file changed

+43
-12
lines changed

1 file changed

+43
-12
lines changed

src/superqt/sliders/_labeled.py

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
185185
self._slider = self._slider_class(parent=self)
186186
self._label = SliderLabel(self._slider, connect=self._setValue, parent=self)
187187
self._edge_label_mode: EdgeLabelMode = EdgeLabelMode.LabelIsValue
188+
self._edge_label_position: LabelPosition = LabelPosition.LabelsRight
188189

189190
self._rename_signals()
190191
self._slider.actionTriggered.connect(self.actionTriggered.emit)
@@ -205,18 +206,29 @@ def setOrientation(self, orientation: Qt.Orientation) -> None:
205206
marg = (0, 0, 0, 0)
206207
if orientation == Qt.Orientation.Vertical:
207208
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)
210217
self._label.setAlignment(Qt.AlignmentFlag.AlignCenter)
211218
layout.setSpacing(1)
212219
else:
213-
if self._edge_label_mode == EdgeLabelMode.NoLabel:
214-
marg = (0, 0, 5, 0)
215-
216220
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)
220232
layout.setSpacing(6)
221233

222234
old_layout = self.layout()
@@ -249,27 +261,46 @@ def setEdgeLabelMode(self, opt: EdgeLabelMode) -> None:
249261
)
250262

251263
self._edge_label_mode = opt
264+
self._on_slider_range_changed(self.minimum(), self.maximum())
252265
if not self._edge_label_mode:
253266
self._label.hide()
254267
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)
256272
if opt & EdgeLabelMode.LabelIsValue:
257273
if self.isVisible():
258274
self._label.show()
259275
self._label.setMode(opt)
260276
self._label.setValue(self._slider.value())
261277
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())
263292

264293
# putting this after labelMode methods for the sake of mypy
265294
EdgeLabelMode = EdgeLabelMode
295+
LabelPosition = LabelPosition
266296

267297
# --------------------- private api --------------------
268298

269299
def _on_slider_range_changed(self, min_: int, max_: int) -> None:
270-
slash = " / " if self._edge_label_mode & EdgeLabelMode.LabelIsValue else ""
271300
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("")
273304
self.rangeChanged.emit(min_, max_)
274305

275306
def _on_slider_value_changed(self, v: Any) -> None:

0 commit comments

Comments
 (0)