""" ObsoleteEntriesDialog — Dialog zur Bestätigung des Entfernens veralteter Projekteinträge. Zeigt XslFile-Einträge an, die nicht mehr in der Datenbank vorhanden sind, und lässt den Benutzer entscheiden ob sie entfernt werden sollen. """ import logging from PySide6.QtCore import Qt from PySide6.QtWidgets import ( QCheckBox, QDialog, QDialogButtonBox, QLabel, QSizePolicy, QTreeWidget, QTreeWidgetItem, QVBoxLayout, ) from obsolete_detector import ObsoleteGroup logger = logging.getLogger(__name__) class ObsoleteEntriesDialog(QDialog): """ Dialog zur Anzeige und Bestätigung veralteter Einträge nach einem DB-Import. Zeigt die veralteten XslFile-Einträge gruppiert nach ihrer Baumhierarchie an. Der Benutzer kann entscheiden ob die Einträge entfernt und ob nicht mehr verwendete XML-Dateien physisch gelöscht werden sollen. """ def __init__(self, parent, obsolete_groups: list[ObsoleteGroup]): """ Args: parent: Eltern-Widget obsolete_groups: Veraltete Einträge gruppiert nach Hierarchiepfad """ super().__init__(parent) self._obsolete_groups = obsolete_groups self._setup_ui() self._populate_tree() def _setup_ui(self) -> None: """Erstellt die UI-Elemente des Dialogs.""" total_count = sum(len(g.xsl_entries) for g in self._obsolete_groups) self.setWindowTitle("Veraltete Einträge gefunden") self.resize(640, 420) self.setSizeGripEnabled(True) layout = QVBoxLayout(self) layout.setSpacing(10) # Erklärungstext info_label = QLabel( f"{total_count} XSL-Datei(en) sind nicht mehr in der Datenbank vorhanden " f"und können aus dem Projekt entfernt werden." ) info_label.setWordWrap(True) layout.addWidget(info_label) # Baumansicht der veralteten Einträge self._tree = QTreeWidget() self._tree.setColumnCount(3) self._tree.setHeaderLabels(["Bezeichnung", "XSL-Datei", "XML-Dateien"]) self._tree.setColumnWidth(0, 280) self._tree.setColumnWidth(1, 200) self._tree.setColumnWidth(2, 80) self._tree.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._tree.setAlternatingRowColors(True) self._tree.setEditTriggers(QTreeWidget.EditTrigger.NoEditTriggers) layout.addWidget(self._tree) # Checkbox für physische XML-Löschung self._delete_xml_checkbox = QCheckBox("Nicht mehr verwendete XML-Dateien physisch löschen") self._delete_xml_checkbox.setChecked(False) layout.addWidget(self._delete_xml_checkbox) # Dialog-Buttons self._button_box = QDialogButtonBox() remove_button = self._button_box.addButton( "Veraltete Einträge entfernen", QDialogButtonBox.ButtonRole.AcceptRole ) remove_button.setToolTip("Entfernt alle aufgelisteten Einträge aus dem Projekt") self._button_box.addButton(QDialogButtonBox.StandardButton.Cancel) self._button_box.accepted.connect(self.accept) self._button_box.rejected.connect(self.reject) layout.addWidget(self._button_box) def _populate_tree(self) -> None: """Befüllt den QTreeWidget mit den veralteten Einträgen.""" self._tree.clear() for group in self._obsolete_groups: # Hierarchiepfad als verschachtelte Items aufbauen parent_item = self._tree.invisibleRootItem() for path_part in group.node_path: # Prüfe ob dieser Pfadteil bereits als Kind vorhanden ist existing = None for i in range(parent_item.childCount()): child = parent_item.child(i) if child.text(0) == path_part and not child.data(0, Qt.ItemDataRole.UserRole): existing = child break if existing: parent_item = existing else: node_item = QTreeWidgetItem(parent_item, [path_part]) font = node_item.font(0) font.setBold(True) node_item.setFont(0, font) parent_item = node_item # XslFile-Einträge unter dem Hierarchiepfad for entry in group.xsl_entries: xsl = entry.xsl_file xml_count = str(len(xsl.xmls)) if xsl.xmls else "0" xsl_item = QTreeWidgetItem( parent_item, [xsl.bez, xsl.xsl_file.name, xml_count], ) xsl_item.setData(0, Qt.ItemDataRole.UserRole, xsl) xsl_item.setToolTip(1, str(xsl.xsl_file)) self._tree.expandAll() def delete_xml_files(self) -> bool: """ Gibt zurück ob der Benutzer die physische Löschung der XML-Dateien gewünscht hat. Returns: True wenn die Checkbox aktiviert ist """ return self._delete_xml_checkbox.isChecked()