chore: adopt remaining local development state

Catch-all for the intermixed residue of the unpushed otko-development
work ported into this tree: combinations/console-dock/quick-guide wiring
across commands, core, services, views and tests; repo-wide ruff-format
normalization; README/CONTRIBUTING updates; and the toolbar default
(both toolbars now open in the top area, quick guide text updated).

Splitting this further would require hunk-level surgery with low
confidence; the preceding commits in this branch isolate the
self-contained features.
This commit is contained in:
smillmorel 2026-09-16 12:03:22 -04:00
commit ba783718d4
152 changed files with 3394 additions and 1651 deletions

View file

@ -16,6 +16,7 @@ from otko.core import Node # noqa: E402
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
@ -27,14 +28,17 @@ def test_tree_multi_select_syncs_canvas(qtbot) -> None: # type: ignore[no-untyp
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._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"]