Renaming the document root and components from the tree
This commit is contained in:
@@ -2,7 +2,7 @@ from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt
|
||||
from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, Signal
|
||||
|
||||
from bedit_core.models import Document as CoreDocument, ComponentID, Component, GraphImplementation
|
||||
|
||||
@@ -16,6 +16,9 @@ class DocumentTreeNode:
|
||||
|
||||
|
||||
class DocumentTreeModel(QAbstractItemModel):
|
||||
rename_document_requested = Signal(str)
|
||||
rename_component_requested = Signal(Component, str)
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self._document: CoreDocument | None = None
|
||||
@@ -33,18 +36,9 @@ class DocumentTreeModel(QAbstractItemModel):
|
||||
def columnCount(self, _parent: QModelIndex | None = None) -> int:
|
||||
return 1
|
||||
|
||||
def index(
|
||||
self,
|
||||
row: int,
|
||||
column: int,
|
||||
parent: QModelIndex | None = None,
|
||||
) -> QModelIndex:
|
||||
def index(self,row: int,column: int,parent: QModelIndex | None = None) -> QModelIndex:
|
||||
parent_node = self._node(parent)
|
||||
if (
|
||||
column != 0
|
||||
or row < 0
|
||||
or row >= len(parent_node.children)
|
||||
):
|
||||
if column != 0 or row < 0 or row >= len(parent_node.children):
|
||||
return QModelIndex()
|
||||
return self.createIndex(row, column, parent_node.children[row])
|
||||
|
||||
@@ -66,22 +60,38 @@ class DocumentTreeModel(QAbstractItemModel):
|
||||
row = grandparent.children.index(parent_node)
|
||||
return self.createIndex(row, 0, parent_node)
|
||||
|
||||
def data(
|
||||
self,
|
||||
index: QModelIndex,
|
||||
role: int = Qt.ItemDataRole.DisplayRole,
|
||||
) -> object | None:
|
||||
def data(self,index: QModelIndex,role: int = Qt.ItemDataRole.DisplayRole) -> object | None:
|
||||
if not index.isValid():
|
||||
return None
|
||||
|
||||
node = index.internalPointer()
|
||||
if (
|
||||
role == Qt.ItemDataRole.DisplayRole
|
||||
and isinstance(node, DocumentTreeNode)
|
||||
):
|
||||
if not isinstance(node, DocumentTreeNode):
|
||||
return None
|
||||
|
||||
if role in (Qt.ItemDataRole.DisplayRole, Qt.ItemDataRole.EditRole):
|
||||
return node.name
|
||||
|
||||
return None
|
||||
|
||||
def setData(self,index: QModelIndex,value: object,role: int = Qt.ItemDataRole.EditRole) -> bool:
|
||||
if role != Qt.ItemDataRole.EditRole or not index.isValid():
|
||||
return False
|
||||
|
||||
node = index.internalPointer()
|
||||
if not isinstance(node, DocumentTreeNode) or not isinstance(node.value, (CoreDocument, Component)):
|
||||
return False
|
||||
|
||||
name = str(value).strip()
|
||||
|
||||
if not name or name == node.name:
|
||||
return False
|
||||
|
||||
if isinstance(node.value, CoreDocument):
|
||||
self.rename_document_requested.emit(name)
|
||||
elif isinstance(node.value, Component):
|
||||
self.rename_component_requested.emit(node.value, name)
|
||||
return True
|
||||
|
||||
def _node(self, index: QModelIndex | None) -> DocumentTreeNode:
|
||||
if index is None or not index.isValid():
|
||||
return self._root
|
||||
@@ -89,6 +99,21 @@ class DocumentTreeModel(QAbstractItemModel):
|
||||
node = index.internalPointer()
|
||||
return node if isinstance(node, DocumentTreeNode) else self._root
|
||||
|
||||
def flags(self, index: QModelIndex) -> Qt.ItemFlag:
|
||||
flags = super().flags(index)
|
||||
|
||||
if not index.isValid():
|
||||
return flags
|
||||
|
||||
node = index.internalPointer()
|
||||
|
||||
# Make the document root node editable
|
||||
if (isinstance(node, DocumentTreeNode)
|
||||
and (isinstance(node.value, CoreDocument) or isinstance(node.value, Component))):
|
||||
flags |= Qt.ItemFlag.ItemIsEditable
|
||||
|
||||
return flags
|
||||
|
||||
def _build_tree(self, document: CoreDocument) -> DocumentTreeNode:
|
||||
# QT's invisible root
|
||||
root = DocumentTreeNode(
|
||||
@@ -110,7 +135,7 @@ class DocumentTreeModel(QAbstractItemModel):
|
||||
for component_id, component in components.items():
|
||||
component_node = DocumentTreeNode(
|
||||
name = component.name,
|
||||
value = (component_id, component),
|
||||
value = component,
|
||||
parent = root,
|
||||
children = []
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user