diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 5992cae..4441b82 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -1296,9 +1296,151 @@ class MainWindow(QMainWindow): # TODO: Dialog zum Bearbeiten der XML-Datei öffnen def _delete_xml_file(self, item): - """Löscht eine XML-Datei.""" + """ + Löscht eine XML-Datei aus einem XSL-Knoten. + + Args: + item: Das TreeWidgetItem der XML-Datei + """ print(f"XmlFile löschen: {item.text(0)}") - # TODO: Bestätigungsdialog und Löschung implementieren + + try: + # Prüfe ob ein Projekt geladen ist + if not hasattr(self, 'project') or not self.project: + QMessageBox.warning(self, "Warnung", "Kein Projekt geladen. Bitte öffnen Sie zuerst ein Projekt.") + return + + if not hasattr(self, 'pdf_project') or not self.pdf_project: + QMessageBox.warning(self, "Warnung", "Keine Projekt-Einstellungen geladen.") + return + + # Hole das XmlFile-Objekt aus dem TreeWidgetItem + xml_file_obj = item.data(0, Qt.ItemDataRole.UserRole) + if not xml_file_obj or not isinstance(xml_file_obj, XmlFile): + QMessageBox.warning(self, "Warnung", "Keine gültige XML-Datei gefunden.") + return + + # Hole das Eltern-Item (sollte ein XslFile sein) + parent_item = item.parent() + if not parent_item: + QMessageBox.warning(self, "Warnung", "Eltern-XSL-Datei nicht gefunden.") + return + + # Hole das XslFile-Objekt aus dem Eltern-Item + xsl_file_obj = parent_item.data(0, Qt.ItemDataRole.UserRole) + if not xsl_file_obj or not isinstance(xsl_file_obj, XslFile): + QMessageBox.warning(self, "Warnung", "Keine gültige Eltern-XSL-Datei gefunden.") + return + + # Bestätigungsdialog anzeigen + xml_filename = xml_file_obj.xml.name + reply = QMessageBox.question( + self, + "XML-Datei löschen", + f"Möchten Sie die XML-Datei '{xml_filename}' aus der XSL-Datei '{xsl_file_obj.bez}' entfernen?\n\n" + "Die XML-Datei wird nur aus der Zuordnung entfernt, nicht physisch gelöscht.", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No + ) + + if reply != QMessageBox.StandardButton.Yes: + print("Löschung abgebrochen") + return + + # Entferne die XML-Datei aus der XslFile-Node + xml_files_before = len(xsl_file_obj.xmls) + xsl_file_obj.xmls = [xml for xml in xsl_file_obj.xmls if xml.xml != xml_file_obj.xml] + xml_files_after = len(xsl_file_obj.xmls) + + if xml_files_before == xml_files_after: + 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") + + # Frage ob die physische Datei auch gelöscht werden soll + xml_file_path = Path(self.project.project_dir) / xml_file_obj.xml + if xml_file_path.exists(): + # Prüfe ob die XML-Datei noch in anderen XSL-Dateien verwendet wird + is_used_elsewhere = self._is_xml_file_used_elsewhere(xml_file_obj.xml, xsl_file_obj) + + if not is_used_elsewhere: + delete_reply = QMessageBox.question( + self, + "Physische Datei löschen", + f"Die XML-Datei '{xml_filename}' wird in keiner anderen XSL-Datei verwendet.\n\n" + "Möchten Sie auch die physische Datei aus dem xml-Ordner löschen?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No + ) + + if delete_reply == QMessageBox.StandardButton.Yes: + try: + xml_file_path.unlink() + print(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(f"XML-Datei '{xml_filename}' wird noch in anderen XSL-Dateien verwendet - physische Datei nicht gelöscht") + + # Speichere die aktualisierten Projekt-Einstellungen + self._save_project_settings() + + # Aktualisiere das TreeWidget + self._load_nodes_to_tree() + + print(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) + QMessageBox.critical(self, "Fehler", error_msg) + + def _is_xml_file_used_elsewhere(self, xml_path, exclude_xsl_file): + """ + Prüft ob eine XML-Datei noch in anderen XSL-Dateien verwendet wird. + + Args: + xml_path: Pfad zur XML-Datei (relativ) + exclude_xsl_file: XSL-Datei die ausgeschlossen werden soll + + Returns: + bool: True wenn die XML-Datei noch anderswo verwendet wird + """ + try: + 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}") + return True # Im Zweifelsfall annehmen, dass sie verwendet wird + + def _check_xml_usage_recursive(self, nodes, xml_path, exclude_xsl_file): + """ + Prüft rekursiv ob eine XML-Datei in den Nodes verwendet wird. + + Args: + nodes: Liste der zu prüfenden Nodes + xml_path: Pfad zur XML-Datei (relativ) + exclude_xsl_file: XSL-Datei die ausgeschlossen werden soll + + Returns: + bool: True wenn die XML-Datei gefunden wird + """ + for node in nodes: + if isinstance(node, XslFile) and node != exclude_xsl_file: + # Prüfe ob diese XSL-Datei die XML-Datei verwendet + for xml_file in node.xmls: + if xml_file.xml == xml_path: + return True + elif isinstance(node, TreeNode) and node.children: + # Rekursiv in Knoten suchen + if self._check_xml_usage_recursive(node.children, xml_path, exclude_xsl_file): + return True + + return False # Kontextmenü-Aktionen für Root-Elemente (Unbekannter Typ) def _add_root_tree_node(self):