From 5a2da7f264bd70930d8da65d6860a6ece571fa09 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Sun, 11 Jan 2026 16:30:09 +0100 Subject: [PATCH] =?UTF-8?q?Feature:=20Ref-PDF=20direkt=20aus=20Kontextmen?= =?UTF-8?q?=C3=BC=20=C3=B6ffnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neue Kontextmenü-Aktion "Ref-PDF öffnen" für XML-Dateien - Aktion nur aktiv wenn Ref-PDF existiert und keine Diff-PDF vorhanden - Öffnet Ref-PDF im System-PDF-Viewer via QDesktopServices - Handler-Methode _open_ref_pdf_for_xml_file() mit Fehlerbehandlung Co-Authored-By: Claude Sonnet 4.5 --- src/ui/MainWindow.py | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index da25a9e..683345a 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -1494,6 +1494,33 @@ class MainWindow(QMainWindow): menu.addSeparator() + # Ref-PDF öffnen Aktion (nur enabled wenn Ref-PDF existiert und keine Diff-PDF) + xml_file_obj = item.data(0, Qt.ItemDataRole.UserRole) + parent_item = item.parent() + ref_pdf_can_open = False + + if xml_file_obj and parent_item and self.project: + xsl_file_obj = parent_item.data(0, Qt.ItemDataRole.UserRole) + if xsl_file_obj: + # Erstelle Pfade zu Ref-PDF und Diff-PDF + xsl_id_str = "_".join(map(str, xsl_file_obj.id)) + xml_stem = xml_file_obj.xml.stem + pdf_basename = f"{xml_stem}_xsl_{xsl_id_str}.pdf" + + ref_pdf_path = self.project.project_dir / "ref" / pdf_basename + diff_pdf_path = self.project.project_dir / "diff" / pdf_basename + + # Ref-PDF kann geöffnet werden, wenn sie existiert und keine Diff-PDF vorhanden ist + ref_pdf_can_open = ref_pdf_path.exists() and not diff_pdf_path.exists() + + action_open_ref_pdf = QAction("Ref-PDF öffnen", self) + action_open_ref_pdf.setIcon(QIcon(QIcon.fromTheme("document-open"))) + action_open_ref_pdf.triggered.connect(lambda: self._open_ref_pdf_for_xml_file(item)) + action_open_ref_pdf.setEnabled(ref_pdf_can_open) + menu.addAction(action_open_ref_pdf) + + menu.addSeparator() + action_edit = QAction("Bearbeiten", self) action_edit.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentProperties))) action_edit.triggered.connect(lambda: self._edit_xml_file(item)) @@ -4846,6 +4873,66 @@ class MainWindow(QMainWindow): QMessageBox.critical(self, "Fehler", f"Konnte neue PDF nicht öffnen:\n{self.current_new_pdf_path}") logger.error(f"Fehler beim Öffnen der neuen PDF: {self.current_new_pdf_path}") + def _open_ref_pdf_for_xml_file(self, item): + """ + Handler für Kontextmenü-Aktion "Ref-PDF öffnen" bei XML-Dateien. + Öffnet die Referenz-PDF für die ausgewählte XML-Datei im systemseitig installierten PDF-Viewer. + + Args: + item: Das TreeWidgetItem der XML-Datei + """ + try: + if not self.project: + QMessageBox.warning(self, "Fehler", "Kein Projekt geöffnet") + return + + # Hole XML-Datei-Objekt + xml_file_obj = item.data(0, Qt.ItemDataRole.UserRole) + if not xml_file_obj: + QMessageBox.warning(self, "Fehler", "XML-Datei-Objekt nicht gefunden") + return + + # Hole Parent-Item (XslFile) + parent_item = item.parent() + if not parent_item: + QMessageBox.warning(self, "Fehler", "Parent-Item nicht gefunden") + return + + # Hole XslFile-Objekt + xsl_file_obj = parent_item.data(0, Qt.ItemDataRole.UserRole) + if not xsl_file_obj: + QMessageBox.warning(self, "Fehler", "XSL-Datei-Objekt nicht gefunden") + return + + # Erstelle XSL-ID-String + xsl_id_str = "_".join(map(str, xsl_file_obj.id)) + + # Ermittle PDF-Dateinamen + xml_file_path = xml_file_obj.xml + xml_stem = xml_file_path.stem + pdf_basename = f"{xml_stem}_xsl_{xsl_id_str}.pdf" + + # Pfad zur Ref-PDF + ref_dir = self.project.project_dir / "ref" + ref_pdf_path = ref_dir / pdf_basename + + # Prüfe ob Ref-PDF existiert + if not ref_pdf_path.exists(): + QMessageBox.warning(self, "Fehler", f"Referenz-PDF nicht gefunden:\n{pdf_basename}") + logger.warning(f"Referenz-PDF nicht gefunden: {ref_pdf_path}") + return + + # Öffne Ref-PDF im System-Viewer + logger.info(f"Öffne Referenz-PDF im System-Viewer: {ref_pdf_path}") + url = QUrl.fromLocalFile(str(ref_pdf_path)) + if not QDesktopServices.openUrl(url): + QMessageBox.critical(self, "Fehler", f"Konnte Referenz-PDF nicht öffnen:\n{ref_pdf_path}") + logger.error(f"Fehler beim Öffnen der Referenz-PDF: {ref_pdf_path}") + + except Exception as e: + logger.error(f"Fehler beim Öffnen der Referenz-PDF: {e}") + QMessageBox.critical(self, "Fehler", f"Fehler beim Öffnen der Referenz-PDF:\n{str(e)}") + def eventFilter(self, obj, event): """ Event-Filter für Zoom per STRG+Mausrad im PDF-Viewer.