src\MainWindow.py formatiert
This commit is contained in:
+44
-44
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user