diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index cff7279e..7881ff1d 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -2,8 +2,7 @@ import contextlib from enum import IntEnum, IntFlag, auto -from functools import partial -from typing import Any, Iterable, overload +from typing import Any, Callable, Iterable, overload from qtpy import QtGui from qtpy.QtCore import Property, QPoint, QSize, Qt, Signal @@ -571,8 +570,13 @@ def _on_value_changed(self, v: tuple[int, ...]) -> None: lbl.deleteLater() self._handle_labels.clear() for n, val in enumerate(self._slider.value()): - _cb = partial(self._slider.setSliderPosition, index=n) - s = SliderLabel(self._slider, parent=self, connect=_cb) + # so gross... fix me + s = SliderLabel( + self._slider, + parent=self, + connect=self._on_slider_label_edited, + index=n, + ) s.editingFinished.connect(self.editingFinished) s.setValue(val) self._handle_labels.append(s) @@ -581,6 +585,10 @@ def _on_value_changed(self, v: tuple[int, ...]) -> None: label.setValue(val) self._reposition_labels() + def _on_slider_label_edited(self, pos: float) -> None: + idx = getattr(self.sender(), "_index", 0) + self._slider.setSliderPosition(pos, idx) + def _on_range_changed(self, min: int, max: int) -> None: if (min, max) != (self._slider.minimum(), self._slider.maximum()): self._slider.setRange(min, max) @@ -640,12 +648,14 @@ class SliderLabel(QDoubleSpinBox): def __init__( self, slider: QSlider, - parent=None, - alignment=Qt.AlignmentFlag.AlignCenter, - connect=None, + parent: QWidget | None = None, + alignment: Qt.AlignmentFlag = Qt.AlignmentFlag.AlignCenter, + connect: Callable | None = None, + index: int = 0, ) -> None: super().__init__(parent=parent) self._slider = slider + self._index = index self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) self.setMode(EdgeLabelMode.LabelIsValue) self.setDecimals(0)