From 5316c37d2685c13ac71ec28fb6a677d00c035944 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Fri, 26 Dec 2025 13:25:22 +0100 Subject: [PATCH] UI-Verbesserung: Automatisches Laden von Diff-PDFs bei Tree-Selektion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ä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 --- src/ui/MainWindow.py | 84 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index ef8939f..58cfb05 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -614,7 +614,11 @@ class MainWindow(QMainWindow): # Aktiviere Kontextmenü für das TreeWidget self.ui.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) 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): """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) 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): """ 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 + 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) # 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: """ - Erstellt ein linksbündiges, klickbares Icon für Diff-PDF. + Erstellt ein linksbündiges, nicht-klickbares Icon für Diff-PDF. Args: xml_file_path: Pfad zur XML-Datei (relativ) xsl_id_str: XSL-ID als String (z.B. "2002_1_128") Returns: - QWidget: Container mit klickbarem Icon + QWidget: Container mit Icon """ # Container-Widget container = QWidget() @@ -1305,11 +1377,7 @@ class MainWindow(QMainWindow): if icon.isNull(): icon = QIcon.fromTheme("system-search") # Letzter Fallback icon_label.setPixmap(icon.pixmap(16, 16)) - icon_label.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) - 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) + icon_label.setToolTip("Diff-PDF vorhanden (wird automatisch geladen bei Selektion)") layout.addWidget(icon_label)