From 6691b4bd844c7e7720e5542d36473a704e3a9784 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Fri, 15 Dec 2023 17:15:11 +0100 Subject: [PATCH 01/13] initial implementation --- src/superqt/sliders/_labeled.py | 87 ++++++++++++++++++++++++++------- 1 file changed, 68 insertions(+), 19 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 38bb9d41..8a9c1edd 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -6,15 +6,14 @@ from typing import Any, overload from qtpy.QtCore import QPoint, QSize, Qt, Signal -from qtpy.QtGui import QFontMetrics, QValidator +from qtpy.QtGui import QDoubleValidator, QFontMetrics, QValidator from qtpy.QtWidgets import ( QAbstractSlider, QApplication, QBoxLayout, - QDoubleSpinBox, QHBoxLayout, + QLineEdit, QSlider, - QSpinBox, QStyle, QStyleOptionSpinBox, QVBoxLayout, @@ -572,7 +571,7 @@ def setDecimals(self, prec: int) -> None: lbl.setDecimals(prec) -class SliderLabel(QDoubleSpinBox): +class SliderLabel(QLineEdit): def __init__( self, slider: QSlider, @@ -582,36 +581,74 @@ def __init__( ) -> None: super().__init__(parent=parent) self._slider = slider + self._prefix = "" + self._suffix = "" + self._min = slider.minimum() + self._max = slider.maximum() + self._value = self._min + self._callback = connect self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) self.setMode(EdgeLabelMode.LabelIsValue) self.setDecimals(0) + self.setText(str(self._value)) + validator = QDoubleValidator(self) + validator.setNotation(QDoubleValidator.Notation.ScientificNotation) + self.setValidator(validator) - self.setRange(slider.minimum(), slider.maximum()) slider.rangeChanged.connect(self._update_size) self.setAlignment(alignment) - self.setButtonSymbols(QSpinBox.ButtonSymbols.NoButtons) self.setStyleSheet("background:transparent; border: 0;") if connect is not None: - self.editingFinished.connect(lambda: connect(self.value())) + self.editingFinished.connect(self._editig_finished) self.editingFinished.connect(self._silent_clear_focus) self._update_size() + def _editig_finished(self): + self._silent_clear_focus() + self.setValue(float(self.text())) + if self._callback: + self._callback(self.value()) + + def setRange(self, min_: float, max_: float) -> None: + if max_ < min_: + max_ = min_ + self._min = min_ + self._max = max_ + def setDecimals(self, prec: int) -> None: - super().setDecimals(prec) + # super().setDecimals(prec) self._update_size() + def value(self) -> float: + return self._value + def setValue(self, val: Any) -> None: - super().setValue(val) + if val < self._min: + val = self._min + elif val > self._max: + val = self._max + self._value = val + self.setText(str(val)) if self._mode == EdgeLabelMode.LabelIsRange: self._update_size() - def setMaximum(self, max: float) -> None: - super().setMaximum(max) + def minimum(self): + return self._min + + def setMaximum(self, max_: float) -> None: + if max_ < self._min: + max_ = self._min + self._max = max_ if self._mode == EdgeLabelMode.LabelIsValue: self._update_size() - def setMinimum(self, min: float) -> None: - super().setMinimum(min) + def maximum(self): + return self._max + + def setMinimum(self, min_: float) -> None: + if min_ > self._max: + min_ = self._max + self._min = min_ if self._mode == EdgeLabelMode.LabelIsValue: self._update_size() @@ -630,6 +667,20 @@ def setMode(self, opt: EdgeLabelMode) -> None: self._slider.rangeChanged.connect(self.setRange) self._update_size() + def prefix(self) -> str: + return self._prefix + + def setPrefix(self, prefix: str) -> None: + self._prefix = prefix + self._update_size() + + def suffix(self) -> str: + return self._suffix + + def setSuffix(self, suffix: str) -> None: + self._suffix = suffix + self._update_size() + # --------------- private ---------------- def _silent_clear_focus(self) -> None: @@ -644,21 +695,19 @@ def _update_size(self, *_: Any) -> None: if self._mode & EdgeLabelMode.LabelIsValue: # determine width based on min/max/specialValue - mintext = self.textFromValue(self.minimum())[:18] - maxtext = self.textFromValue(self.maximum())[:18] + mintext = str(self.minimum())[:18] + maxtext = str(self.maximum())[:18] w = max(0, _fm_width(fm, mintext + fixed_content)) w = max(w, _fm_width(fm, maxtext + fixed_content)) - if self.specialValueText(): - w = max(w, _fm_width(fm, self.specialValueText())) if self._mode & EdgeLabelMode.LabelIsRange: w += 8 # it seems as thought suffix() is not enough else: - w = max(0, _fm_width(fm, self.textFromValue(self.value()))) + 3 + w = max(0, _fm_width(fm, str(self.value()))) + 3 w += 3 # cursor blinking space # get the final size hint opt = QStyleOptionSpinBox() - self.initStyleOption(opt) + # self.initStyleOption(opt) size = self.style().sizeFromContents( QStyle.ContentsType.CT_SpinBox, opt, QSize(w, h), self ) From b17df459d78ad00272157dee1895b0b6baa96f7d Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 6 May 2025 18:55:10 +0200 Subject: [PATCH 02/13] fix formating labels --- examples/labeled_sliders.py | 7 ++++--- src/superqt/sliders/_labeled.py | 26 +++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/examples/labeled_sliders.py b/examples/labeled_sliders.py index d92e0ae3..1f374b49 100644 --- a/examples/labeled_sliders.py +++ b/examples/labeled_sliders.py @@ -27,11 +27,12 @@ qlds.setSingleStep(0.1) qlrs = QLabeledRangeSlider(ORIENTATION) -qlrs.valueChanged.connect(lambda e: print("QLabeledRangeSlider valueChanged", e)) -qlrs.setValue((20, 60)) +qlrs.valueChanged.connect(lambda e: print("qlrs valueChanged", e)) +qlrs.setRange(0, 10**11) +qlrs.setValue((20, 60 * 10**9)) qldrs = QLabeledDoubleRangeSlider(ORIENTATION) -qldrs.valueChanged.connect(lambda e: print("qlrs valueChanged", e)) +qldrs.valueChanged.connect(lambda e: print("qldrs valueChanged", e)) qldrs.setRange(0, 1) qldrs.setSingleStep(0.01) qldrs.setValue((0.2, 0.7)) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index f122bde1..4df971de 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -685,7 +685,31 @@ def setValue(self, val: Any) -> None: elif val > self._max: val = self._max self._value = val - self.setText(str(val)) + val = float(val) + use_scientific = (abs(val) < 0.0001 or abs(val) > 9999999.0) and val != 0.0 + font_metrics = QFontMetrics(self.font()) + eight_len = _fm_width(font_metrics, "8") + + available_chars = self.width() // eight_len + + total, _fraction = f"{val:. available_chars: + use_scientific = True + + if use_scientific: + mantissa, exponent = f"{val:.{available_chars}e}".split("e") + mantissa = mantissa.rstrip("0").rstrip(".") + if len(mantissa) + len(exponent) + 1 < available_chars: + text = f"{mantissa}e{exponent}" + else: + text = f"{val:.{available_chars - len(exponent) - 3}e}" + + else: + text = f"{val:.{available_chars - len(total) - 1}f}" + text = text.rstrip("0").rstrip(".") + + self.setText(text) if self._mode == EdgeLabelMode.LabelIsRange: self._update_size() From 097832eaba335a78c6a5e2937f61e4555adc74fa Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 6 May 2025 19:08:05 +0200 Subject: [PATCH 03/13] add minimum number of decimals --- src/superqt/sliders/_labeled.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 4df971de..b30ba6de 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -703,10 +703,12 @@ def setValue(self, val: Any) -> None: if len(mantissa) + len(exponent) + 1 < available_chars: text = f"{mantissa}e{exponent}" else: - text = f"{val:.{available_chars - len(exponent) - 3}e}" + decimals = max(available_chars - len(exponent) - 3, 2) + text = f"{val:.{decimals}e}" else: - text = f"{val:.{available_chars - len(total) - 1}f}" + decimals = max(available_chars - len(total) - 1, 2) + text = f"{val:.{decimals}f}" text = text.rstrip("0").rstrip(".") self.setText(text) From 42d0326bbcb9db49d27d1faf06646ae6381866c5 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Mon, 26 May 2025 19:09:32 +0200 Subject: [PATCH 04/13] fix typo in function name --- src/superqt/sliders/_labeled.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index b30ba6de..1170601f 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -656,11 +656,11 @@ def __init__( self.setAlignment(alignment) self.setStyleSheet("background:transparent; border: 0;") if connect is not None: - self.editingFinished.connect(self._editig_finished) + self.editingFinished.connect(self._editing_finished) self.editingFinished.connect(self._silent_clear_focus) self._update_size() - def _editig_finished(self): + def _editing_finished(self): self._silent_clear_focus() self.setValue(float(self.text())) if self._callback: From aa967b2680d23b9a94c00a39057cd0d13b9bf2ab Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Mon, 26 May 2025 19:20:28 +0200 Subject: [PATCH 05/13] add `decimals` method --- src/superqt/sliders/_labeled.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 1170601f..ec45932d 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -644,6 +644,7 @@ def __init__( self._max = slider.maximum() self._value = self._min self._callback = connect + self._decimals = 0 self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) self.setMode(EdgeLabelMode.LabelIsValue) self.setDecimals(0) @@ -667,8 +668,7 @@ def _editing_finished(self): self._callback(self.value()) def setRange(self, min_: float, max_: float) -> None: - if max_ < min_: - max_ = min_ + max_ = max(max_, min_) self._min = min_ self._max = max_ @@ -676,6 +676,10 @@ def setDecimals(self, prec: int) -> None: # super().setDecimals(prec) self._update_size() + def decimals(self) -> int: + """Return the number of decimals used in the label.""" + return self._decimals + def value(self) -> float: return self._value @@ -685,7 +689,10 @@ def setValue(self, val: Any) -> None: elif val > self._max: val = self._max self._value = val - val = float(val) + self.updateText() + + def updateText(self) -> None: + val = float(self._value) use_scientific = (abs(val) < 0.0001 or abs(val) > 9999999.0) and val != 0.0 font_metrics = QFontMetrics(self.font()) eight_len = _fm_width(font_metrics, "8") @@ -702,6 +709,7 @@ def setValue(self, val: Any) -> None: mantissa = mantissa.rstrip("0").rstrip(".") if len(mantissa) + len(exponent) + 1 < available_chars: text = f"{mantissa}e{exponent}" + decimals = len(exponent) else: decimals = max(available_chars - len(exponent) - 3, 2) text = f"{val:.{decimals}e}" @@ -711,6 +719,8 @@ def setValue(self, val: Any) -> None: text = f"{val:.{decimals}f}" text = text.rstrip("0").rstrip(".") + self._decimals = decimals + self.setText(text) if self._mode == EdgeLabelMode.LabelIsRange: self._update_size() From 8ae598f0cc37454398002387b3943edf466bcc18 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Mon, 26 May 2025 19:26:37 +0200 Subject: [PATCH 06/13] fix after napari src migration --- .github/workflows/test_and_deploy.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 108629ff..9900e0fa 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -87,7 +87,7 @@ jobs: uses: pyapp-kit/workflows/.github/workflows/upload-coverage.yml@v2 secrets: inherit - test_napari: + test_napari_old: uses: pyapp-kit/workflows/.github/workflows/test-dependents.yml@v2 with: dependency-repo: napari/napari @@ -100,9 +100,25 @@ jobs: strategy: fail-fast: false matrix: - napari-version: ["", "v0.4.19.post1"] + napari-version: ["v0.4.19.post1"] qt: ["pyqt5", "pyside2"] + test_napari: + uses: pyapp-kit/workflows/.github/workflows/test-dependents.yml@v2 + with: + dependency-repo: napari/napari + dependency-ref: ${{ matrix.napari-version }} + dependency-extras: "testing" + qt: ${{ matrix.qt }} + pytest-args: 'src/napari/_qt -k "not async and not qt_dims_2 and not qt_viewer_console_focus and not keybinding_editor and not preferences_dialog_not_dismissed"' + python-version: "3.10" + post-install-cmd: "pip install lxml_html_clean" + strategy: + fail-fast: false + matrix: + napari-version: [ "" ] + qt: [ "pyqt5", "pyside2" ] + check-manifest: name: Check Manifest runs-on: ubuntu-latest From bdcc5e7a6497064e4eaeab04b7f9634eaa139980 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Mon, 26 May 2025 19:30:59 +0200 Subject: [PATCH 07/13] use --import-mode=importlib --- .github/workflows/test_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 9900e0fa..8895db5d 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -110,7 +110,7 @@ jobs: dependency-ref: ${{ matrix.napari-version }} dependency-extras: "testing" qt: ${{ matrix.qt }} - pytest-args: 'src/napari/_qt -k "not async and not qt_dims_2 and not qt_viewer_console_focus and not keybinding_editor and not preferences_dialog_not_dismissed"' + pytest-args: 'src/napari/_qt --import-mode=importlib -k "not async and not qt_dims_2 and not qt_viewer_console_focus and not keybinding_editor and not preferences_dialog_not_dismissed"' python-version: "3.10" post-install-cmd: "pip install lxml_html_clean" strategy: From 9c233fdf716294824d580647504579a2831733ff Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 11:41:41 +0200 Subject: [PATCH 08/13] allow enforce decimals --- src/superqt/sliders/_labeled.py | 37 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index ec45932d..1d30a018 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -644,7 +644,7 @@ def __init__( self._max = slider.maximum() self._value = self._min self._callback = connect - self._decimals = 0 + self._decimals = -1 self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) self.setMode(EdgeLabelMode.LabelIsValue) self.setDecimals(0) @@ -674,6 +674,7 @@ def setRange(self, min_: float, max_: float) -> None: def setDecimals(self, prec: int) -> None: # super().setDecimals(prec) + self._decimals = prec self._update_size() def decimals(self) -> int: @@ -704,22 +705,28 @@ def updateText(self) -> None: if len(total) > available_chars: use_scientific = True - if use_scientific: - mantissa, exponent = f"{val:.{available_chars}e}".split("e") - mantissa = mantissa.rstrip("0").rstrip(".") - if len(mantissa) + len(exponent) + 1 < available_chars: - text = f"{mantissa}e{exponent}" - decimals = len(exponent) - else: - decimals = max(available_chars - len(exponent) - 3, 2) - text = f"{val:.{decimals}e}" + if self._decimals < 0: + if use_scientific: + mantissa, exponent = f"{val:.{available_chars}e}".split("e") + mantissa = mantissa.rstrip("0").rstrip(".") + if len(mantissa) + len(exponent) + 1 < available_chars: + text = f"{mantissa}e{exponent}" + else: + decimals = max(available_chars - len(exponent) - 3, 2) + text = f"{val:.{decimals}e}" + else: + decimals = max(available_chars - len(total) - 1, 2) + text = f"{val:.{decimals}f}" + text = text.rstrip("0").rstrip(".") else: - decimals = max(available_chars - len(total) - 1, 2) - text = f"{val:.{decimals}f}" - text = text.rstrip("0").rstrip(".") - - self._decimals = decimals + if use_scientific: + mantissa, exponent = f"{val:.{self._decimals}e}".split("e") + mantissa = mantissa.rstrip("0").rstrip(".") + text = f"{mantissa}e{exponent}" + else: + text = f"{val:.{self._decimals}f}" + text = text.rstrip("0").rstrip(".") self.setText(text) if self._mode == EdgeLabelMode.LabelIsRange: From 77525980d39ab279584320c303af789fe3096827 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 11:47:20 +0200 Subject: [PATCH 09/13] fix seting 0 --- src/superqt/sliders/_labeled.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 1d30a018..a384081f 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -726,8 +726,8 @@ def updateText(self) -> None: text = f"{mantissa}e{exponent}" else: text = f"{val:.{self._decimals}f}" - text = text.rstrip("0").rstrip(".") - + if text == "": + text = "0" self.setText(text) if self._mode == EdgeLabelMode.LabelIsRange: self._update_size() From 8133ba4a649a7aabb611039f63ed20c678781b73 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 11:59:12 +0200 Subject: [PATCH 10/13] flexible set range for range labels --- src/superqt/sliders/_labeled.py | 35 +++++++++++---------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index a384081f..3baf40d0 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -1,6 +1,5 @@ from __future__ import annotations -import contextlib from enum import IntEnum, IntFlag, auto from functools import partial from typing import TYPE_CHECKING, Any, overload @@ -668,9 +667,15 @@ def _editing_finished(self): self._callback(self.value()) def setRange(self, min_: float, max_: float) -> None: - max_ = max(max_, min_) - self._min = min_ - self._max = max_ + if self._mode == EdgeLabelMode.LabelIsRange: + max_val = max(abs(min_), abs(max_)) * 10 + self._min = -max_val + self._max = max_val + self._update_size() + else: + max_ = max(max_, min_) + self._min = min_ + self._max = max_ def setDecimals(self, prec: int) -> None: # super().setDecimals(prec) @@ -736,35 +741,19 @@ def minimum(self): return self._min def setMaximum(self, max_: float) -> None: - if max_ < self._min: - max_ = self._min - self._max = max_ - if self._mode == EdgeLabelMode.LabelIsValue: - self._update_size() + self.setRange(self._min, max_) def maximum(self): return self._max def setMinimum(self, min_: float) -> None: - if min_ > self._max: - min_ = self._max - self._min = min_ - if self._mode == EdgeLabelMode.LabelIsValue: - self._update_size() + self.setRange(self._min, min_) def setMode(self, opt: EdgeLabelMode) -> None: # when the edge labels are controlling slider range, # we want them to have a big range, but not have a huge label self._mode = opt - if opt == EdgeLabelMode.LabelIsRange: - self.setMinimum(-9999999) - self.setMaximum(9999999) - with contextlib.suppress(Exception): - self._slider.rangeChanged.disconnect(self.setRange) - else: - self.setMinimum(self._slider.minimum()) - self.setMaximum(self._slider.maximum()) - self._slider.rangeChanged.connect(self.setRange) + self.setRange(self._slider.minimum(), self._slider.minimum()) self._update_size() def prefix(self) -> str: From b3237c7cbb85d62aba061cd9f2dbb2d2f3410f53 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 13:09:30 +0200 Subject: [PATCH 11/13] better set range --- src/superqt/sliders/_labeled.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 3baf40d0..7fd3c755 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -668,9 +668,11 @@ def _editing_finished(self): def setRange(self, min_: float, max_: float) -> None: if self._mode == EdgeLabelMode.LabelIsRange: - max_val = max(abs(min_), abs(max_)) * 10 - self._min = -max_val - self._max = max_val + max_val = max(max(abs(min_), abs(max_)) * 10) + n_digits = max(len(str(int(max_val))), 7) + upper_bound = int("9" * n_digits) + self._min = -upper_bound + self._max = upper_bound self._update_size() else: max_ = max(max_, min_) @@ -747,7 +749,7 @@ def maximum(self): return self._max def setMinimum(self, min_: float) -> None: - self.setRange(self._min, min_) + self.setRange(min_, self._max) def setMode(self, opt: EdgeLabelMode) -> None: # when the edge labels are controlling slider range, From d3d95370ea1ed67e1b40b0b855cae47d3bfbdca1 Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 13:14:55 +0200 Subject: [PATCH 12/13] fix seting mode --- src/superqt/sliders/_labeled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index 7fd3c755..abc827bf 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -755,7 +755,7 @@ def setMode(self, opt: EdgeLabelMode) -> None: # when the edge labels are controlling slider range, # we want them to have a big range, but not have a huge label self._mode = opt - self.setRange(self._slider.minimum(), self._slider.minimum()) + self.setRange(self._slider.minimum(), self._slider.maximum()) self._update_size() def prefix(self) -> str: From 83319e761f0208c28fbe3b4528f9d3cc56c76caf Mon Sep 17 00:00:00 2001 From: Grzegorz Bokota Date: Tue, 27 May 2025 23:47:35 +0200 Subject: [PATCH 13/13] fix max calculation --- src/superqt/sliders/_labeled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/superqt/sliders/_labeled.py b/src/superqt/sliders/_labeled.py index abc827bf..b741c088 100644 --- a/src/superqt/sliders/_labeled.py +++ b/src/superqt/sliders/_labeled.py @@ -668,7 +668,7 @@ def _editing_finished(self): def setRange(self, min_: float, max_: float) -> None: if self._mode == EdgeLabelMode.LabelIsRange: - max_val = max(max(abs(min_), abs(max_)) * 10) + max_val = max(abs(min_), abs(max_)) n_digits = max(len(str(int(max_val))), 7) upper_bound = int("9" * n_digits) self._min = -upper_bound