Hooked up port editor in the document tree

This commit is contained in:
2026-07-26 17:20:37 +02:00
parent b417d85477
commit 8b45674cd2
9 changed files with 610 additions and 30 deletions

View File

@@ -1,18 +1,44 @@
from PySide6.QtCore import QObject
from collections.abc import Callable
from typing import Protocol
from PySide6.QtCore import QObject, QPoint, Qt
from PySide6.QtWidgets import QDialog, QMenu
from bedit_core.models import Component, Port, PortID
from bedit_core.models import Document as CoreDocument
from bedit_gui.documents import Document
from bedit_gui.views.dialogs.interface_editor_dialog import (
InterfaceEditorDialog,
)
from bedit_gui.views.main_window import MainWindow
from bedit_gui.views.models.document_tree_model import DocumentTreeModel
class InterfaceEditorLike(Protocol):
def exec(self) -> int: ...
def ports(self) -> dict[PortID, Port]: ...
InterfaceEditorFactory = Callable[
[dict[PortID, Port], MainWindow],
InterfaceEditorLike,
]
class DocumentTreeController(QObject):
def __init__(self,document: Document,window: MainWindow) -> None:
def __init__(
self,
document: Document,
window: MainWindow,
interface_editor_factory: InterfaceEditorFactory = InterfaceEditorDialog,
) -> None:
super().__init__(window)
self.document = document
self.window = window
self.model = DocumentTreeModel()
self.interface_editor_factory = interface_editor_factory
window.ui.documentTree.setModel(self.model)
document.model_changed.connect(self._on_document_changed)
@@ -20,6 +46,12 @@ class DocumentTreeController(QObject):
self.model.rename_component_requested.connect(self.document.rename_component)
window.ui.documentTree.setHeaderHidden(True)
window.ui.documentTree.setContextMenuPolicy(
Qt.ContextMenuPolicy.CustomContextMenu
)
window.ui.documentTree.customContextMenuRequested.connect(
self._show_context_menu
)
self._on_document_changed(document.model)
@@ -30,3 +62,25 @@ class DocumentTreeController(QObject):
# Optional presentation behavior. Later, you could instead remember
# expanded component IDs and restore only those nodes.
self.window.ui.documentTree.expandAll()
def _show_context_menu(self, position: QPoint) -> None:
index = self.window.ui.documentTree.indexAt(position)
component = self.model.value(index)
if not isinstance(component, Component):
return
menu = QMenu(self.window.ui.documentTree)
edit_interface = menu.addAction("Edit Interface")
selected = menu.exec(
self.window.ui.documentTree.viewport().mapToGlobal(position)
)
if selected is edit_interface:
self._edit_interface(component)
def _edit_interface(self, component: Component) -> None:
dialog = self.interface_editor_factory(
component.interface.ports,
self.window,
)
if dialog.exec() == QDialog.DialogCode.Accepted:
self.document.update_component_ports(component, dialog.ports())