mirror of
https://github.com/pyapp-kit/superqt.git
synced 2025-12-16 03:00:05 +01:00
Allow setting label position on labeled slider (#294)
This commit is contained in:
@@ -185,6 +185,7 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider):
|
|||||||
self._slider = self._slider_class(parent=self)
|
self._slider = self._slider_class(parent=self)
|
||||||
self._label = SliderLabel(self._slider, connect=self._setValue, parent=self)
|
self._label = SliderLabel(self._slider, connect=self._setValue, parent=self)
|
||||||
self._edge_label_mode: EdgeLabelMode = EdgeLabelMode.LabelIsValue
|
self._edge_label_mode: EdgeLabelMode = EdgeLabelMode.LabelIsValue
|
||||||
|
self._edge_label_position: LabelPosition = LabelPosition.LabelsRight
|
||||||
|
|
||||||
self._rename_signals()
|
self._rename_signals()
|
||||||
self._slider.actionTriggered.connect(self.actionTriggered.emit)
|
self._slider.actionTriggered.connect(self.actionTriggered.emit)
|
||||||
@@ -205,18 +206,29 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider):
|
|||||||
marg = (0, 0, 0, 0)
|
marg = (0, 0, 0, 0)
|
||||||
if orientation == Qt.Orientation.Vertical:
|
if orientation == Qt.Orientation.Vertical:
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
layout.addWidget(self._slider, alignment=Qt.AlignmentFlag.AlignHCenter)
|
if not self._edge_label_position:
|
||||||
layout.addWidget(self._label, alignment=Qt.AlignmentFlag.AlignHCenter)
|
layout.addWidget(self._slider, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
elif self._edge_label_position == LabelPosition.LabelsBelow:
|
||||||
|
layout.addWidget(self._slider, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
layout.addWidget(self._label, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
else:
|
||||||
|
layout.addWidget(self._label, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
layout.addWidget(self._slider, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||||
self._label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
self._label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
layout.setSpacing(1)
|
layout.setSpacing(1)
|
||||||
else:
|
else:
|
||||||
if self._edge_label_mode == EdgeLabelMode.NoLabel:
|
|
||||||
marg = (0, 0, 5, 0)
|
|
||||||
|
|
||||||
layout = QHBoxLayout() # type: ignore
|
layout = QHBoxLayout() # type: ignore
|
||||||
layout.addWidget(self._slider)
|
if not self._edge_label_position:
|
||||||
layout.addWidget(self._label)
|
layout.addWidget(self._slider)
|
||||||
self._label.setAlignment(Qt.AlignmentFlag.AlignRight)
|
elif self._edge_label_position == LabelPosition.LabelsRight:
|
||||||
|
layout.addWidget(self._slider)
|
||||||
|
layout.addWidget(self._label)
|
||||||
|
self._label.setAlignment(Qt.AlignmentFlag.AlignRight)
|
||||||
|
else:
|
||||||
|
layout.addWidget(self._label)
|
||||||
|
layout.addWidget(self._slider)
|
||||||
|
self._label.setAlignment(Qt.AlignmentFlag.AlignLeft)
|
||||||
|
marg = (0, 0, 5, 0)
|
||||||
layout.setSpacing(6)
|
layout.setSpacing(6)
|
||||||
|
|
||||||
old_layout = self.layout()
|
old_layout = self.layout()
|
||||||
@@ -249,27 +261,46 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self._edge_label_mode = opt
|
self._edge_label_mode = opt
|
||||||
|
self._on_slider_range_changed(self.minimum(), self.maximum())
|
||||||
if not self._edge_label_mode:
|
if not self._edge_label_mode:
|
||||||
self._label.hide()
|
self._label.hide()
|
||||||
w = 5 if self.orientation() == Qt.Orientation.Horizontal else 0
|
w = 5 if self.orientation() == Qt.Orientation.Horizontal else 0
|
||||||
self.layout().setContentsMargins(0, 0, w, 0)
|
if self._edge_label_position == LabelPosition.LabelsRight:
|
||||||
|
self.layout().setContentsMargins(0, 0, w, 0)
|
||||||
|
elif self._edge_label_position == LabelPosition.LabelsLeft:
|
||||||
|
self.layout().setContentsMargins(0, 0, 0, w)
|
||||||
if opt & EdgeLabelMode.LabelIsValue:
|
if opt & EdgeLabelMode.LabelIsValue:
|
||||||
if self.isVisible():
|
if self.isVisible():
|
||||||
self._label.show()
|
self._label.show()
|
||||||
self._label.setMode(opt)
|
self._label.setMode(opt)
|
||||||
self._label.setValue(self._slider.value())
|
self._label.setValue(self._slider.value())
|
||||||
self.layout().setContentsMargins(0, 0, 0, 0)
|
self.layout().setContentsMargins(0, 0, 0, 0)
|
||||||
self._on_slider_range_changed(self.minimum(), self.maximum())
|
|
||||||
|
def edgeLabelPosition(self) -> LabelPosition:
|
||||||
|
"""Return where/whether a label is shown at the edge of the slider."""
|
||||||
|
return self._edge_label_position
|
||||||
|
|
||||||
|
def setEdgeLabelPosition(self, opt: LabelPosition) -> None:
|
||||||
|
"""Set where/whether a label is shown at the edge of the slider."""
|
||||||
|
if opt is LabelPosition.LabelsOnHandle:
|
||||||
|
raise ValueError("position cannot be 'LabelPosition.LabelsOnHandle'")
|
||||||
|
|
||||||
|
self._edge_label_position = opt
|
||||||
|
self._label.setVisible(bool(opt))
|
||||||
|
# TODO: make double clickable to edit
|
||||||
|
self.setOrientation(self.orientation())
|
||||||
|
|
||||||
# putting this after labelMode methods for the sake of mypy
|
# putting this after labelMode methods for the sake of mypy
|
||||||
EdgeLabelMode = EdgeLabelMode
|
EdgeLabelMode = EdgeLabelMode
|
||||||
|
LabelPosition = LabelPosition
|
||||||
|
|
||||||
# --------------------- private api --------------------
|
# --------------------- private api --------------------
|
||||||
|
|
||||||
def _on_slider_range_changed(self, min_: int, max_: int) -> None:
|
def _on_slider_range_changed(self, min_: int, max_: int) -> None:
|
||||||
slash = " / " if self._edge_label_mode & EdgeLabelMode.LabelIsValue else ""
|
|
||||||
if self._edge_label_mode & EdgeLabelMode.LabelIsRange:
|
if self._edge_label_mode & EdgeLabelMode.LabelIsRange:
|
||||||
self._label.setSuffix(f"{slash}{max_}")
|
self._label.setSuffix(f" / {max_}")
|
||||||
|
else:
|
||||||
|
self._label.setSuffix("")
|
||||||
self.rangeChanged.emit(min_, max_)
|
self.rangeChanged.emit(min_, max_)
|
||||||
|
|
||||||
def _on_slider_value_changed(self, v: Any) -> None:
|
def _on_slider_value_changed(self, v: Any) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user