otko/tests/gui/test_tree_multi_select.py
smillmorel 61b850bf46
Some checks failed
CI / lint (pull_request) Has been cancelled
CI / type (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.12) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.12) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.12) (pull_request) Has been cancelled
CI / test-gui (pull_request) Has been cancelled
CI / test-integration (macos-latest) (pull_request) Has been cancelled
CI / test-integration (ubuntu-latest) (pull_request) Has been cancelled
CI / test-integration (windows-latest) (pull_request) Has been cancelled
style: resolve the remaining ruff findings
Auto-fixes (UP037, UP038, F401, I001, SIM105, RUF100) plus hand-fixes:
drop the now-unused `Union` imports, annotate mutable class attributes
with ClassVar, raise ValidationError instead of blind Exception in the
zero-length test, delete two dead locals, and bind the per-iteration
grid-builder closures to their loop variables (B023).
2026-09-16 13:20:36 -04:00

60 lines
1.9 KiB
Python

"""Model Tree supports Ctrl+click multi-selection — regression guard."""
from __future__ import annotations
import pytest
pytest.importorskip("PySide6")
from PySide6.QtWidgets import QTreeWidget
from otko.core import Node
@pytest.mark.gui
def test_tree_is_in_extended_selection_mode(qtbot) -> None: # type: ignore[no-untyped-def]
"""Default QTreeWidget is single-select; we need ExtendedSelection."""
from otko.views.main_window import MainWindow
mw = MainWindow()
qtbot.addWidget(mw)
assert mw._tree.selectionMode() == QTreeWidget.SelectionMode.ExtendedSelection
@pytest.mark.gui
def test_tree_multi_select_syncs_canvas(qtbot) -> None: # type: ignore[no-untyped-def]
"""Selecting two node rows in the tree must populate the canvas
selection with both ids — the precondition for the Zero-Length
Section dialog (exactly 2 joints)."""
from otko.views.main_window import MainWindow
mw = MainWindow()
qtbot.addWidget(mw)
mw._vm.new_project(ndm=2, ndf=3)
mw._vm.project.nodes.extend(
[
Node(id=1, coords=(0, 0, 0)),
Node(id=2, coords=(0, 0, 0)),
Node(id=3, coords=(1, 0, 0)),
]
)
mw._refresh_tree(mw._vm.project)
nodes_cat = mw._tree_categories["Nodes"]
nodes_cat.setExpanded(True)
# Find the three child items and select rows 0 + 1.
items = [nodes_cat.child(i) for i in range(nodes_cat.childCount())]
assert len(items) == 3
items[0].setSelected(True)
items[1].setSelected(True)
assert mw._canvas.selection.nodes == frozenset({1, 2})
assert mw._canvas.selection.elements == frozenset()
# Adding a third selection (row 2) keeps all three.
items[2].setSelected(True)
assert mw._canvas.selection.nodes == frozenset({1, 2, 3})
# Deselecting row 0 leaves rows 1 + 2.
items[0].setSelected(False)
assert mw._canvas.selection.nodes == frozenset({2, 3})