From 7426d9c50d9bcff3c53b70abcdb60001ecc65bac Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Wed, 28 May 2025 19:30:37 +0200 Subject: [PATCH] src\MainWindow.py formatiert --- src/MainWindow.py | 88 +++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/MainWindow.py b/src/MainWindow.py index 9faec63..d5a1fc6 100644 --- a/src/MainWindow.py +++ b/src/MainWindow.py @@ -3,7 +3,7 @@ import os import pymupdf # PyMuPDF from PySide6.QtCore import Qt -from PySide6.QtGui import QCursor, QPixmap, QImage, QPainter, QAction, QIcon +from PySide6.QtGui import QCursor, QPixmap, QImage, QPainter, QAction from PySide6.QtWidgets import QLabel, QMainWindow, QApplication, QStyleFactory from ui.MainWinddow_ui import Ui_MainWindow @@ -54,49 +54,49 @@ class MainWindow(QMainWindow): # Hole alle verfügbaren Themes available_themes = QStyleFactory.keys() current_theme = QApplication.style().objectName() - + print(f"Verfügbare Themes: {available_themes}") print(f"Aktuelles Theme: {current_theme}") - + # Füge Theme-Aktionen zum Menü hinzu for theme_name in available_themes: action = QAction(theme_name, self) action.setCheckable(True) - + # Markiere das aktuelle Theme if theme_name.lower() == current_theme.lower(): action.setChecked(True) - + # Verbinde die Aktion mit der Theme-Wechsel-Funktion action.triggered.connect(lambda checked, theme=theme_name: self.change_theme(theme)) - + # Füge die Aktion zum Theme-Menü hinzu self.ui.menuThema.addAction(action) def change_theme(self, theme_name): """ Wechselt das Theme der Anwendung. - + Args: theme_name: Name des zu verwendenden Themes """ print(f"Wechsle zu Theme: {theme_name}") - + try: # Erstelle den neuen Style style = QStyleFactory.create(theme_name) if style: # Wende den neuen Style auf die Anwendung an QApplication.setStyle(style) - + # Aktualisiere die Checkmarks im Menü for action in self.ui.menuThema.actions(): action.setChecked(action.text() == theme_name) - + print(f"Theme erfolgreich gewechselt zu: {theme_name}") else: print(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden") - + except Exception as e: print(f"Fehler beim Wechseln des Themes: {e}") @@ -115,7 +115,7 @@ class MainWindow(QMainWindow): # Basis-Pfad zu den PDF-Ordnern base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) pdf_base_dir = os.path.join(base_dir, "src", "ui", "res", "pdf") - + diff_dir = os.path.join(pdf_base_dir, "diff") ref_dir = os.path.join(pdf_base_dir, "ref") new_dir = os.path.join(pdf_base_dir, "new") @@ -167,10 +167,10 @@ class MainWindow(QMainWindow): diff_page = diff_doc[page_num] ref_page = ref_doc[page_num] new_page = new_doc[page_num] - + # Seiten in hoher Auflösung rendern matrix = pymupdf.Matrix(2.0, 2.0) # 2x Vergrößerung für bessere Qualität - + # Diff-Seite für Thumbnail verwenden diff_pix = diff_page.get_pixmap(matrix=matrix) diff_img_data = diff_pix.tobytes("png") @@ -196,9 +196,9 @@ class MainWindow(QMainWindow): thumbnail.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) thumbnail.setMouseTracking(True) self.ui.verticalLayout_2.addWidget(thumbnail) - + # Seitennumer für Thumbnail anzeigen - thumbnail_label = QLabel(f"Seite: {page_num+1}") + thumbnail_label = QLabel(f"Seite: {page_num + 1}") thumbnail_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.verticalLayout_2.addWidget(thumbnail_label) @@ -207,9 +207,9 @@ class MainWindow(QMainWindow): fullsize.setObjectName(f"fullsize_{pdf_filename}_page_{page_num + 1}") fullsize.setAlignment(Qt.AlignmentFlag.AlignHCenter) # Horizontale Zentrierung self.ui.verticalLayout_3.addWidget(fullsize) - + # Seitennumer für Vollansich anzeigen - fullsize_label = QLabel(f"Seite: {page_num+1}") + fullsize_label = QLabel(f"Seite: {page_num + 1}") fullsize_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.verticalLayout_3.addWidget(fullsize_label) @@ -221,13 +221,13 @@ class MainWindow(QMainWindow): # Click-Event für das Thumbnail einrichten thumbnail.mousePressEvent = lambda event, t=thumbnail: self.on_thumbnail_clicked(event, t) - + # Drag-to-Scroll Events für große Bilder einrichten fullsize.mousePressEvent = lambda event, f=fullsize: self.on_fullsize_mouse_press(event, f) fullsize.mouseMoveEvent = lambda event, f=fullsize: self.on_fullsize_mouse_move(event, f) fullsize.mouseReleaseEvent = lambda event, f=fullsize: self.on_fullsize_mouse_release(event, f) - - print(f"Seite {page_num+1} gerendert.") + + print(f"Seite {page_num + 1} gerendert.") # PDF-Dokumente schließen diff_doc.close() @@ -256,14 +256,14 @@ class MainWindow(QMainWindow): # Zoom-Slider verbinden self.ui.zoom.valueChanged.connect(self.apply_zoom) - + # Alpha-Slider verbinden self.ui.alpha.valueChanged.connect(self.on_alpha_changed) def on_alpha_changed(self, alpha_value): """ Wird ausgeführt, wenn der Alpha-Slider geändert wird. - + Args: alpha_value: Der neue Alpha-Wert (-100 bis 100) """ @@ -273,22 +273,22 @@ class MainWindow(QMainWindow): def update_layered_images(self): """Aktualisiert alle überlagerten Bilder basierend auf dem aktuellen Alpha-Wert.""" alpha_value = self.ui.alpha.value() - + for fullsize_label in self.ref_pixmaps.keys(): # Hole die Original-Pixmaps für alle drei Ebenen ref_pixmap = self.ref_pixmaps[fullsize_label] diff_pixmap = self.diff_pixmaps[fullsize_label] new_pixmap = self.new_pixmaps[fullsize_label] - + # Erstelle das überlagerte Bild layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value) - + # Wende aktuellen Zoom an zoom_factor = self.current_zoom / 100.0 if zoom_factor != 1.0: new_width = int(layered_pixmap.width() * zoom_factor) layered_pixmap = layered_pixmap.scaledToWidth(new_width, Qt.TransformationMode.SmoothTransformation) - + # Setze das überlagerte Bild fullsize_label.setPixmap(layered_pixmap) fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) @@ -296,27 +296,27 @@ class MainWindow(QMainWindow): def create_layered_pixmap(self, ref_pixmap, diff_pixmap, new_pixmap, alpha_value): """ Erstellt ein übergelagertes Pixmap basierend auf dem Alpha-Wert. - + Args: ref_pixmap: Unterste Ebene (ref) diff_pixmap: Mittlere Ebene (diff) new_pixmap: Oberste Ebene (new) alpha_value: Alpha-Wert (-100 bis 100) - + Returns: QPixmap: Das überlagerte Bild """ # Verwende die Größe des größten Bildes max_width = max(ref_pixmap.width(), diff_pixmap.width(), new_pixmap.width()) max_height = max(ref_pixmap.height(), diff_pixmap.height(), new_pixmap.height()) - + # Erstelle ein leeres Pixmap für das Ergebnis result = QPixmap(max_width, max_height) result.fill(Qt.GlobalColor.white) - + painter = QPainter(result) painter.setRenderHint(QPainter.RenderHint.Antialiasing) - + if alpha_value <= 0: # Alpha von -100 bis 0: Übergang von ref zu diff # ref_opacity: 1.0 bei -100, 0.0 bei 0 @@ -331,20 +331,20 @@ class MainWindow(QMainWindow): ref_opacity = 0.0 diff_opacity = 1.0 - alpha_value / 100.0 new_opacity = alpha_value / 100.0 - + # Zeichne die Ebenen mit entsprechender Transparenz if ref_opacity > 0: painter.setOpacity(ref_opacity) painter.drawPixmap(0, 0, ref_pixmap) - + if diff_opacity > 0: painter.setOpacity(diff_opacity) painter.drawPixmap(0, 0, diff_pixmap) - + if new_opacity > 0: painter.setOpacity(new_opacity) painter.drawPixmap(0, 0, new_pixmap) - + painter.end() return result @@ -384,7 +384,7 @@ class MainWindow(QMainWindow): def on_fullsize_mouse_press(self, event, fullsize_label): """ Wird ausgeführt, wenn die Maustaste auf einem großen Bild gedrückt wird. - + Args: event: Das Maus-Event fullsize_label: Das große Bild-Label @@ -398,7 +398,7 @@ class MainWindow(QMainWindow): def on_fullsize_mouse_move(self, event, fullsize_label): """ Wird ausgeführt, wenn die Maus über einem großen Bild bewegt wird. - + Args: event: Das Maus-Event fullsize_label: Das große Bild-Label @@ -407,31 +407,31 @@ class MainWindow(QMainWindow): # Verwende globale Position für bessere 4K/DPI Kompatibilität current_pos = event.globalPosition().toPoint() delta = current_pos - self.last_drag_position - + # Prüfe ob die Bewegung groß genug ist (Anti-Jitter) if abs(delta.x()) >= self.drag_threshold or abs(delta.y()) >= self.drag_threshold: # Hole die aktuellen Scroll-Balken v_scrollbar = self.ui.scrollArea_2.verticalScrollBar() h_scrollbar = self.ui.scrollArea_2.horizontalScrollBar() - + # Berechne neue Scroll-Positionen mit reduzierter Empfindlichkeit scroll_delta_y = int(-delta.y() * self.scroll_sensitivity) scroll_delta_x = int(-delta.x() * self.scroll_sensitivity) - + new_v_value = v_scrollbar.value() + scroll_delta_y new_h_value = h_scrollbar.value() + scroll_delta_x - + # Setze die neuen Scroll-Positionen v_scrollbar.setValue(new_v_value) h_scrollbar.setValue(new_h_value) - + # Aktualisiere die letzte Position nur bei erfolgreichem Scroll self.last_drag_position = current_pos def on_fullsize_mouse_release(self, event, fullsize_label): """ Wird ausgeführt, wenn die Maustaste auf einem großen Bild losgelassen wird. - + Args: event: Das Maus-Event fullsize_label: Das große Bild-Label