From d914e9b06a90472fdb0961ce6680d580597bf40c Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Fri, 2 Jan 2026 20:11:56 +0100 Subject: [PATCH] =?UTF-8?q?Feature:=20Buttons=20zum=20=C3=96ffnen=20von=20?= =?UTF-8?q?Ref-=20und=20New-PDFs=20im=20System-Viewer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue Buttons im PDF-Vergleichs-Viewer: - "Vorher (Referenz)" Button öffnet Referenz-PDF im System-PDF-Viewer - "Nachher (Neu)" Button öffnet neue PDF im System-PDF-Viewer - Beide Buttons sind initial deaktiviert - Automatische Aktivierung beim Laden von Diff-PDFs - Automatische Deaktivierung beim Leeren des Viewers Implementierung: - Neue Instanzvariablen: current_ref_pdf_path, current_new_pdf_path - Handler-Methoden: _on_view_ref_pdf_clicked(), _on_view_new_pdf_clicked() - QDesktopServices.openUrl() für plattformunabhängiges Öffnen - Fehlerbehandlung und Logging UI-Änderungen: - Buttons in MainWinddow.ui hinzugefügt (view_ref_pdf, view_new_pdf) - MainWinddow_ui.py automatisch generiert 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- src/ui/MainWinddow.ui | 19 +++++++++++-- src/ui/MainWinddow_ui.py | 25 +++++++++++------ src/ui/MainWindow.py | 60 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 92 insertions(+), 12 deletions(-) diff --git a/src/ui/MainWinddow.ui b/src/ui/MainWinddow.ui index 9ae505f..a165852 100644 --- a/src/ui/MainWinddow.ui +++ b/src/ui/MainWinddow.ui @@ -278,7 +278,10 @@ - + + + false + Vorher (Referenz) @@ -286,6 +289,9 @@ + + Doppelklick um diesen Slider auf Mitte zu stellen + -100 @@ -298,7 +304,10 @@ - + + + false + Nachher (Neu) @@ -326,6 +335,9 @@ + + Doppelklick um den Zoom zurückzusetzen + 25 @@ -381,6 +393,9 @@ + + true + QFrame::Shape::NoFrame diff --git a/src/ui/MainWinddow_ui.py b/src/ui/MainWinddow_ui.py index b149c1c..dde5b1b 100644 --- a/src/ui/MainWinddow_ui.py +++ b/src/ui/MainWinddow_ui.py @@ -169,10 +169,11 @@ class Ui_MainWindow(object): self.horizontalLayout_3.addItem(self.horizontalSpacer_4) - self.label_6 = QLabel(self.frame_4) - self.label_6.setObjectName(u"label_6") + self.view_ref_pdf = QPushButton(self.frame_4) + self.view_ref_pdf.setObjectName(u"view_ref_pdf") + self.view_ref_pdf.setEnabled(False) - self.horizontalLayout_3.addWidget(self.label_6) + self.horizontalLayout_3.addWidget(self.view_ref_pdf) self.alpha = QSlider(self.frame_4) self.alpha.setObjectName(u"alpha") @@ -182,10 +183,11 @@ class Ui_MainWindow(object): self.horizontalLayout_3.addWidget(self.alpha) - self.label_7 = QLabel(self.frame_4) - self.label_7.setObjectName(u"label_7") + self.view_new_pdf = QPushButton(self.frame_4) + self.view_new_pdf.setObjectName(u"view_new_pdf") + self.view_new_pdf.setEnabled(False) - self.horizontalLayout_3.addWidget(self.label_7) + self.horizontalLayout_3.addWidget(self.view_new_pdf) self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) @@ -224,6 +226,7 @@ class Ui_MainWindow(object): self.scrollArea_2 = QScrollArea(self.frame_3) self.scrollArea_2.setObjectName(u"scrollArea_2") + self.scrollArea_2.setEnabled(True) self.scrollArea_2.setFrameShape(QFrame.Shape.NoFrame) self.scrollArea_2.setFrameShadow(QFrame.Shadow.Raised) self.scrollArea_2.setWidgetResizable(True) @@ -287,9 +290,15 @@ class Ui_MainWindow(object): self.pB_lade_aus_fn2.setText(QCoreApplication.translate("MainWindow", u"lade aus FN2", None)) self.label.setText("") self.label_2.setText("") - self.label_6.setText(QCoreApplication.translate("MainWindow", u"Vorher (Referenz)", None)) - self.label_7.setText(QCoreApplication.translate("MainWindow", u"Nachher (Neu)", None)) + self.view_ref_pdf.setText(QCoreApplication.translate("MainWindow", u"Vorher (Referenz)", None)) +#if QT_CONFIG(tooltip) + self.alpha.setToolTip(QCoreApplication.translate("MainWindow", u"Doppelklick um diesen Slider auf Mitte zu stellen", None)) +#endif // QT_CONFIG(tooltip) + self.view_new_pdf.setText(QCoreApplication.translate("MainWindow", u"Nachher (Neu)", None)) self.label_5.setText(QCoreApplication.translate("MainWindow", u"Zoom", None)) +#if QT_CONFIG(tooltip) + self.zoom.setToolTip(QCoreApplication.translate("MainWindow", u"Doppelklick um den Zoom zur\u00fcckzusetzen", None)) +#endif // QT_CONFIG(tooltip) self.accept_changes.setText(QCoreApplication.translate("MainWindow", u"\u2705 \u00c4nderungen \u00fcbernehmen", None)) self.menuProjekt.setTitle(QCoreApplication.translate("MainWindow", u"Projekt", None)) self.menuThema.setTitle(QCoreApplication.translate("MainWindow", u"Thema", None)) diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 1197c6a..9b763e9 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -5,8 +5,8 @@ import hashlib import logging from typing import List -from PySide6.QtCore import Qt, QSize, QThread, Signal -from PySide6.QtGui import QCursor, QPixmap, QPainter, QAction, QIcon, QDragEnterEvent, QDropEvent +from PySide6.QtCore import Qt, QSize, QThread, Signal, QUrl +from PySide6.QtGui import QCursor, QPixmap, QPainter, QAction, QIcon, QDragEnterEvent, QDropEvent, QDesktopServices from PySide6.QtWidgets import ( QLabel, QMainWindow, @@ -508,6 +508,10 @@ class MainWindow(QMainWindow): self.current_diff_xml_path = None self.current_diff_xsl_id = None + # Pfade zu aktuellen Ref- und New-PDFs (für System-Viewer) + self.current_ref_pdf_path = None + self.current_new_pdf_path = None + # Cache für die aktuell gerenderten Pixmaps (Performance-Optimierung) self.current_rendered_pixmaps = None @@ -1108,6 +1112,10 @@ class MainWindow(QMainWindow): # Button "Accept Changes" verbinden self.ui.accept_changes.clicked.connect(self._on_accept_changes_clicked) + # Buttons zum Öffnen von PDFs im System-Viewer verbinden + self.ui.view_ref_pdf.clicked.connect(self._on_view_ref_pdf_clicked) + self.ui.view_new_pdf.clicked.connect(self._on_view_new_pdf_clicked) + def _setup_tree_context_menu(self): """Richtet das Kontextmenü für das TreeWidget ein.""" # Aktiviere Kontextmenü für das TreeWidget @@ -1958,6 +1966,14 @@ class MainWindow(QMainWindow): # PDF-Dokumente speichern self.pdf_documents[pdf_basename] = {"diff": diff_doc, "ref": ref_doc, "new": new_doc} + # PDF-Pfade für System-Viewer speichern + self.current_ref_pdf_path = ref_pdf_path + self.current_new_pdf_path = new_pdf_path + + # Buttons zum Öffnen der PDFs im System-Viewer aktivieren + self.ui.view_ref_pdf.setEnabled(True) + self.ui.view_new_pdf.setEnabled(True) + logger.info(f"PDFs geladen: {pdf_basename}") logger.info(f" diff: {diff_doc.pageCount()} Seiten") logger.info(f" ref: {ref_doc.pageCount()} Seiten") @@ -4640,6 +4656,12 @@ class MainWindow(QMainWindow): self.current_diff_xml_path = None self.current_diff_xsl_id = None + # PDF-Pfade zurücksetzen und Buttons deaktivieren + self.current_ref_pdf_path = None + self.current_new_pdf_path = None + self.ui.view_ref_pdf.setEnabled(False) + self.ui.view_new_pdf.setEnabled(False) + logger.info("PDF-Viewer geleert") def _on_accept_changes_clicked(self): @@ -4740,6 +4762,40 @@ class MainWindow(QMainWindow): logger.error(f"Fehler beim Akzeptieren der Änderungen: {e}") QMessageBox.critical(self, "Fehler", f"Fehler beim Akzeptieren der Änderungen:\n{str(e)}") + def _on_view_ref_pdf_clicked(self): + """ + Handler für view_ref_pdf Button. + Öffnet die Referenz-PDF im systemseitig installierten PDF-Viewer. + """ + if not self.current_ref_pdf_path or not self.current_ref_pdf_path.exists(): + QMessageBox.warning(self, "Fehler", "Referenz-PDF nicht gefunden") + logger.warning("Referenz-PDF nicht verfügbar") + return + + logger.info(f"Öffne Referenz-PDF im System-Viewer: {self.current_ref_pdf_path}") + url = QUrl.fromLocalFile(str(self.current_ref_pdf_path)) + if not QDesktopServices.openUrl(url): + QMessageBox.critical( + self, "Fehler", f"Konnte Referenz-PDF nicht öffnen:\n{self.current_ref_pdf_path}" + ) + logger.error(f"Fehler beim Öffnen der Referenz-PDF: {self.current_ref_pdf_path}") + + def _on_view_new_pdf_clicked(self): + """ + Handler für view_new_pdf Button. + Öffnet die neue PDF im systemseitig installierten PDF-Viewer. + """ + if not self.current_new_pdf_path or not self.current_new_pdf_path.exists(): + QMessageBox.warning(self, "Fehler", "Neue PDF nicht gefunden") + logger.warning("Neue PDF nicht verfügbar") + return + + logger.info(f"Öffne neue PDF im System-Viewer: {self.current_new_pdf_path}") + url = QUrl.fromLocalFile(str(self.current_new_pdf_path)) + if not QDesktopServices.openUrl(url): + 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 closeEvent(self, event): """Wird beim Schließen der Anwendung aufgerufen.""" # UI-Zustände speichern