From 49bd0780121fd1c9ccf9a87108eb79af6d076a41 Mon Sep 17 00:00:00 2001 From: Talley Lambert Date: Mon, 31 Jan 2022 13:07:20 -0500 Subject: [PATCH] add edgeLabelMode option to QLabeledSlider (#59) --- src/superqt/sliders/_labeled.py | 34 +++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index b4b8349..0f89e5c 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -118,6 +118,7 @@ def _handle_overloaded_slider_sig(args, kwargs): class QLabeledSlider(_SliderProxy, QAbstractSlider): + EdgeLabelMode = EdgeLabelMode _slider_class = QSlider _slider: QSlider @@ -128,6 +129,7 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider): self._slider = self._slider_class() self._label = SliderLabel(self._slider, connect=self._slider.setValue) + self._edge_label_mode: EdgeLabelMode = EdgeLabelMode.LabelIsValue self._rename_signals() self._slider.actionTriggered.connect(self.actionTriggered.emit) @@ -147,6 +149,7 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider): def setOrientation(self, orientation): """Set orientation, value will be 'horizontal' or 'vertical'.""" self._slider.setOrientation(orientation) + marg = (0, 0, 0, 0) if orientation == Qt.Orientation.Vertical: layout = QVBoxLayout() layout.addWidget(self._slider, alignment=Qt.AlignmentFlag.AlignHCenter) @@ -154,6 +157,9 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider): self._label.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.setSpacing(1) else: + if self._edge_label_mode == EdgeLabelMode.NoLabel: + marg = (0, 0, 5, 0) + layout = QHBoxLayout() layout.addWidget(self._slider) layout.addWidget(self._label) @@ -164,9 +170,33 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider): if old_layout is not None: QWidget().setLayout(old_layout) - layout.setContentsMargins(0, 0, 0, 0) + layout.setContentsMargins(*marg) self.setLayout(layout) + def edgeLabelMode(self) -> EdgeLabelMode: + return self._edge_label_mode + + def setEdgeLabelMode(self, opt: EdgeLabelMode) -> None: + if opt is EdgeLabelMode.LabelIsRange: + raise ValueError( + "mode must be one of 'EdgeLabelMode.NoLabel' or " + "'EdgeLabelMode.LabelIsValue'." + ) + + self._edge_label_mode = opt + if not self._edge_label_mode: + self._label.hide() + w = 5 if self.orientation() == Qt.Orientation.Horizontal else 0 + self.layout().setContentsMargins(0, 0, w, 0) + else: + if self.isVisible(): + self._label.show() + self._label.setMode(opt) + self._label.setValue(self._slider.value()) + self.layout().setContentsMargins(0, 0, 0, 0) + + QApplication.processEvents() + class QLabeledDoubleSlider(QLabeledSlider): _slider_class = QDoubleSlider @@ -487,7 +517,7 @@ class SliderLabel(QDoubleSpinBox): ) self.setFixedSize(size) - def setValue(self, val): + def setValue(self, val: Any) -> None: super().setValue(val) if self._mode == EdgeLabelMode.LabelIsRange: self._update_size()