mirror of
https://github.com/pyapp-kit/superqt.git
synced 2025-12-16 11:10:06 +01:00
Compare commits
10 Commits
v0.6.2
...
0f55cd3382
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f55cd3382 | ||
|
|
1bb1a58a73 | ||
|
|
1288250597 | ||
|
|
34a776e8d0 | ||
|
|
146644e105 | ||
|
|
e7873ad93d | ||
|
|
5d87bc5a2f | ||
|
|
0396d465e2 | ||
|
|
4671b08c42 | ||
|
|
6691b4bd84 |
5
.github/workflows/test_and_deploy.yml
vendored
5
.github/workflows/test_and_deploy.yml
vendored
@@ -23,6 +23,8 @@ jobs:
|
||||
qt: ${{ matrix.backend }}
|
||||
pip-install-pre-release: ${{ github.event_name == 'schedule' }}
|
||||
report-failures: ${{ github.event_name == 'schedule' }}
|
||||
secrets:
|
||||
codecov-token: ${{ secrets.CODECOV_TOKEN }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -69,6 +71,7 @@ jobs:
|
||||
|
||||
test-qt-minreqs:
|
||||
uses: pyapp-kit/workflows/.github/workflows/test-pyrepo.yml@v1
|
||||
secrets: inherit
|
||||
with:
|
||||
python-version: "3.8"
|
||||
qt: pyqt5
|
||||
@@ -125,6 +128,6 @@ jobs:
|
||||
twine check dist/*
|
||||
twine upload dist/*
|
||||
|
||||
- uses: softprops/action-gh-release@v1
|
||||
- uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
generate_release_notes: true
|
||||
|
||||
@@ -5,7 +5,7 @@ ci:
|
||||
|
||||
repos:
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.3.0
|
||||
rev: v0.3.5
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix, --unsafe-fixes]
|
||||
@@ -17,7 +17,7 @@ repos:
|
||||
- id: validate-pyproject
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v1.8.0
|
||||
rev: v1.9.0
|
||||
hooks:
|
||||
- id: mypy
|
||||
exclude: tests|examples
|
||||
|
||||
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,5 +1,17 @@
|
||||
# Changelog
|
||||
|
||||
## [v0.6.3](https://github.com/pyapp-kit/superqt/tree/v0.6.3) (2024-03-27)
|
||||
|
||||
[Full Changelog](https://github.com/pyapp-kit/superqt/compare/v0.6.2...v0.6.3)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- fix: fix sliderReleased, sliderPressed signals, and setTracking [\#237](https://github.com/pyapp-kit/superqt/pull/237) ([tlambert03](https://github.com/tlambert03))
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- ci\(dependabot\): bump softprops/action-gh-release from 1 to 2 [\#236](https://github.com/pyapp-kit/superqt/pull/236) ([dependabot[bot]](https://github.com/apps/dependabot))
|
||||
|
||||
## [v0.6.2](https://github.com/pyapp-kit/superqt/tree/v0.6.2) (2024-03-06)
|
||||
|
||||
[Full Changelog](https://github.com/pyapp-kit/superqt/compare/v0.6.1...v0.6.2)
|
||||
@@ -408,17 +420,13 @@
|
||||
|
||||
## [v0.2.1](https://github.com/pyapp-kit/superqt/tree/v0.2.1) (2021-07-10)
|
||||
|
||||
[Full Changelog](https://github.com/pyapp-kit/superqt/compare/v0.2.0rc0...v0.2.1)
|
||||
[Full Changelog](https://github.com/pyapp-kit/superqt/compare/v0.2.0...v0.2.1)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Fix QLabeledRangeSlider API \(fix slider proxy\) [\#10](https://github.com/pyapp-kit/superqt/pull/10) ([tlambert03](https://github.com/tlambert03))
|
||||
- Fix range slider with negative min range [\#9](https://github.com/pyapp-kit/superqt/pull/9) ([tlambert03](https://github.com/tlambert03))
|
||||
|
||||
## [v0.2.0rc0](https://github.com/pyapp-kit/superqt/tree/v0.2.0rc0) (2021-06-26)
|
||||
|
||||
[Full Changelog](https://github.com/pyapp-kit/superqt/compare/v0.2.0...v0.2.0rc0)
|
||||
|
||||
|
||||
|
||||
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
|
||||
|
||||
@@ -6,15 +6,14 @@ from functools import partial
|
||||
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,
|
||||
@@ -94,6 +93,36 @@ class _SliderProxy:
|
||||
def setTickPosition(self, pos: QSlider.TickPosition) -> None:
|
||||
self._slider.setTickPosition(pos)
|
||||
|
||||
def triggerAction(self, action: QAbstractSlider.SliderAction) -> None:
|
||||
return self._slider.triggerAction(action)
|
||||
|
||||
def invertedControls(self) -> bool:
|
||||
return self._slider.invertedControls()
|
||||
|
||||
def setInvertedControls(self, a0: bool) -> None:
|
||||
return self._slider.setInvertedControls(a0)
|
||||
|
||||
def invertedAppearance(self) -> bool:
|
||||
return self._slider.invertedAppearance()
|
||||
|
||||
def setInvertedAppearance(self, a0: bool) -> None:
|
||||
return self._slider.setInvertedAppearance(a0)
|
||||
|
||||
def isSliderDown(self) -> bool:
|
||||
return self._slider.isSliderDown()
|
||||
|
||||
def setSliderDown(self, a0: bool) -> None:
|
||||
return self._slider.setSliderDown(a0)
|
||||
|
||||
def hasTracking(self) -> bool:
|
||||
return self._slider.hasTracking()
|
||||
|
||||
def setTracking(self, enable: bool) -> None:
|
||||
return self._slider.setTracking(enable)
|
||||
|
||||
def orientation(self) -> Qt.Orientation:
|
||||
return self._slider.orientation()
|
||||
|
||||
def __getattr__(self, name: Any) -> Any:
|
||||
return getattr(self._slider, name)
|
||||
|
||||
@@ -290,6 +319,8 @@ class QLabeledDoubleSlider(QLabeledSlider):
|
||||
|
||||
class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
|
||||
_valueChanged = Signal(tuple)
|
||||
_sliderPressed = Signal()
|
||||
_sliderReleased = Signal()
|
||||
editingFinished = Signal()
|
||||
|
||||
_slider_class = QRangeSlider
|
||||
@@ -318,6 +349,8 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
|
||||
|
||||
self._slider = self._slider_class()
|
||||
self._slider.valueChanged.connect(self.valueChanged.emit)
|
||||
self._slider.sliderPressed.connect(self.sliderPressed.emit)
|
||||
self._slider.sliderReleased.connect(self.sliderReleased.emit)
|
||||
self._slider.rangeChanged.connect(self.rangeChanged.emit)
|
||||
self.sliderMoved = self._slider._slidersMoved
|
||||
|
||||
@@ -439,6 +472,8 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
|
||||
# ------------- private methods ----------------
|
||||
def _rename_signals(self) -> None:
|
||||
self.valueChanged = self._valueChanged
|
||||
self.sliderReleased = self._sliderReleased
|
||||
self.sliderPressed = self._sliderPressed
|
||||
|
||||
def _reposition_labels(self) -> None:
|
||||
if (
|
||||
@@ -564,7 +599,7 @@ class QLabeledDoubleRangeSlider(QLabeledRangeSlider):
|
||||
lbl.setDecimals(prec)
|
||||
|
||||
|
||||
class SliderLabel(QDoubleSpinBox):
|
||||
class SliderLabel(QLineEdit):
|
||||
def __init__(
|
||||
self,
|
||||
slider: QSlider,
|
||||
@@ -574,36 +609,74 @@ class SliderLabel(QDoubleSpinBox):
|
||||
) -> 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()
|
||||
|
||||
@@ -622,6 +695,20 @@ class SliderLabel(QDoubleSpinBox):
|
||||
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:
|
||||
@@ -636,21 +723,19 @@ class SliderLabel(QDoubleSpinBox):
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user