diff --git a/BEdit/src/bedit/data/libraries/bondgraph.beb b/BEdit/src/bedit/data/libraries/bondgraph.beb new file mode 100644 index 0000000..b829835 Binary files /dev/null and b/BEdit/src/bedit/data/libraries/bondgraph.beb differ diff --git a/BEdit/src/bedit/data/libraries/default.beb b/BEdit/src/bedit/data/libraries/default.beb index 2a3aa79..e5011b4 100644 Binary files a/BEdit/src/bedit/data/libraries/default.beb and b/BEdit/src/bedit/data/libraries/default.beb differ diff --git a/BEdit/src/bedit/gui/controllers/commands.py b/BEdit/src/bedit/gui/controllers/commands.py index 0273a80..574af28 100644 --- a/BEdit/src/bedit/gui/controllers/commands.py +++ b/BEdit/src/bedit/gui/controllers/commands.py @@ -304,6 +304,20 @@ class RenameConnectionCommand(QUndoCommand): self.controller._rename_connection(self.owner_id, self.connection_id, self.old) +class RenameDocumentCommand(QUndoCommand): + def __init__(self, controller, old: str, new: str) -> None: + super().__init__("Rename document") + self.controller = controller + self.old = old + self.new = new + + def redo(self) -> None: + self.controller._rename_document(self.new) + + def undo(self) -> None: + self.controller._rename_document(self.old) + + class DeleteSelectionCommand(QUndoCommand): def __init__( self, diff --git a/BEdit/src/bedit/gui/controllers/document.py b/BEdit/src/bedit/gui/controllers/document.py index e5c8f19..c8c39d3 100644 --- a/BEdit/src/bedit/gui/controllers/document.py +++ b/BEdit/src/bedit/gui/controllers/document.py @@ -23,6 +23,7 @@ from bedit.gui.controllers.commands import ( MoveInterfacePortCommand, PasteSelectionCommand, RenameConnectionCommand, + RenameDocumentCommand, RenameInterfacePortCommand, ReplaceSourceCommand, RotateComponentsCommand, @@ -50,6 +51,7 @@ from bedit.gui.preferences import application_settings class DocumentController(QObject): documentReset = Signal() documentOpenedChanged = Signal(bool) + documentNameChanged = Signal(str) activeGraphChanged = Signal() componentAdded = Signal(str) componentRemoved = Signal(str) @@ -228,10 +230,19 @@ class DocumentController(QObject): {component_id: component}, connections, [], - [], ) ) + def rename_document(self, name: str) -> None: + if self.document is None: + return + name = name.strip() + if not name: + raise ValueError("The document name cannot be empty") + old = str(self.document.metadata.get("name") or "Current Document") + if name != old: + self.undo_stack.push(RenameDocumentCommand(self, old, name)) + def add_component_copy(self, source: Component, position: QPointF) -> str: if self.active_component is None or self.active_component.implementation_kind != "graph": raise ValueError("Open a graph component before placing components") @@ -1374,6 +1385,12 @@ class DocumentController(QObject): connection.name = name self.documentReset.emit() + def _rename_document(self, name: str) -> None: + if self.document is None: + return + self.document.metadata["name"] = name + self.documentNameChanged.emit(name) + def _replace_source(self, component_id: str, source: dict) -> None: if self.document is None: return diff --git a/BEdit/src/bedit/gui/models/library_tree.py b/BEdit/src/bedit/gui/models/library_tree.py index 1be91c2..9c22a8b 100644 --- a/BEdit/src/bedit/gui/models/library_tree.py +++ b/BEdit/src/bedit/gui/models/library_tree.py @@ -1,6 +1,6 @@ import json -from PySide6.QtCore import QByteArray, QMimeData, QModelIndex, Qt, Signal +from PySide6.QtCore import QByteArray, QMimeData, QModelIndex, QSignalBlocker, Qt, Signal from PySide6.QtGui import QStandardItem, QStandardItemModel from bedit.core.model import Component @@ -80,8 +80,24 @@ class DocumentTreeModel(LibraryTreeModel): controller.componentMoved.connect(lambda _component_id, _position: self.rebuild()) controller.connectionAdded.connect(lambda _connection_id: self.rebuild()) controller.connectionRemoved.connect(lambda _connection_id: self.rebuild()) + controller.documentNameChanged.connect(self._document_name_changed) + self.itemChanged.connect(self._document_item_changed) self.rebuild() + def _document_item_changed(self, item: QStandardItem) -> None: + if item.data(ITEM_KIND_ROLE) != "current-document": + return + try: + self.controller.rename_document(item.text()) + except ValueError: + self.rebuild() + + def _document_name_changed(self, name: str) -> None: + root = self.item(0) + if root is not None: + with QSignalBlocker(self): + root.setText(name) + def rebuild(self) -> None: self.clear() self.setHorizontalHeaderLabels(["Document"])