Feature: Expand-Status von Tree-Knoten bei jedem Speichern persistent sichern
- ProjectData um optionales Feld 'expanded_nodes' erweitert (abwärtskompatibel) - _save_project_settings() speichert nun automatisch den Expand-Status - Expand-Status wird bei allen Speicheroperationen gesichert: * Beim Bearbeiten von TreeNodes und XslFiles * Bei Drag&Drop-Operationen im Tree * Bei Hash-Berechnungen für XML-Dateien * Beim Laden von Daten aus der Datenbank * Beim Beenden der Anwendung - Beim Laden eines Projekts werden aufgeklappte Knoten wiederhergestellt - Rekursive Speicherung und Wiederherstellung für TreeNode und XslFile - Umfassendes Logging für Debugging und Fehlerbehandlung
This commit is contained in:
@@ -519,6 +519,9 @@ class TreeManagerMixin:
|
||||
self._update_all_diff_pdf_counts()
|
||||
self._update_diff_icons_for_existing_pdfs()
|
||||
|
||||
# Stelle Expand-Status wieder her
|
||||
self._restore_expanded_state()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Laden der Nodes in TreeWidget: {e}")
|
||||
|
||||
@@ -1177,6 +1180,9 @@ class TreeManagerMixin:
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
# Speichere Expand-Status der Tree-Knoten vor dem Schreiben
|
||||
self._save_expanded_state()
|
||||
|
||||
# Speichere in project.yaml im Projekt-Verzeichnis
|
||||
self.pdf_project.writeSettings(project_dir=self.project.project_dir)
|
||||
|
||||
@@ -1186,3 +1192,100 @@ class TreeManagerMixin:
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Speichern der Projekt-Einstellungen: {e}")
|
||||
raise
|
||||
|
||||
def _save_expanded_state(self):
|
||||
"""
|
||||
Speichert die IDs aller aufgeklappten Knoten (TreeNode und XslFile) in den Projekteinstellungen.
|
||||
"""
|
||||
if not hasattr(self, "pdf_project") or not self.pdf_project:
|
||||
logger.warning("Keine Projekt-Einstellungen zum Speichern des Expand-Status")
|
||||
return
|
||||
|
||||
try:
|
||||
expanded_node_ids = []
|
||||
|
||||
# Durchlaufe alle Top-Level-Items
|
||||
root_count = self.ui.treeWidget.topLevelItemCount()
|
||||
for i in range(root_count):
|
||||
item = self.ui.treeWidget.topLevelItem(i)
|
||||
self._collect_expanded_items(item, expanded_node_ids)
|
||||
|
||||
# Speichere in Projekteinstellungen
|
||||
self.pdf_project.expanded_nodes = expanded_node_ids
|
||||
logger.info(f"Expand-Status gespeichert: {len(expanded_node_ids)} aufgeklappte Knoten")
|
||||
logger.debug(f"Aufgeklappte Knoten-IDs: {expanded_node_ids}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Speichern des Expand-Status: {e}")
|
||||
|
||||
def _collect_expanded_items(self, item: QTreeWidgetItem, expanded_ids: list):
|
||||
"""
|
||||
Sammelt rekursiv die IDs aller aufgeklappten Items.
|
||||
|
||||
Args:
|
||||
item: Das zu prüfende TreeWidgetItem
|
||||
expanded_ids: Liste zum Sammeln der IDs
|
||||
"""
|
||||
# Hole Node-Objekt
|
||||
node = item.data(0, Qt.ItemDataRole.UserRole)
|
||||
if not node:
|
||||
return
|
||||
|
||||
# Wenn Item aufgeklappt ist, speichere ID
|
||||
if item.isExpanded() and hasattr(node, "id"):
|
||||
expanded_ids.append(node.id)
|
||||
|
||||
# Rekursiv alle Kinder durchlaufen
|
||||
child_count = item.childCount()
|
||||
for i in range(child_count):
|
||||
child_item = item.child(i)
|
||||
self._collect_expanded_items(child_item, expanded_ids)
|
||||
|
||||
def _restore_expanded_state(self):
|
||||
"""
|
||||
Stellt den Expand-Status aller Knoten aus den Projekteinstellungen wieder her.
|
||||
"""
|
||||
if not hasattr(self, "pdf_project") or not self.pdf_project:
|
||||
logger.warning("Keine Projekt-Einstellungen zum Wiederherstellen des Expand-Status")
|
||||
return
|
||||
|
||||
if not self.pdf_project.expanded_nodes:
|
||||
logger.debug("Keine gespeicherten Expand-Status-Informationen vorhanden")
|
||||
return
|
||||
|
||||
try:
|
||||
expanded_node_ids = set(self.pdf_project.expanded_nodes)
|
||||
logger.info(f"Stelle Expand-Status wieder her: {len(expanded_node_ids)} Knoten")
|
||||
logger.debug(f"Aufzuklappende Knoten-IDs: {list(expanded_node_ids)}")
|
||||
|
||||
# Durchlaufe alle Top-Level-Items
|
||||
root_count = self.ui.treeWidget.topLevelItemCount()
|
||||
for i in range(root_count):
|
||||
item = self.ui.treeWidget.topLevelItem(i)
|
||||
self._expand_items_by_id(item, expanded_node_ids)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Wiederherstellen des Expand-Status: {e}")
|
||||
|
||||
def _expand_items_by_id(self, item: QTreeWidgetItem, expanded_ids: set):
|
||||
"""
|
||||
Klappt Items rekursiv auf, wenn ihre ID in expanded_ids enthalten ist.
|
||||
|
||||
Args:
|
||||
item: Das zu prüfende TreeWidgetItem
|
||||
expanded_ids: Set der IDs, die aufgeklappt werden sollen
|
||||
"""
|
||||
# Hole Node-Objekt
|
||||
node = item.data(0, Qt.ItemDataRole.UserRole)
|
||||
if not node or not hasattr(node, "id"):
|
||||
return
|
||||
|
||||
# Wenn ID in der Liste ist, klappe Item auf
|
||||
if node.id in expanded_ids:
|
||||
item.setExpanded(True)
|
||||
|
||||
# Rekursiv alle Kinder durchlaufen
|
||||
child_count = item.childCount()
|
||||
for i in range(child_count):
|
||||
child_item = item.child(i)
|
||||
self._expand_items_by_id(child_item, expanded_ids)
|
||||
|
||||
Reference in New Issue
Block a user