diff --git a/src/ui/XmlToXslAssignDialog.py b/src/ui/XmlToXslAssignDialog.py index 1f0b8a2..50c0560 100644 --- a/src/ui/XmlToXslAssignDialog.py +++ b/src/ui/XmlToXslAssignDialog.py @@ -1,4 +1,4 @@ -from PySide6.QtWidgets import QDialog, QTreeWidgetItem, QMessageBox +from PySide6.QtWidgets import QDialog, QTreeWidgetItem, QCheckBox, QMessageBox, QWidget, QHBoxLayout from PySide6.QtCore import Qt from pathlib import Path @@ -51,6 +51,74 @@ class XmlToXslAssignDialog(QDialog): # Header-Eigenschaften self.ui.xslNodesTree.header().setStretchLastSection(False) + def _create_centered_checkbox(self): + """ + Erstellt eine zentrierte Checkbox in einem Widget. + + Returns: + tuple: (widget, checkbox) - Das Container-Widget und die Checkbox + """ + # Erstelle Container-Widget + widget = QWidget() + + # Erstelle horizontales Layout + layout = QHBoxLayout(widget) + layout.setContentsMargins(0, 0, 0, 0) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + + # Erstelle Checkbox + checkbox = QCheckBox() + checkbox.setChecked(False) + + # Füge Checkbox zum Layout hinzu + layout.addWidget(checkbox) + + return widget, checkbox + + def _add_checkboxes_to_tree(self): + """ + Fügt Checkboxen zu allen XSL-Knoten im Tree hinzu. + Diese Methode wird nach dem Hinzufügen aller Items aufgerufen. + """ + try: + # Durchlaufe alle Items im Tree rekursiv + root = self.ui.xslNodesTree.invisibleRootItem() + self._add_checkboxes_recursive(root) + + print(f"Checkboxen zu {len(self.xsl_checkboxes)} XSL-Knoten hinzugefügt") + + except Exception as e: + print(f"Fehler beim Hinzufügen der Checkboxen: {e}") + + def _add_checkboxes_recursive(self, parent_item): + """ + Fügt rekursiv Checkboxen zu XSL-Knoten hinzu. + + Args: + parent_item: Das Eltern-Item + """ + for i in range(parent_item.childCount()): + item = parent_item.child(i) + + # Hole das Node-Objekt + node = item.data(0, Qt.ItemDataRole.UserRole) + + if isinstance(node, XslFile): + # Erstelle zentrierte Checkbox für XSL-Knoten + checkbox_widget, checkbox = self._create_centered_checkbox() + + # Setze das Widget in Spalte 2 + self.ui.xslNodesTree.setItemWidget(item, 2, checkbox_widget) + + # Speichere Checkbox-Referenz + self.xsl_checkboxes[id(node)] = checkbox + + print(f"Checkbox für XSL-Knoten '{node.bez}' hinzugefügt") + + # Rekursiv für Kinder + if item.childCount() > 0: + self._add_checkboxes_recursive(item) + def _load_data(self): """Lädt die Daten in den Dialog.""" # XML-Datei-Label setzen @@ -77,6 +145,9 @@ class XmlToXslAssignDialog(QDialog): # Baum expandieren self.ui.xslNodesTree.expandAll() + + # Checkboxen nach dem Hinzufügen der Items erstellen + self._add_checkboxes_to_tree() def _create_tree_item_from_node(self, node): """ @@ -115,16 +186,10 @@ class XmlToXslAssignDialog(QDialog): item.addChild(child_item) elif isinstance(node, XslFile): - # XslFile: Zeige XSL-Datei-Pfad und füge Checkbox hinzu + # XslFile: Zeige XSL-Datei-Pfad item.setText(1, str(node.xsl_file)) - # Aktiviere Checkbox für dieses Item in Spalte 2 - item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable) - item.setCheckState(2, Qt.CheckState.Unchecked) - - # Speichere Item-Referenz für XSL-Knoten - self.xsl_checkboxes[id(node)] = item - + # Checkbox wird später in _add_checkboxes_to_tree() hinzugefügt # Keine Knoten für XslFile hinzufügen (XML-Dateien werden ausgeschlossen) return item @@ -135,13 +200,13 @@ class XmlToXslAssignDialog(QDialog): def select_all(self): """Wählt alle XSL-Knoten aus.""" - for item in self.xsl_checkboxes.values(): - item.setCheckState(2, Qt.CheckState.Checked) + for checkbox in self.xsl_checkboxes.values(): + checkbox.setChecked(True) def deselect_all(self): """Wählt alle XSL-Knoten ab.""" - for item in self.xsl_checkboxes.values(): - item.setCheckState(2, Qt.CheckState.Unchecked) + for checkbox in self.xsl_checkboxes.values(): + checkbox.setChecked(False) def get_selected_xsl_nodes(self): """ @@ -153,9 +218,9 @@ class XmlToXslAssignDialog(QDialog): selected_nodes = [] try: - # Durchlaufe alle XSL-Items - for node_id, item in self.xsl_checkboxes.items(): - if item.checkState(2) == Qt.CheckState.Checked: + # Durchlaufe alle XSL-Checkboxes + for node_id, checkbox in self.xsl_checkboxes.items(): + if checkbox.isChecked(): # Finde den entsprechenden XSL-Knoten xsl_node = self._find_xsl_node_by_id(node_id) if xsl_node: diff --git a/src/ui/XmlToXslAssignDialog.ui b/src/ui/XmlToXslAssignDialog.ui index ec1b7d7..6fa1660 100644 --- a/src/ui/XmlToXslAssignDialog.ui +++ b/src/ui/XmlToXslAssignDialog.ui @@ -48,9 +48,6 @@ 3 - - true - true diff --git a/src/ui/XmlToXslAssignDialog_ui.py b/src/ui/XmlToXslAssignDialog_ui.py index feaa4ff..504b1fc 100644 --- a/src/ui/XmlToXslAssignDialog_ui.py +++ b/src/ui/XmlToXslAssignDialog_ui.py @@ -44,7 +44,6 @@ class Ui_XmlToXslAssignDialog(object): self.xslNodesTree.setObjectName(u"xslNodesTree") self.xslNodesTree.setHeaderHidden(False) self.xslNodesTree.setColumnCount(3) - self.xslNodesTree.setAlternatingRowColors(True) self.xslNodesTree.header().setVisible(True) self.verticalLayout.addWidget(self.xslNodesTree)