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
|
||||
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user