Refactor: Stringly-typed Knotentypen durch ItemType-Enum ersetzt

ItemType(Enum) mit TREE_NODE, XSL_FILE, XML_FILE, UNKNOWN statt
String-Konstanten in tree_manager.py. Verbessert Typsicherheit und IDE-Support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-09 20:08:23 +01:00
parent 22bc693d4d
commit b954106a0d
+23 -15
View File
@@ -11,6 +11,7 @@ Dieses Mixin enthält alle Methoden für die Verwaltung des TreeWidgets im MainW
import logging
import shutil
import time
from enum import Enum, auto
from pathlib import Path
from PySide6.QtCore import Qt
@@ -31,6 +32,13 @@ from ui.TreeNodeEditDialog import TreeNodeEditDialog
from ui.XslFileEditDialog import XslFileEditDialog
class ItemType(Enum):
TREE_NODE = auto()
XSL_FILE = auto()
XML_FILE = auto()
UNKNOWN = auto()
logger = logging.getLogger(__name__)
@@ -68,7 +76,7 @@ class TreeManagerMixin:
if not item:
# Kein Item gefunden - zeige Kontextmenü für Root-Elemente
node_type = "Unknown"
node_type = ItemType.UNKNOWN
context_menu = self._create_context_menu_for_type(node_type, None)
else:
# Bestimme den Node-Typ basierend auf dem Item
@@ -109,7 +117,7 @@ class TreeManagerMixin:
node_type = self._get_node_type_from_item(item)
logger.debug(f"Selektierter Node-Typ: {node_type}")
if node_type == "XmlFile":
if node_type == ItemType.XML_FILE:
# Hole XmlFile-Objekt und XSL-ID aus UserRole
xml_file_obj = item.data(0, Qt.ItemDataRole.UserRole)
xsl_id_str = item.data(1, Qt.ItemDataRole.UserRole)
@@ -165,13 +173,13 @@ class TreeManagerMixin:
# Child-Item - prüfe ob es ein XML-File ist
text = item.text(0)
if text.startswith("XML:"):
return "XmlFile"
return ItemType.XML_FILE
else:
# Könnte ein TreeNode-Child oder XslFile-Child sein
# Prüfe den Parent-Typ
parent_type = self._get_node_type_from_item(parent_item)
if parent_type == "XslFile":
return "XmlFile"
if parent_type == ItemType.XSL_FILE:
return ItemType.XML_FILE
else:
# Rekursiv bestimmen basierend auf gespeicherten Daten
return self._determine_node_type_from_data(item)
@@ -181,7 +189,7 @@ class TreeManagerMixin:
except Exception as e:
logger.error(f"Fehler beim Bestimmen des Node-Typs: {e}")
return "Unknown"
return ItemType.UNKNOWN
def _determine_node_type_from_data(self, item):
"""
@@ -197,21 +205,21 @@ class TreeManagerMixin:
# Hole das gespeicherte Node-Objekt direkt
node = item.data(0, Qt.ItemDataRole.UserRole)
if not node:
return "Unknown"
return ItemType.UNKNOWN
# Bestimme den Typ direkt vom Node-Objekt
if isinstance(node, TreeNode):
return "TreeNode"
return ItemType.TREE_NODE
elif isinstance(node, XslFile):
return "XslFile"
return ItemType.XSL_FILE
elif isinstance(node, XmlFile):
return "XmlFile"
return ItemType.XML_FILE
return "Unknown"
return ItemType.UNKNOWN
except Exception as e:
logger.error(f"Fehler beim Bestimmen des Node-Typs aus Daten: {e}")
return "Unknown"
return ItemType.UNKNOWN
def _find_item_by_node(self, node_obj):
"""
@@ -284,7 +292,7 @@ class TreeManagerMixin:
try:
menu = QMenu(self)
if node_type == "TreeNode":
if node_type == ItemType.TREE_NODE:
# Kontextmenü für TreeNode
action_add_child = QAction("Unterknoten hinzufügen", self)
action_add_child.setIcon(QIcon(QIcon.fromTheme("folder-new")))
@@ -338,7 +346,7 @@ class TreeManagerMixin:
action_delete.triggered.connect(lambda: self._delete_tree_node(item))
menu.addAction(action_delete)
elif node_type == "XslFile":
elif node_type == ItemType.XSL_FILE:
# Kontextmenü für XslFile
action_add_xml = QAction("XML-Datei hinzufügen", self)
action_add_xml.setIcon(QIcon(QIcon.fromTheme("document-new")))
@@ -387,7 +395,7 @@ class TreeManagerMixin:
action_delete.triggered.connect(lambda: self._delete_xsl_file(item))
menu.addAction(action_delete)
elif node_type == "XmlFile":
elif node_type == ItemType.XML_FILE:
# Kontextmenü für XmlFile
# Transformations-Aktionen
action_transform = QAction("Transformieren", self)