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:
+76
-8
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user