diff --git a/src/MainWindow.py b/src/MainWindow.py index 1d0e41f..4373951 100644 --- a/src/MainWindow.py +++ b/src/MainWindow.py @@ -37,6 +37,9 @@ class MainWindow(QMainWindow): self.current_page = 0 self.current_pdf = None + # Cache für die aktuell gerenderten Pixmaps (Performance-Optimierung) + self.current_rendered_pixmaps = None + # Label für die Vollansicht (nur ein einziges Label) self.fullsize_label = None @@ -115,6 +118,7 @@ class MainWindow(QMainWindow): # Dicts zurücksetzen self.thumbnail_to_page = {} self.pdf_documents = {} + self.current_rendered_pixmaps = None # Basis-Pfad zu den PDF-Ordnern base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -231,6 +235,7 @@ class MainWindow(QMainWindow): def render_and_display_page(self, pdf_filename, page_num): """ Rendert und zeigt eine spezifische Seite in der Vollansicht an. + Cached die gerenderten Pixmaps für bessere Performance. Args: pdf_filename: Name der PDF-Datei @@ -269,29 +274,53 @@ class MainWindow(QMainWindow): new_qimg = QImage.fromData(new_img_data) new_pixmap = QPixmap.fromImage(new_qimg) - # Erstelle das überlagerte Bild - alpha_value = self.ui.alpha.value() - 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 - self.fullsize_label.setPixmap(layered_pixmap) - self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) + # Cache die gerenderten Pixmaps für schnelle Alpha/Zoom-Operationen + self.current_rendered_pixmaps = { + 'ref': ref_pixmap, + 'diff': diff_pixmap, + 'new': new_pixmap + } # Aktualisiere aktuelle Seite self.current_page = page_num self.current_pdf = pdf_filename - print(f"Seite {page_num + 1} erfolgreich angezeigt") + # Zeige das Bild mit aktuellem Alpha- und Zoom-Wert an + self.update_current_display() + + print(f"Seite {page_num + 1} erfolgreich gerendert und gecacht") except Exception as e: print(f"Fehler beim Rendern der Seite {page_num + 1}: {e}") + def update_current_display(self): + """ + Aktualisiert die Anzeige der aktuellen Seite basierend auf gecachten Pixmaps. + Verwendet für Alpha- und Zoom-Änderungen ohne erneutes PDF-Rendering. + """ + if not self.current_rendered_pixmaps: + print("Keine gerenderten Pixmaps verfügbar") + return + + # Hole die gecachten Pixmaps + ref_pixmap = self.current_rendered_pixmaps['ref'] + diff_pixmap = self.current_rendered_pixmaps['diff'] + new_pixmap = self.current_rendered_pixmaps['new'] + + # Erstelle das überlagerte Bild mit aktuellem Alpha-Wert + alpha_value = self.ui.alpha.value() + 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 + self.fullsize_label.setPixmap(layered_pixmap) + self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) + def _clear_layout(self, layout): """Entfernt alle Widgets aus einem Layout.""" if layout is not None: @@ -315,15 +344,17 @@ class MainWindow(QMainWindow): def on_alpha_changed(self, alpha_value): """ Wird ausgeführt, wenn der Alpha-Slider geändert wird. + Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering. Args: alpha_value: Der neue Alpha-Wert (-100 bis 100) """ print(f"Alpha geändert auf {alpha_value}") - # Nur die aktuell angezeigte Seite neu rendern start = time.time() - if self.current_pdf: - self.render_and_display_page(self.current_pdf, self.current_page) + + # Verwende gecachte Pixmaps für schnelle Alpha-Änderungen + self.update_current_display() + dauer = time.time() - start print(f"Dauer: {dauer}") @@ -403,6 +434,7 @@ class MainWindow(QMainWindow): def apply_zoom(self, zoom_value): """ Wendet den Zoom-Faktor auf das aktuelle Bild an. + Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering. Args: zoom_value: Der neue Zoom-Wert (in Prozent) @@ -410,9 +442,8 @@ class MainWindow(QMainWindow): self.current_zoom = zoom_value print(f"Zoom geändert auf {zoom_value}%") - # Nur die aktuell angezeigte Seite neu rendern - if self.current_pdf: - self.render_and_display_page(self.current_pdf, self.current_page) + # Verwende gecachte Pixmaps für schnelle Zoom-Änderungen + self.update_current_display() def on_fullsize_mouse_press(self, event, fullsize_label): """