diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ff4aeb..310948c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: steps: - uses: actions/checkout@v5 - uses: astral-sh/setup-uv@v7 - - run: uv run pyright + - run: uv run --with pyqt6 pyright test: name: ${{ matrix.platform }} py${{ matrix.python-version }} @@ -152,11 +152,11 @@ jobs: dependency-extras: "testing" qt: ${{ matrix.qt }} pytest-args: 'src/napari/_qt/_qapp_model src/napari/_app_model src/napari/utils/_tests/test_key_bindings.py --import-mode=importlib -k "not async and not qt_dims_2"' - python-version: "3.10" + python-version: "3.11" strategy: fail-fast: false matrix: - qt: ["pyqt5", "pyside2"] + qt: ["pyqt5", "pyside6"] build-and-inspect-package: name: Build & inspect package. diff --git a/pyproject.toml b/pyproject.toml index d446e00..79a3b18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ pyqt5 = [ "pyqt5-qt5==5.15.2; sys_platform == 'win32'", "pyqt5-qt5>=5.15.4; sys_platform != 'win32'", ] -pyqt6 = ["app-model[qt]", "PyQt6>=6.4.0"] +pyqt6 = ["app-model[qt]", "PyQt6>=6.4.0", "pyqt6-qt6>=6.4.0"] pyside2 = ["app-model[qt]", "PySide2>=5.15.2.1"] pyside6 = ["app-model[qt]", "PySide6>=6.6.0"] @@ -77,7 +77,7 @@ dev = [ "mypy>=1.13.0", "pdbpp>=0.11.6; sys_platform != 'win32'", "pre-commit-uv>=4", - "pyqt6>=6.8.0", + # "pyqt6>=6.8.0", "rich>=13.9.4", "pyright>=1.1.402", ] diff --git a/src/app_model/backends/qt/_qkeymap.py b/src/app_model/backends/qt/_qkeymap.py index bcaf0db..01ddcad 100644 --- a/src/app_model/backends/qt/_qkeymap.py +++ b/src/app_model/backends/qt/_qkeymap.py @@ -7,7 +7,6 @@ from functools import reduce from typing import TYPE_CHECKING -from qtpy import API, QT_VERSION # pyright: ignore[reportAttributeAccessIssue] from qtpy.QtCore import QCoreApplication, Qt from qtpy.QtGui import QKeySequence @@ -86,8 +85,9 @@ def simple_keybinding_to_qint(skb: SimpleKeyBinding) -> int: return int(out) -if QT6 and not (API == "pyside6" and int(QT_VERSION[2]) < 4): - +if QT6: + # note: this doesn't work on pyside6 < 6.5 ... + # but we don't support that anymore def _get_qmods(key: QKeyCombination) -> Qt.KeyboardModifier: return key.keyboardModifiers() diff --git a/src/app_model/types/_keys/_keybindings.py b/src/app_model/types/_keys/_keybindings.py index ee8f5dc..af2ed7b 100644 --- a/src/app_model/types/_keys/_keybindings.py +++ b/src/app_model/types/_keys/_keybindings.py @@ -159,10 +159,12 @@ def _parse_input(cls, v: Any) -> "SimpleKeyBinding": return cls.from_int(v) raise TypeError(f"invalid type: {type(v)}") - @model_validator(mode="after") # type: ignore + @model_validator(mode="before") @classmethod - def _model_val(cls, instance: "SimpleKeyBinding") -> "SimpleKeyBinding": - return cls._parse_input(instance) + def _model_val(cls, val: "SimpleKeyBinding") -> "SimpleKeyBinding": + if not isinstance(val, (SimpleKeyBinding, dict)): + return cls._parse_input(val) + return val MIN1 = {"min_length": 1}