diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index d398772..338480d 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -295,8 +295,8 @@ class MainWindow(QMainWindow): available_themes = QStyleFactory.keys() current_theme = QApplication.style().objectName() - print(f"Verfügbare Themes: {available_themes}") - print(f"Aktuelles Theme: {current_theme}") + logger.debug(f"Verfügbare Themes: {available_themes}") + logger.debug(f"Aktuelles Theme: {current_theme}") # Füge Theme-Aktionen zum Menü hinzu for theme_name in available_themes: @@ -342,7 +342,7 @@ class MainWindow(QMainWindow): # Setze das Untermenü für die Aktion self.ui.actionVorhandene_Projekte.setMenu(projects_menu) - print(f"Projekte-Menü initialisiert mit {len(app_settings.pdf_projects)} Projekten") + logger.info(f"Projekte-Menü initialisiert mit {len(app_settings.pdf_projects)} Projekten") def open_existing_project(self, project: Project): """ @@ -351,8 +351,8 @@ class MainWindow(QMainWindow): Args: project: Das zu öffnende PdfProject-Objekt """ - print(f"Öffne Projekt: {project.name}") - print(f"Projekt-Ordner: {project.project_dir}") + logger.info(f"Öffne Projekt: {project.name}") + logger.debug(f"Projekt-Ordner: {project.project_dir}") self.project = project @@ -363,15 +363,15 @@ class MainWindow(QMainWindow): if project_yaml_path.exists() and project_yaml_path.stat().st_size > 0: # Versuche die Projekt-Einstellungen zu laden self.pdf_project = ProjectData.readSettings(project_dir=project.project_dir) - print(f"Projekt-Einstellungen aus {project_yaml_path} geladen!") + logger.info(f"Projekt-Einstellungen aus {project_yaml_path} geladen!") else: # Erstelle Standard-Projekt-Einstellungen wenn Datei leer oder nicht vorhanden - print("project.yaml ist leer oder nicht vorhanden, erstelle Standard-Einstellungen") + logger.warning("project.yaml ist leer oder nicht vorhanden, erstelle Standard-Einstellungen") self.pdf_project = ProjectData() # Speichere die Standard-Einstellungen in die project.yaml self.pdf_project.writeSettings(project_dir=project.project_dir) - print(f"Standard-Projekt-Einstellungen in {project_yaml_path} gespeichert") + logger.info(f"Standard-Projekt-Einstellungen in {project_yaml_path} gespeichert") # Lade die Nodes in das TreeWidget (inkl. Diff-PDF-Counts und Icons) self._load_nodes_to_tree() @@ -380,15 +380,15 @@ class MainWindow(QMainWindow): self._start_xml_hash_calculation() except Exception as e: - print(f"Fehler beim Laden des Projekts '{project.name}': {e}") + logger.error(f"Fehler beim Laden des Projekts '{project.name}': {e}") # Fallback: Erstelle Standard-Einstellungen try: self.pdf_project = ProjectData() - print("Fallback: Standard-Projekt-Einstellungen erstellt") + logger.info("Fallback: Standard-Projekt-Einstellungen erstellt") # Auch bei Fallback die Nodes laden self._load_nodes_to_tree() except Exception as fallback_error: - print(f"Fehler beim Erstellen der Fallback-Einstellungen: {fallback_error}") + logger.error(f"Fehler beim Erstellen der Fallback-Einstellungen: {fallback_error}") def change_theme(self, theme_name): """ @@ -397,7 +397,7 @@ class MainWindow(QMainWindow): Args: theme_name: Name des zu verwendenden Themes """ - print(f"Wechsle zu Theme: {theme_name}") + logger.info(f"Wechsle zu Theme: {theme_name}") try: # Erstelle den neuen Style @@ -410,14 +410,14 @@ class MainWindow(QMainWindow): for action in self.ui.menuThema.actions(): action.setChecked(action.text() == theme_name) - print(f"Theme erfolgreich gewechselt zu: {theme_name}") + logger.info(f"Theme erfolgreich gewechselt zu: {theme_name}") app_settings.theme = theme_name app_settings.save() else: - print(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden") + logger.error(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden") except Exception as e: - print(f"Fehler beim Wechseln des Themes: {e}") + logger.error(f"Fehler beim Wechseln des Themes: {e}") def _load_images(self): """Lädt PDF-Thumbnails und bereitet On-Demand-Rendering vor.""" @@ -440,16 +440,16 @@ class MainWindow(QMainWindow): # Prüfe ob diff-Ordner existiert und PDF-Dateien enthält if not os.path.exists(diff_dir): - print(f"Diff-Ordner nicht gefunden: {diff_dir}") + logger.warning(f"Diff-Ordner nicht gefunden: {diff_dir}") return # Finde alle PDF-Dateien im diff-Ordner diff_pdfs = glob.glob(os.path.join(diff_dir, "*.pdf")) if not diff_pdfs: - print("Keine PDF-Dateien im diff-Ordner gefunden") + logger.warning("Keine PDF-Dateien im diff-Ordner gefunden") return - print(f"Gefundene PDF-Dateien im diff-Ordner: {diff_pdfs}") + logger.debug(f"Gefundene PDF-Dateien im diff-Ordner: {diff_pdfs}") # Für jede PDF-Datei im diff-Ordner for diff_pdf_path in diff_pdfs: @@ -459,10 +459,10 @@ class MainWindow(QMainWindow): # Prüfe ob gleichnamige PDFs in ref und new existieren if not os.path.exists(ref_pdf_path): - print(f"Referenz-PDF nicht gefunden: {ref_pdf_path}") + logger.warning(f"Referenz-PDF nicht gefunden: {ref_pdf_path}") continue if not os.path.exists(new_pdf_path): - print(f"New-PDF nicht gefunden: {new_pdf_path}") + logger.warning(f"New-PDF nicht gefunden: {new_pdf_path}") continue try: @@ -482,16 +482,16 @@ class MainWindow(QMainWindow): or ref_doc.status() != QPdfDocument.Status.Ready or new_doc.status() != QPdfDocument.Status.Ready ): - print(f"Fehler beim Laden der PDFs für {pdf_filename}") + logger.error(f"Fehler beim Laden der PDFs für {pdf_filename}") continue # PDF-Dokumente für später speichern self.pdf_documents[pdf_filename] = {"diff": diff_doc, "ref": ref_doc, "new": new_doc} - print(f"PDFs geladen: {pdf_filename}") - print(f" diff: {diff_doc.pageCount()} Seiten") - print(f" ref: {ref_doc.pageCount()} Seiten") - print(f" new: {new_doc.pageCount()} Seiten") + logger.info(f"PDFs geladen: {pdf_filename}") + logger.debug(f" diff: {diff_doc.pageCount()} Seiten") + logger.debug(f" ref: {ref_doc.pageCount()} Seiten") + logger.debug(f" new: {new_doc.pageCount()} Seiten") # Nehme die Seitenzahl der diff-PDF als Basis max_pages = diff_doc.pageCount() @@ -533,17 +533,17 @@ class MainWindow(QMainWindow): # Click-Event für das Thumbnail einrichten thumbnail.mousePressEvent = lambda event, t=thumbnail: self.on_thumbnail_clicked(event, t) - print(f"Thumbnail für Seite {page_num + 1} erstellt") + logger.debug(f"Thumbnail für Seite {page_num + 1} erstellt") thumbnail_time = time.time() - start_time - print(f"Performance: {max_pages} Thumbnails in {thumbnail_time:.3f}s") + logger.debug(f"Performance: {max_pages} Thumbnails in {thumbnail_time:.3f}s") # Setze die erste PDF als aktuelle PDF if self.current_pdf is None: self.current_pdf = pdf_filename except Exception as e: - print(f"Fehler beim Laden der PDFs: {e}") + logger.error(f"Fehler beim Laden der PDFs: {e}") # Erstelle das eine Vollbild-Label für die rechte Spalte (immer erstellen) if self.fullsize_label is None: @@ -573,10 +573,10 @@ class MainWindow(QMainWindow): pdf_filename: Name der PDF-Datei page_num: Seitennummer (0-basiert) """ - print(f"Rendere Seite {page_num + 1} von {pdf_filename}") + logger.debug(f"Rendere Seite {page_num + 1} von {pdf_filename}") if pdf_filename not in self.pdf_documents: - print(f"PDF-Dokument {pdf_filename} nicht gefunden") + logger.warning(f"PDF-Dokument {pdf_filename} nicht gefunden") return start_time = time.time() @@ -605,24 +605,24 @@ class MainWindow(QMainWindow): if page_num < ref_doc.pageCount(): ref_image = ref_doc.render(page_num, render_size) ref_pixmap = QPixmap.fromImage(ref_image) - print(f"Ref-Seite {page_num + 1} gerendert") + logger.debug(f"Ref-Seite {page_num + 1} gerendert") else: # Erstelle weiße Seite mit gleichen Abmessungen wie Diff-Seite ref_pixmap = QPixmap(diff_width, diff_height) ref_pixmap.fill(Qt.GlobalColor.white) - print(f"Weiße Ref-Seite {page_num + 1} erstellt") + logger.debug(f"Weiße Ref-Seite {page_num + 1} erstellt") # New-Seite prüfen und rendern oder weiße Seite erstellen new_doc = docs["new"] if page_num < new_doc.pageCount(): new_image = new_doc.render(page_num, render_size) new_pixmap = QPixmap.fromImage(new_image) - print(f"New-Seite {page_num + 1} gerendert") + logger.debug(f"New-Seite {page_num + 1} gerendert") else: # Erstelle weiße Seite mit gleichen Abmessungen wie Diff-Seite new_pixmap = QPixmap(diff_width, diff_height) new_pixmap.fill(Qt.GlobalColor.white) - print(f"Weiße New-Seite {page_num + 1} erstellt") + logger.debug(f"Weiße New-Seite {page_num + 1} erstellt") # Cache die gerenderten Pixmaps für schnelle Alpha/Zoom-Operationen self.current_rendered_pixmaps = {"ref": ref_pixmap, "diff": diff_pixmap, "new": new_pixmap} @@ -635,7 +635,7 @@ class MainWindow(QMainWindow): self.update_current_display() render_time = time.time() - start_time - print(f"Performance: Seite {page_num + 1} gerendert in {render_time:.3f}s") + logger.debug(f"Performance: Seite {page_num + 1} gerendert in {render_time:.3f}s") except Exception as e: logger.error(f"Fehler beim Rendern der Seite {page_num + 1}: {e}", exc_info=True) @@ -646,11 +646,11 @@ class MainWindow(QMainWindow): Verwendet für Alpha- und Zoom-Änderungen ohne erneutes PDF-Rendering. """ if not self.current_rendered_pixmaps: - print("Keine gerenderten Pixmaps verfügbar") + logger.warning("Keine gerenderten Pixmaps verfügbar") return if self.fullsize_label is None: - print("Fullsize-Label ist nicht verfügbar") + logger.warning("Fullsize-Label ist nicht verfügbar") return try: @@ -764,7 +764,7 @@ class MainWindow(QMainWindow): # Aktiviere Kontextmenü für das TreeWidget self.ui.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.ui.treeWidget.customContextMenuRequested.connect(self._show_tree_context_menu) - print("Kontextmenü für TreeWidget eingerichtet") + logger.debug("Kontextmenü für TreeWidget eingerichtet") def _setup_tree_widget_styling(self): """Richtet das Styling für das TreeWidget ein, um den vertikalen Abstand zu vergrößern.""" @@ -791,10 +791,10 @@ class MainWindow(QMainWindow): # Wende das Stylesheet auf das TreeWidget an self.ui.treeWidget.setStyleSheet(tree_stylesheet) - print("TreeWidget Styling für größeren vertikalen Abstand angewendet") + logger.debug("TreeWidget Styling für größeren vertikalen Abstand angewendet") except Exception as e: - print(f"Fehler beim Anwenden des TreeWidget-Stylings: {e}") + logger.error(f"Fehler beim Anwenden des TreeWidget-Stylings: {e}") def _show_tree_context_menu(self, position): """ @@ -854,7 +854,7 @@ class MainWindow(QMainWindow): return self._determine_node_type_from_data(item) except Exception as e: - print(f"Fehler beim Bestimmen des Node-Typs: {e}") + logger.error(f"Fehler beim Bestimmen des Node-Typs: {e}") return "Unknown" def _determine_node_type_from_data(self, item): @@ -884,7 +884,7 @@ class MainWindow(QMainWindow): return "Unknown" except Exception as e: - print(f"Fehler beim Bestimmen des Node-Typs aus Daten: {e}") + logger.error(f"Fehler beim Bestimmen des Node-Typs aus Daten: {e}") return "Unknown" def _find_item_by_node(self, node_obj): @@ -1095,7 +1095,7 @@ class MainWindow(QMainWindow): return menu except Exception as e: - print(f"Fehler beim Erstellen des Kontextmenüs: {e}") + logger.error(f"Fehler beim Erstellen des Kontextmenüs: {e}") return None def on_alpha_changed(self, alpha_value): @@ -1106,13 +1106,13 @@ class MainWindow(QMainWindow): Args: alpha_value: Der neue Alpha-Wert (-100 bis 100) """ - print(f"Alpha geändert auf {alpha_value}") + logger.debug(f"Alpha geändert auf {alpha_value}") start_time = time.time() # Verwende gecachte Pixmaps für schnelle Alpha-Änderungen self.update_current_display() alpha_time = time.time() - start_time - print(f"Alpha-Update in {alpha_time:.6f}s") + logger.debug(f"Alpha-Update in {alpha_time:.6f}s") def open_settings_dialog(self): """Öffnet den Einstellungen-Dialog.""" @@ -1121,9 +1121,9 @@ class MainWindow(QMainWindow): dialog = AppSettingsDlg(self, app_settings) if dialog.exec() == AppSettingsDlg.DialogCode.Accepted: # Einstellungen wurden gespeichert, hier könnten weitere Aktionen folgen - print("Einstellungen wurden gespeichert") + logger.info("Einstellungen wurden gespeichert") except Exception as e: - print(f"Fehler beim Öffnen des Einstellungen-Dialogs: {e}") + logger.error(f"Fehler beim Öffnen des Einstellungen-Dialogs: {e}") def open_new_project_dialog(self): """Öffnet Pdf-Projekt-Dialog.""" @@ -1161,15 +1161,15 @@ class MainWindow(QMainWindow): # Speichere app_settings app_settings.save() - print(f"Neues PDF-Projekt '{project_data['name']}' wurde erstellt und gespeichert") - print(f"Projekt-ID: {new_id}") - print(f"Projekt-Ordner: {project_data['project_dir']}") + logger.info(f"Neues PDF-Projekt '{project_data['name']}' wurde erstellt und gespeichert") + logger.debug(f"Projekt-ID: {new_id}") + logger.debug(f"Projekt-Ordner: {project_data['project_dir']}") # Aktualisiere das Projekte-Menü self._setup_projects_menu() except Exception as e: - print(f"Fehler beim Erstellen des neuen Projekts: {e}") + logger.error(f"Fehler beim Erstellen des neuen Projekts: {e}") def _create_project_structure(self, project: Project): """ @@ -1186,7 +1186,7 @@ class MainWindow(QMainWindow): for subdir in subdirs: subdir_path = project_dir / subdir subdir_path.mkdir(parents=True, exist_ok=True) - print(f"Ordner erstellt: {subdir_path}") + logger.debug(f"Ordner erstellt: {subdir_path}") project_yaml_path = project_dir / "project.yaml" @@ -1197,17 +1197,17 @@ class MainWindow(QMainWindow): # Speichere die Standard-Einstellungen in die project.yaml default_settings.writeSettings(project_dir=project_dir) - print(f"project.yaml mit Standard-Einstellungen erstellt: {project_yaml_path}") + logger.info(f"project.yaml mit Standard-Einstellungen erstellt: {project_yaml_path}") else: - print(f"project.yaml existiert bereits: {project_yaml_path}") + logger.debug(f"project.yaml existiert bereits: {project_yaml_path}") except Exception as e: - print(f"Fehler beim Erstellen der Projekt-Struktur: {e}") + logger.error(f"Fehler beim Erstellen der Projekt-Struktur: {e}") raise def on_button_clicked(self): """Wird ausgeführt, wenn der Button geklickt wird.""" - print("Button wurde geklickt!") + logger.debug("Button wurde geklickt!") def on_thumbnail_clicked(self, event, thumbnail): """ @@ -1222,7 +1222,7 @@ class MainWindow(QMainWindow): pdf_filename = page_info["pdf_filename"] page_num = page_info["page_num"] - print(f"Thumbnail für Seite {page_num + 1} von {pdf_filename} wurde angeklickt") + logger.debug(f"Thumbnail für Seite {page_num + 1} von {pdf_filename} wurde angeklickt") # Rendere und zeige die gewählte Seite an self.render_and_display_page(pdf_filename, page_num) @@ -1236,7 +1236,7 @@ class MainWindow(QMainWindow): zoom_value: Der neue Zoom-Wert (in Prozent) """ self.current_zoom = zoom_value - print(f"Zoom geändert auf {zoom_value}%") + logger.debug(f"Zoom geändert auf {zoom_value}%") # Verwende gecachte Pixmaps für schnelle Zoom-Änderungen self.update_current_display() @@ -1281,7 +1281,7 @@ class MainWindow(QMainWindow): Lädt die Nodes aus den Projekt-Einstellungen in das TreeWidget. Sortiert die Items alphabetisch nach ihrer ID. """ - print("Lade Nodes in TreeWidget...") + logger.info("Lade Nodes in TreeWidget...") try: # TreeWidget leeren @@ -1292,11 +1292,11 @@ class MainWindow(QMainWindow): # Prüfe ob pdf_project existiert und Nodes hat if not hasattr(self, "pdf_project") or not self.pdf_project: - print("Keine Projekt-Einstellungen verfügbar") + logger.warning("Keine Projekt-Einstellungen verfügbar") return if not self.pdf_project.nodes: - print("Keine Nodes in den Projekt-Einstellungen gefunden") + logger.warning("Keine Nodes in den Projekt-Einstellungen gefunden") return # Sortiere Root-Nodes alphabetisch nach ID @@ -1307,14 +1307,14 @@ class MainWindow(QMainWindow): tree_item = self._create_tree_item_from_node(node) self.ui.treeWidget.addTopLevelItem(tree_item) - print(f"{len(self.pdf_project.nodes)} Root-Nodes in TreeWidget geladen (alphabetisch sortiert)") + logger.info(f"{len(self.pdf_project.nodes)} Root-Nodes in TreeWidget geladen (alphabetisch sortiert)") # Aktualisiere Diff-PDF-Anzahl und Icons nach dem Laden self._update_all_diff_pdf_counts() self._update_diff_icons_for_existing_pdfs() except Exception as e: - print(f"Fehler beim Laden der Nodes in TreeWidget: {e}") + logger.error(f"Fehler beim Laden der Nodes in TreeWidget: {e}") def _create_tree_item_from_node(self, node): """ @@ -1396,7 +1396,7 @@ class MainWindow(QMainWindow): return item except Exception as e: - print(f"Fehler beim Erstellen des Tree-Items: {e}") + logger.error(f"Fehler beim Erstellen des Tree-Items: {e}") # Fallback: Erstelle einfaches Item fallback_item = QTreeWidgetItem() fallback_item.setText(0, "Fehler beim Laden") @@ -1662,12 +1662,12 @@ class MainWindow(QMainWindow): # Kontextmenü-Aktionen für TreeNode def _add_tree_node_child(self, parent_item): """Fügt einen Unterknoten zu einem TreeNode hinzu.""" - print(f"Unterknoten zu TreeNode hinzufügen: {parent_item.text(0)}") + logger.debug(f"Unterknoten zu TreeNode hinzufügen: {parent_item.text(0)}") # TODO: Dialog zum Eingeben der Node-Daten öffnen def _add_xsl_file_to_node(self, parent_item): """Fügt eine XSL-Datei zu einem TreeNode hinzu.""" - print(f"XSL-Datei zu TreeNode hinzufügen: {parent_item.text(0)}") + logger.debug(f"XSL-Datei zu TreeNode hinzufügen: {parent_item.text(0)}") # TODO: Dialog zum Auswählen der XSL-Datei öffnen def _edit_tree_node(self, item): @@ -1677,7 +1677,7 @@ class MainWindow(QMainWindow): Args: item: Das TreeWidgetItem des TreeNode """ - print(f"TreeNode bearbeiten: {item.text(0)}") + logger.debug(f"TreeNode bearbeiten: {item.text(0)}") try: # Hole das Node-Objekt aus dem TreeWidgetItem @@ -1704,8 +1704,8 @@ class MainWindow(QMainWindow): node.bez = data["bez"] node.xslt_params = data["xslt_params"] - print(f"TreeNode '{node.bez}' wurde aktualisiert") - print(f"XSLT-Parameter: {node.xslt_params}") + logger.info(f"TreeNode '{node.bez}' wurde aktualisiert") + logger.debug(f"XSLT-Parameter: {node.xslt_params}") # Speichere die Änderungen self._save_project_settings() @@ -1727,12 +1727,12 @@ class MainWindow(QMainWindow): except Exception as e: error_msg = f"Fehler beim Bearbeiten des TreeNode: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) def _delete_tree_node(self, item): """Löscht einen TreeNode.""" - print(f"TreeNode löschen: {item.text(0)}") + logger.debug(f"TreeNode löschen: {item.text(0)}") # TODO: Bestätigungsdialog und Löschung implementieren # Kontextmenü-Aktionen für XslFile @@ -1743,7 +1743,7 @@ class MainWindow(QMainWindow): Args: parent_item: Das TreeWidgetItem des XslFile-Nodes """ - print(f"XML-Datei zu XslFile hinzufügen: {parent_item.text(0)}") + logger.debug(f"XML-Datei zu XslFile hinzufügen: {parent_item.text(0)}") try: # Prüfe ob ein Projekt geladen ist @@ -1800,7 +1800,7 @@ class MainWindow(QMainWindow): # Kopiere die XML-Datei in den xml-Ordner shutil.copy2(xml_file_path, target_xml_path) - print(f"XML-Datei kopiert: {xml_file_path} -> {target_xml_path}") + logger.info(f"XML-Datei kopiert: {xml_file_path} -> {target_xml_path}") # Erstelle relatives Path zur XML-Datei (relativ zum xml-Ordner) relative_xml_path = Path("xml") / xml_file_path.name @@ -1824,7 +1824,7 @@ class MainWindow(QMainWindow): new_xml_file = XmlFile(xml=relative_xml_path) xsl_node.xmls.append(new_xml_file) - print(f"XML-Datei '{xml_file_path.name}' zu XslFile-Node '{xsl_node.bez}' hinzugefügt") + logger.info(f"XML-Datei '{xml_file_path.name}' zu XslFile-Node '{xsl_node.bez}' hinzugefügt") # Berechne Hash für die neue XML-Datei self._calculate_hash_for_xml_file(new_xml_file) @@ -1843,7 +1843,7 @@ class MainWindow(QMainWindow): except Exception as e: error_msg = f"Fehler beim Hinzufügen der XML-Datei: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) def _edit_xsl_file(self, item): @@ -1853,7 +1853,7 @@ class MainWindow(QMainWindow): Args: item: Das TreeWidgetItem des XslFile """ - print(f"XslFile bearbeiten: {item.text(0)}") + logger.debug(f"XslFile bearbeiten: {item.text(0)}") try: # Hole das Node-Objekt aus dem TreeWidgetItem @@ -1875,8 +1875,8 @@ class MainWindow(QMainWindow): node.bez = data["bez"] node.xslt_params = data["xslt_params"] - print(f"XslFile '{node.bez}' wurde aktualisiert") - print(f"XSLT-Parameter: {node.xslt_params}") + logger.info(f"XslFile '{node.bez}' wurde aktualisiert") + logger.debug(f"XSLT-Parameter: {node.xslt_params}") # Speichere die Änderungen self._save_project_settings() @@ -1898,18 +1898,18 @@ class MainWindow(QMainWindow): except Exception as e: error_msg = f"Fehler beim Bearbeiten der XSL-Datei: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) def _delete_xsl_file(self, item): """Löscht eine XSL-Datei.""" - print(f"XslFile löschen: {item.text(0)}") + logger.debug(f"XslFile löschen: {item.text(0)}") # TODO: Bestätigungsdialog und Löschung implementieren # Kontextmenü-Aktionen für XmlFile def _edit_xml_file(self, item): """Bearbeitet eine XML-Datei.""" - print(f"XmlFile bearbeiten: {item.text(0)}") + logger.debug(f"XmlFile bearbeiten: {item.text(0)}") # TODO: Dialog zum Bearbeiten der XML-Datei öffnen def _delete_xml_file(self, item): @@ -1919,7 +1919,7 @@ class MainWindow(QMainWindow): Args: item: Das TreeWidgetItem der XML-Datei """ - print(f"XmlFile löschen: {item.text(0)}") + logger.debug(f"XmlFile löschen: {item.text(0)}") try: # Prüfe ob ein Projekt geladen ist @@ -1961,7 +1961,7 @@ class MainWindow(QMainWindow): ) if reply != QMessageBox.StandardButton.Yes: - print("Löschung abgebrochen") + logger.debug("Löschung abgebrochen") return # Entferne die XML-Datei aus der XslFile-Node @@ -1973,7 +1973,7 @@ class MainWindow(QMainWindow): QMessageBox.warning(self, "Warnung", "XML-Datei konnte nicht aus der XSL-Datei entfernt werden.") return - print(f"XML-Datei '{xml_filename}' aus XSL-Datei '{xsl_file_obj.bez}' entfernt") + logger.info(f"XML-Datei '{xml_filename}' aus XSL-Datei '{xsl_file_obj.bez}' entfernt") # Frage ob die physische Datei auch gelöscht werden soll xml_file_path = Path(self.project.project_dir) / xml_file_obj.xml @@ -1994,11 +1994,11 @@ class MainWindow(QMainWindow): if delete_reply == QMessageBox.StandardButton.Yes: try: xml_file_path.unlink() - print(f"Physische XML-Datei gelöscht: {xml_file_path}") + logger.info(f"Physische XML-Datei gelöscht: {xml_file_path}") except Exception as e: QMessageBox.warning(self, "Warnung", f"Fehler beim Löschen der physischen Datei:\n{str(e)}") else: - print( + logger.info( f"XML-Datei '{xml_filename}' wird noch in anderen XSL-Dateien verwendet - physische Datei nicht gelöscht" ) @@ -2008,11 +2008,11 @@ class MainWindow(QMainWindow): # Aktualisiere das TreeWidget self._load_nodes_to_tree() - print(f"XML-Datei '{xml_filename}' erfolgreich entfernt") + logger.info(f"XML-Datei '{xml_filename}' erfolgreich entfernt") except Exception as e: error_msg = f"Fehler beim Löschen der XML-Datei: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) def _is_xml_file_used_elsewhere(self, xml_path, exclude_xsl_file): @@ -2033,7 +2033,7 @@ class MainWindow(QMainWindow): return self._check_xml_usage_recursive(self.pdf_project.nodes, xml_path, exclude_xsl_file) except Exception as e: - print(f"Fehler beim Prüfen der XML-Datei-Verwendung: {e}") + logger.error(f"Fehler beim Prüfen der XML-Datei-Verwendung: {e}") return True # Im Zweifelsfall annehmen, dass sie verwendet wird def _check_xml_usage_recursive(self, nodes, xml_path, exclude_xsl_file): @@ -2064,7 +2064,7 @@ class MainWindow(QMainWindow): # Kontextmenü-Aktionen für Root-Elemente (Unbekannter Typ) def _add_root_tree_node(self): """Fügt einen neuen TreeNode als Root-Element hinzu.""" - print("Neuen TreeNode als Root-Element hinzufügen") + logger.debug("Neuen TreeNode als Root-Element hinzufügen") # TODO: Dialog zum Eingeben der TreeNode-Daten öffnen def on_load_from_fn2_clicked(self): @@ -2072,7 +2072,7 @@ class MainWindow(QMainWindow): Wird ausgeführt, wenn der Button "lade aus FN2" geklickt wird. Führt SQL-Abfrage aus und aktualisiert die Projekt-Nodes. """ - print("Button 'lade aus FN2' wurde geklickt!") + logger.debug("Button 'lade aus FN2' wurde geklickt!") try: # Prüfe ob ein Projekt geladen ist @@ -2111,7 +2111,7 @@ class MainWindow(QMainWindow): # QMessageBox.information(self, "Erfolg", "Daten erfolgreich aus FN2 geladen und Projekt aktualisiert!") except Exception as e: - print(f"Fehler beim Laden aus FN2: {e}") + logger.error(f"Fehler beim Laden aus FN2: {e}") QMessageBox.critical(self, "Fehler", f"Fehler beim Laden aus FN2:\n{str(e)}") def _get_database_config(self, db_id): @@ -2149,7 +2149,7 @@ class MainWindow(QMainWindow): with open(sql_file_path, "r", encoding="utf-8") as f: sql_query = f.read() - print(f"SQL-Abfrage geladen: {len(sql_query)} Zeichen") + logger.debug(f"SQL-Abfrage geladen: {len(sql_query)} Zeichen") # Verbindung zur PostgreSQL-Datenbank herstellen connection_string = ( @@ -2162,7 +2162,7 @@ class MainWindow(QMainWindow): f"sslmode={db_config.ssl_mode.value}" ) - print(f"Verbinde zu PostgreSQL: {db_config.host}:{db_config.port}/{db_config.database}") + logger.info(f"Verbinde zu PostgreSQL: {db_config.host}:{db_config.port}/{db_config.database}") df = pl.read_database_uri(sql_query, connection_string, engine="connectorx").sort( ["reporttyp_bez", "report_bez", "repfile_bez"] @@ -2170,7 +2170,7 @@ class MainWindow(QMainWindow): return df except Exception as e: error_msg = f"Fehler beim Ausführen der SQL-Abfrage: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) return None @@ -2193,7 +2193,7 @@ class MainWindow(QMainWindow): ebene_3 = df.group_by(["reporttyp", "report", "repfile", "repfile_bez", "xsl_datei"]).len() group_time = time.time() - start_time - print(f"Performance: Gruppierung in {group_time:.3f}s") + logger.debug(f"Performance: Gruppierung in {group_time:.3f}s") new_nodes = [] @@ -2223,13 +2223,13 @@ class MainWindow(QMainWindow): new_nodes.append(tn_1) nodes_time = time.time() - start_time - print(f"Performance: Node-Erstellung in {nodes_time:.3f}s") - print(f"Erstellt: {len(new_nodes)} Root-Nodes") + logger.debug(f"Performance: Node-Erstellung in {nodes_time:.3f}s") + logger.info(f"Erstellt: {len(new_nodes)} Root-Nodes") return new_nodes except Exception as e: - print(f"Fehler beim Verarbeiten der SQL-Daten: {e}") + logger.error(f"Fehler beim Verarbeiten der SQL-Daten: {e}") raise def _merge_nodes_with_existing(self, new_nodes): @@ -2241,13 +2241,13 @@ class MainWindow(QMainWindow): new_nodes: Liste der neuen Nodes """ try: - print("Merge neue Nodes mit vorhandenen...") + logger.info("Merge neue Nodes mit vorhandenen...") # Erstelle ein Dictionary der neuen Nodes für schnellen Zugriff new_nodes_dict = {} self._build_nodes_dict(new_nodes, new_nodes_dict) - print(f"Neue Nodes Dictionary erstellt: {len(new_nodes_dict)} Einträge") + logger.debug(f"Neue Nodes Dictionary erstellt: {len(new_nodes_dict)} Einträge") # Merge mit vorhandenen Nodes if self.pdf_project and self.pdf_project.nodes: @@ -2259,16 +2259,16 @@ class MainWindow(QMainWindow): for new_node in new_nodes: if new_node.id not in existing_root_ids: self.pdf_project.nodes.append(new_node) - print(f"Neue Root-Node hinzugefügt: {new_node.bez}") + logger.info(f"Neue Root-Node hinzugefügt: {new_node.bez}") elif self.pdf_project: # Wenn keine Nodes vorhanden sind, füge alle neuen Nodes hinzu self.pdf_project.nodes = new_nodes - print(f"Alle {len(new_nodes)} Root-Nodes hinzugefügt (keine vorhandenen Nodes)") + logger.info(f"Alle {len(new_nodes)} Root-Nodes hinzugefügt (keine vorhandenen Nodes)") - print("Merge abgeschlossen") + logger.info("Merge abgeschlossen") except Exception as e: - print(f"Fehler beim Mergen der Nodes: {e}") + logger.error(f"Fehler beim Mergen der Nodes: {e}") raise def _build_nodes_dict(self, nodes, nodes_dict): @@ -2299,7 +2299,7 @@ class MainWindow(QMainWindow): # Aktualisiere nur die Bezeichnung, falls sie sich geändert hat if existing_node.bez != new_node.bez: - print( + logger.info( f"Aktualisiere Bezeichnung für Node {existing_node.id}: '{existing_node.bez}' -> '{new_node.bez}'" ) existing_node.bez = new_node.bez @@ -2307,7 +2307,7 @@ class MainWindow(QMainWindow): # Für XslFile: Aktualisiere xsl_file Pfad if isinstance(existing_node, XslFile) and isinstance(new_node, XslFile): if existing_node.xsl_file != new_node.xsl_file: - print( + logger.info( f"Aktualisiere XSL-Datei für Node {existing_node.id}: '{existing_node.xsl_file}' -> '{new_node.xsl_file}'" ) existing_node.xsl_file = new_node.xsl_file @@ -2324,7 +2324,7 @@ class MainWindow(QMainWindow): for new_child in new_node.children: if new_child.id not in existing_child_ids: existing_node.children.append(new_child) - print(f"Neues Kind hinzugefügt zu Node {existing_node.id}: {new_child.bez}") + logger.info(f"Neues Kind hinzugefügt zu Node {existing_node.id}: {new_child.bez}") def _collect_parent_params(self, item): """ @@ -2377,11 +2377,11 @@ class MainWindow(QMainWindow): try: # Prüfe ob pdf_project und project existieren if not self.pdf_project: - print("Keine Projekt-Einstellungen zum Speichern verfügbar") + logger.warning("Keine Projekt-Einstellungen zum Speichern verfügbar") return if not self.project or not self.project.project_dir: - print("Kein Projekt-Verzeichnis zum Speichern verfügbar") + logger.warning("Kein Projekt-Verzeichnis zum Speichern verfügbar") return start_time = time.time() @@ -2390,10 +2390,10 @@ class MainWindow(QMainWindow): self.pdf_project.writeSettings(project_dir=self.project.project_dir) dump_time = time.time() - start_time - print(f"Performance: Projekt-Einstellungen gespeichert in {dump_time:.3f}s") + logger.debug(f"Performance: Projekt-Einstellungen gespeichert in {dump_time:.3f}s") except Exception as e: - print(f"Fehler beim Speichern der Projekt-Einstellungen: {e}") + logger.error(f"Fehler beim Speichern der Projekt-Einstellungen: {e}") raise def _setup_drag_drop(self): @@ -2408,10 +2408,10 @@ class MainWindow(QMainWindow): self.ui.treeWidget.dragMoveEvent = self.tree_drag_move_event self.ui.treeWidget.dropEvent = self.tree_drop_event - print("Drag&Drop für TreeWidget aktiviert") + logger.debug("Drag&Drop für TreeWidget aktiviert") except Exception as e: - print(f"Fehler beim Aktivieren von Drag&Drop: {e}") + logger.error(f"Fehler beim Aktivieren von Drag&Drop: {e}") def tree_drag_enter_event(self, event: QDragEnterEvent): """ @@ -2430,16 +2430,16 @@ class MainWindow(QMainWindow): if xml_files: event.acceptProposedAction() - print(f"Drag-Enter akzeptiert: {len(xml_files)} XML-Dateien") + logger.debug(f"Drag-Enter akzeptiert: {len(xml_files)} XML-Dateien") else: event.ignore() - print("Drag-Enter ignoriert: Keine XML-Dateien") + logger.debug("Drag-Enter ignoriert: Keine XML-Dateien") else: event.ignore() - print("Drag-Enter ignoriert: Keine URLs") + logger.debug("Drag-Enter ignoriert: Keine URLs") except Exception as e: - print(f"Fehler in tree_drag_enter_event: {e}") + logger.error(f"Fehler in tree_drag_enter_event: {e}") event.ignore() def tree_drag_move_event(self, event): @@ -2465,7 +2465,7 @@ class MainWindow(QMainWindow): event.ignore() except Exception as e: - print(f"Fehler in tree_drag_move_event: {e}") + logger.error(f"Fehler in tree_drag_move_event: {e}") event.ignore() def tree_drop_event(self, event: QDropEvent): @@ -2506,7 +2506,7 @@ class MainWindow(QMainWindow): event.ignore() return - print(f"Drop-Event: {len(xml_files)} XML-Dateien erkannt") + logger.info(f"Drop-Event: {len(xml_files)} XML-Dateien erkannt") # Verarbeite jede XML-Datei einzeln for xml_file_path in xml_files: @@ -2516,7 +2516,7 @@ class MainWindow(QMainWindow): except Exception as e: error_msg = f"Fehler beim Verarbeiten des Drop-Events: {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) event.ignore() @@ -2528,7 +2528,7 @@ class MainWindow(QMainWindow): xml_file_path: Pfad zur XML-Datei """ try: - print(f"Verarbeite XML-Datei: {xml_file_path}") + logger.debug(f"Verarbeite XML-Datei: {xml_file_path}") # Prüfe ob die Datei existiert if not xml_file_path.exists(): @@ -2553,13 +2553,13 @@ class MainWindow(QMainWindow): # Verarbeite die Zuordnung self._assign_xml_to_xsl_nodes(xml_file_path, selected_xsl_nodes) else: - print("Keine XSL-Knoten ausgewählt") + logger.warning("Keine XSL-Knoten ausgewählt") else: - print("Dialog abgebrochen") + logger.debug("Dialog abgebrochen") except Exception as e: error_msg = f"Fehler beim Verarbeiten der XML-Datei '{xml_file_path}': {str(e)}" - print(error_msg) + logger.error(error_msg) QMessageBox.critical(self, "Fehler", error_msg) def _assign_xml_to_xsl_nodes(self, xml_file_path: Path, selected_xsl_nodes: list): diff --git a/src/ui/XmlToXslAssignDialog.py b/src/ui/XmlToXslAssignDialog.py index 6269310..3fd4ae4 100644 --- a/src/ui/XmlToXslAssignDialog.py +++ b/src/ui/XmlToXslAssignDialog.py @@ -1,3 +1,4 @@ +import logging from PySide6.QtWidgets import QDialog, QTreeWidgetItem, QCheckBox, QMessageBox, QWidget, QHBoxLayout from PySide6.QtCore import Qt from pathlib import Path @@ -6,6 +7,9 @@ from ui.XmlToXslAssignDialog_ui import Ui_XmlToXslAssignDialog from conf import TreeNode, XslFile +logger = logging.getLogger(__name__) + + class XmlToXslAssignDialog(QDialog): """Dialog zur Zuordnung einer XML-Datei zu XSL-Knoten.""" @@ -85,10 +89,10 @@ class XmlToXslAssignDialog(QDialog): root = self.ui.xslNodesTree.invisibleRootItem() self._add_checkboxes_recursive(root) - print(f"Checkboxen zu {len(self.xsl_checkboxes)} XSL-Knoten hinzugefügt") + logger.debug(f"Checkboxen zu {len(self.xsl_checkboxes)} XSL-Knoten hinzugefügt") except Exception as e: - print(f"Fehler beim Hinzufügen der Checkboxen: {e}") + logger.error(f"Fehler beim Hinzufügen der Checkboxen: {e}") def _add_checkboxes_recursive(self, parent_item): """ @@ -113,7 +117,7 @@ class XmlToXslAssignDialog(QDialog): # Speichere Checkbox-Referenz self.xsl_checkboxes[id(node)] = checkbox - print(f"Checkbox für XSL-Knoten '{node.bez}' hinzugefügt") + logger.debug(f"Checkbox für XSL-Knoten '{node.bez}' hinzugefügt") # Rekursiv für Kinder if item.childCount() > 0: @@ -201,7 +205,7 @@ class XmlToXslAssignDialog(QDialog): return item except Exception as e: - print(f"Fehler beim Erstellen des Tree-Items: {e}") + logger.error(f"Fehler beim Erstellen des Tree-Items: {e}") return None def select_all(self): @@ -235,7 +239,7 @@ class XmlToXslAssignDialog(QDialog): return selected_nodes except Exception as e: - print(f"Fehler beim Sammeln der ausgewählten XSL-Knoten: {e}") + logger.error(f"Fehler beim Sammeln der ausgewählten XSL-Knoten: {e}") return [] def _find_xsl_node_by_id(self, node_id):