Löscheen der XML-Dateien aus dem Projekt implementiert
This commit is contained in:
+144
-2
@@ -1296,9 +1296,151 @@ class MainWindow(QMainWindow):
|
|||||||
# TODO: Dialog zum Bearbeiten der XML-Datei öffnen
|
# TODO: Dialog zum Bearbeiten der XML-Datei öffnen
|
||||||
|
|
||||||
def _delete_xml_file(self, item):
|
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)}")
|
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)
|
# Kontextmenü-Aktionen für Root-Elemente (Unbekannter Typ)
|
||||||
def _add_root_tree_node(self):
|
def _add_root_tree_node(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user