Compare commits

...

3 Commits

Author SHA1 Message Date
Talley Lambert
f7e0e3b7a9 Merge fc960ca5ac into 5f68795a82 2024-06-15 08:52:39 -04:00
Talley Lambert
5f68795a82 feat: graceful offline fallback for qiconify (#251) 2024-06-15 07:54:40 -04:00
Talley Lambert
fc960ca5ac fix: fix issues with SliderLabel 2024-06-03 13:21:28 -04:00
2 changed files with 53 additions and 24 deletions

View File

@@ -1,9 +1,11 @@
from __future__ import annotations
import warnings
from typing import TYPE_CHECKING
from qtpy.QtCore import QSize
from qtpy.QtGui import QIcon
from qtpy.QtCore import QSize, Qt
from qtpy.QtGui import QIcon, QPainter, QPixmap
from qtpy.QtWidgets import QApplication
if TYPE_CHECKING:
from typing import Literal
@@ -122,5 +124,25 @@ class QIconifyIcon(QIcon):
state : QIcon.State, optional
State specified for the icon, passed to `QIcon.addFile`.
"""
path = svg_path(*key, color=color, flip=flip, rotate=rotate, dir=dir)
self.addFile(str(path), size or QSize(), mode, state)
try:
path = svg_path(*key, color=color, flip=flip, rotate=rotate, dir=dir)
except OSError:
warnings.warn(
f"Unable to connect to internet, and icon {key} not cached.",
stacklevel=2,
)
self._draw_text_fallback(key)
else:
self.addFile(str(path), size or QSize(), mode, state)
def _draw_text_fallback(self, key: tuple[str, ...]) -> None:
if style := QApplication.style():
pixmap = style.standardPixmap(style.StandardPixmap.SP_MessageBoxQuestion)
else:
pixmap = QPixmap(18, 18)
pixmap.fill(Qt.GlobalColor.transparent)
painter = QPainter(pixmap)
painter.drawText(pixmap.rect(), Qt.AlignmentFlag.AlignCenter, "?")
painter.end()
self.addPixmap(pixmap)

View File

@@ -2,8 +2,7 @@ from __future__ import annotations
import contextlib
from enum import IntEnum, IntFlag, auto
from functools import partial
from typing import Any, Iterable, overload
from typing import Any, Iterable, cast, overload
from qtpy import QtGui
from qtpy.QtCore import Property, QPoint, QSize, Qt, Signal
@@ -183,7 +182,9 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider):
self.setFocusPolicy(Qt.FocusPolicy(fp))
self._slider = self._slider_class(parent=self)
self._label = SliderLabel(self._slider, connect=self._setValue, parent=self)
self._label = SliderLabel(self._slider, parent=self)
self._label.editingFinished.connect(self._on_label_edited)
self._edge_label_mode: EdgeLabelMode = EdgeLabelMode.LabelIsValue
self._rename_signals()
@@ -265,6 +266,8 @@ class QLabeledSlider(_SliderProxy, QAbstractSlider):
EdgeLabelMode = EdgeLabelMode
# --------------------- private api --------------------
def _on_label_edited(self) -> None:
self._setValue(self._label.value())
def _on_slider_range_changed(self, min_: int, max_: int) -> None:
slash = " / " if self._edge_label_mode & EdgeLabelMode.LabelIsValue else ""
@@ -359,15 +362,14 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
self.sliderMoved = self._slider._slidersMoved
self._min_label = SliderLabel(
self._slider,
alignment=Qt.AlignmentFlag.AlignLeft,
connect=self._min_label_edited,
self._slider, alignment=Qt.AlignmentFlag.AlignLeft
)
self._min_label.editingFinished.connect(self._min_label_edited)
self._max_label = SliderLabel(
self._slider,
alignment=Qt.AlignmentFlag.AlignRight,
connect=self._max_label_edited,
self._slider, parent=self, alignment=Qt.AlignmentFlag.AlignRight
)
self._max_label.editingFinished.connect(self._max_label_edited)
self._min_label.editingFinished.connect(self.editingFinished)
self._max_label.editingFinished.connect(self.editingFinished)
self.setEdgeLabelMode(EdgeLabelMode.LabelIsRange)
@@ -542,7 +544,8 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
label.show()
self.update()
def _min_label_edited(self, val: float) -> None:
def _min_label_edited(self) -> None:
val = self._min_label.value()
if self._edge_label_mode == EdgeLabelMode.LabelIsRange:
self.setMinimum(val)
else:
@@ -551,7 +554,8 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
self.setValue(v)
self._reposition_labels()
def _max_label_edited(self, val: float) -> None:
def _max_label_edited(self) -> None:
val = self._max_label.value()
if self._edge_label_mode == EdgeLabelMode.LabelIsRange:
self.setMaximum(val)
else:
@@ -571,9 +575,8 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
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)
s.editingFinished.connect(self.editingFinished)
s = SliderLabel(self._slider, parent=self, index=n)
s.editingFinished.connect(self._on_slider_label_edited)
s.setValue(val)
self._handle_labels.append(s)
else:
@@ -581,6 +584,11 @@ class QLabeledRangeSlider(_SliderProxy, QAbstractSlider):
label.setValue(val)
self._reposition_labels()
def _on_slider_label_edited(self):
label = cast("SliderLabel", self.sender())
self._slider.setSliderPosition(label.value(), label.index)
self.editingFinished.emit()
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,13 @@ 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,
index: int = 0,
) -> None:
super().__init__(parent=parent)
super().__init__(parent)
self._slider = slider
self.index = index
self.setFocusPolicy(Qt.FocusPolicy.ClickFocus)
self.setMode(EdgeLabelMode.LabelIsValue)
self.setDecimals(0)
@@ -655,8 +664,6 @@ class SliderLabel(QDoubleSpinBox):
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._silent_clear_focus)
self._update_size()