UI-Verbesserung: Automatisches Laden von Diff-PDFs bei Tree-Selektion

Änderungen:
- Diff-PDFs werden automatisch im Viewer geladen wenn XML-Knoten ausgewählt wird
- Viewer wird geleert wenn Knoten ohne Diff-PDF ausgewählt wird
- Diff-Icon ist nicht mehr klickbar, dient nur noch als visueller Indikator
- Tree-Selection-Handler (_on_tree_selection_changed) implementiert
- XSL-ID wird nun auch in XML-Items gespeichert für direkten Zugriff
- Debug-Logging hinzugefügt für bessere Fehlersuche

Verhalten:
- Nutzer kann durch den Baum navigieren
- Bei Auswahl eines XML-Knotens mit Diff-PDF: automatisches Laden
- Bei Auswahl eines Knotens ohne Diff-PDF: Viewer leeren
- Tooltip angepasst: "Diff-PDF vorhanden (wird automatisch geladen bei Selektion)"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 13:25:22 +01:00
parent 1da550879e
commit 5316c37d26
+76 -8
View File
@@ -614,7 +614,11 @@ class MainWindow(QMainWindow):
# Aktiviere Kontextmenü für das TreeWidget # Aktiviere Kontextmenü für das TreeWidget
self.ui.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.ui.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.ui.treeWidget.customContextMenuRequested.connect(self._show_tree_context_menu) self.ui.treeWidget.customContextMenuRequested.connect(self._show_tree_context_menu)
logger.debug("Kontextmenü für TreeWidget eingerichtet")
# Verbinde Selection-Changed-Signal für automatisches Laden von Diff-PDFs
self.ui.treeWidget.itemSelectionChanged.connect(self._on_tree_selection_changed)
logger.debug("Kontextmenü und Selection-Handler für TreeWidget eingerichtet")
def _setup_tree_widget_styling(self): def _setup_tree_widget_styling(self):
"""Richtet das Styling für das TreeWidget ein, um den vertikalen Abstand zu vergrößern.""" """Richtet das Styling für das TreeWidget ein, um den vertikalen Abstand zu vergrößern."""
@@ -671,6 +675,70 @@ class MainWindow(QMainWindow):
global_pos = self.ui.treeWidget.mapToGlobal(position) global_pos = self.ui.treeWidget.mapToGlobal(position)
context_menu.exec(global_pos) context_menu.exec(global_pos)
def _on_tree_selection_changed(self):
"""
Handler für Änderungen der Tree-Selektion.
Lädt automatisch Diff-PDFs wenn ein XML-Knoten mit Diff-PDF ausgewählt wird.
Leert den Viewer wenn ein Knoten ohne Diff-PDF ausgewählt wird.
"""
try:
logger.debug("Tree-Selektion geändert")
# Hole aktuell selektierte Items
selected_items = self.ui.treeWidget.selectedItems()
if not selected_items or not self.project:
# Keine Selektion oder kein Projekt - Viewer leeren
logger.debug(f"Keine Selektion oder kein Projekt: selected_items={len(selected_items) if selected_items else 0}, project={self.project is not None}")
if self.pdf_documents:
self._clear_pdf_viewer()
return
# Erstes selektiertes Item verwenden
item = selected_items[0]
# Prüfe ob es ein XML-Item ist
node_type = self._get_node_type_from_item(item)
logger.debug(f"Selektierter Node-Typ: {node_type}")
if node_type == "XmlFile":
# 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)
logger.debug(f"XML-File-Daten: xml_file_obj={xml_file_obj}, xsl_id_str={xsl_id_str}")
if xml_file_obj and xsl_id_str:
# Extrahiere Pfad aus XmlFile-Objekt
xml_file_path = xml_file_obj.xml
# Prüfe ob Diff-PDF existiert
xml_stem = xml_file_path.stem
pdf_basename = f"{xml_stem}_xsl_{xsl_id_str}.pdf"
diff_pdf_path = self.project.project_dir / "diff" / pdf_basename
logger.debug(f"Prüfe Diff-PDF: {diff_pdf_path}, existiert={diff_pdf_path.exists()}")
if diff_pdf_path.exists():
# Diff-PDF vorhanden - automatisch laden
logger.info(f"XML-Knoten mit Diff-PDF ausgewählt: {pdf_basename}, lade automatisch")
self._load_pdf_for_comparison(xml_file_path, xsl_id_str)
else:
# Kein Diff-PDF - Viewer leeren falls noch ein PDF geladen ist
if self.pdf_documents:
logger.debug(f"XML-Knoten ohne Diff-PDF ausgewählt, leere Viewer")
self._clear_pdf_viewer()
else:
logger.debug("XML-File-Daten fehlen (xml_file_obj oder xsl_id_str ist None)")
else:
# Kein XML-Item - Viewer leeren falls noch ein PDF geladen ist
if self.pdf_documents:
logger.debug(f"Nicht-XML-Knoten ausgewählt ({node_type}), leere Viewer")
self._clear_pdf_viewer()
except Exception as e:
logger.error(f"Fehler beim Verarbeiten der Tree-Selektion: {e}", exc_info=True)
def _get_node_type_from_item(self, item): def _get_node_type_from_item(self, item):
""" """
Bestimmt den Node-Typ basierend auf dem TreeWidgetItem. Bestimmt den Node-Typ basierend auf dem TreeWidgetItem.
@@ -1234,6 +1302,10 @@ class MainWindow(QMainWindow):
xml_item.setData(0, Qt.ItemDataRole.UserRole, xml) xml_item.setData(0, Qt.ItemDataRole.UserRole, xml)
xml_item.setData(0, Qt.ItemDataRole.UserRole + 1, f"xml_{xml.xml.name}") xml_item.setData(0, Qt.ItemDataRole.UserRole + 1, f"xml_{xml.xml.name}")
# Speichere XSL-ID in Spalte 1, UserRole für einfachen Zugriff
xsl_id_str = "_".join(str(x) for x in node.id)
xml_item.setData(1, Qt.ItemDataRole.UserRole, xsl_id_str)
item.addChild(xml_item) item.addChild(xml_item)
# Speichere XML-Item für spätere Widget-Updates (Progress Bar, Icon) # Speichere XML-Item für spätere Widget-Updates (Progress Bar, Icon)
@@ -1281,14 +1353,14 @@ class MainWindow(QMainWindow):
def _create_centered_diff_icon(self, xml_file_path: Path, xsl_id_str: str) -> QWidget: def _create_centered_diff_icon(self, xml_file_path: Path, xsl_id_str: str) -> QWidget:
""" """
Erstellt ein linksbündiges, klickbares Icon für Diff-PDF. Erstellt ein linksbündiges, nicht-klickbares Icon für Diff-PDF.
Args: Args:
xml_file_path: Pfad zur XML-Datei (relativ) xml_file_path: Pfad zur XML-Datei (relativ)
xsl_id_str: XSL-ID als String (z.B. "2002_1_128") xsl_id_str: XSL-ID als String (z.B. "2002_1_128")
Returns: Returns:
QWidget: Container mit klickbarem Icon QWidget: Container mit Icon
""" """
# Container-Widget # Container-Widget
container = QWidget() container = QWidget()
@@ -1305,11 +1377,7 @@ class MainWindow(QMainWindow):
if icon.isNull(): if icon.isNull():
icon = QIcon.fromTheme("system-search") # Letzter Fallback icon = QIcon.fromTheme("system-search") # Letzter Fallback
icon_label.setPixmap(icon.pixmap(16, 16)) icon_label.setPixmap(icon.pixmap(16, 16))
icon_label.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) icon_label.setToolTip("Diff-PDF vorhanden (wird automatisch geladen bei Selektion)")
icon_label.setToolTip("Diff-PDF in Viewer laden")
# Klick-Event für Icon (Einfacher Klick lädt PDF in Viewer)
icon_label.mousePressEvent = lambda event: self._load_pdf_for_comparison(xml_file_path, xsl_id_str)
layout.addWidget(icon_label) layout.addWidget(icon_label)