from PySide6.QtWidgets import QDialog, QTableWidgetItem, QMessageBox from PySide6.QtCore import Qt class XsltParamsEditDialog(QDialog): """Gemeinsame Basisklasse für Dialoge zur Bearbeitung von XSLT-Parametern.""" def __init__(self, parent=None, node=None, parent_params=None): super().__init__(parent) self.ui = self._create_ui() self.ui.setupUi(self) self.node = node self.parent_params = parent_params or {} self.ui.addParamButton.clicked.connect(self.add_parameter) self.ui.removeParamButton.clicked.connect(self.remove_parameter) self._setup_tables() if self.node: self._load_data() def _create_ui(self): """Gibt eine Instanz der konkreten UI-Klasse zurück. Muss überschrieben werden.""" raise NotImplementedError def _setup_tables(self): """Konfiguriert die Tabellen.""" self.ui.xsltParamsTable.setColumnWidth(0, 200) self.ui.xsltParamsTable.setColumnWidth(1, 300) self.ui.xsltParamsTable.horizontalHeader().setStretchLastSection(True) self.ui.parentParamsTable.setColumnWidth(0, 200) self.ui.parentParamsTable.setColumnWidth(1, 300) self.ui.parentParamsTable.horizontalHeader().setStretchLastSection(True) def _load_data(self): """Lädt die Daten des Knotens in den Dialog.""" if not self.node: return self.ui.bezEdit.setText(str(self.node.bez) if self.node.bez else "") self._load_xslt_params() self._load_parent_params() def _load_xslt_params(self): """Lädt die XSLT-Parameter in die Tabelle.""" if not self.node or not self.node.xslt_params: return params = self.node.xslt_params self.ui.xsltParamsTable.setRowCount(len(params)) for row, (key, value) in enumerate(params.items()): self.ui.xsltParamsTable.setItem(row, 0, QTableWidgetItem(str(key))) self.ui.xsltParamsTable.setItem(row, 1, QTableWidgetItem(str(value))) def _load_parent_params(self): """Lädt die Eltern-Parameter in die Tabelle (nur anzeigen).""" if not self.parent_params: return self.ui.parentParamsTable.setRowCount(len(self.parent_params)) for row, (key, value) in enumerate(self.parent_params.items()): key_item = QTableWidgetItem(str(key)) key_item.setFlags(key_item.flags() & ~Qt.ItemFlag.ItemIsEditable) self.ui.parentParamsTable.setItem(row, 0, key_item) value_item = QTableWidgetItem(str(value)) value_item.setFlags(value_item.flags() & ~Qt.ItemFlag.ItemIsEditable) self.ui.parentParamsTable.setItem(row, 1, value_item) def add_parameter(self): """Fügt einen neuen Parameter hinzu.""" row_count = self.ui.xsltParamsTable.rowCount() self.ui.xsltParamsTable.insertRow(row_count) self.ui.xsltParamsTable.setItem(row_count, 0, QTableWidgetItem("")) self.ui.xsltParamsTable.setItem(row_count, 1, QTableWidgetItem("")) self.ui.xsltParamsTable.setCurrentCell(row_count, 0) def remove_parameter(self): """Entfernt den ausgewählten Parameter.""" current_row = self.ui.xsltParamsTable.currentRow() if current_row >= 0: self.ui.xsltParamsTable.removeRow(current_row) def get_data(self): """ Gibt die bearbeiteten Daten zurück. Returns: dict mit 'bez', 'xslt_params', 'force_transform', oder None bei Validierungsfehler """ bez = self.ui.bezEdit.text().strip() if not bez: QMessageBox.warning(self, "Warnung", "Bitte geben Sie eine Bezeichnung ein.") return None xslt_params = {} for row in range(self.ui.xsltParamsTable.rowCount()): key_item = self.ui.xsltParamsTable.item(row, 0) value_item = self.ui.xsltParamsTable.item(row, 1) if key_item and value_item: key = key_item.text().strip() if key: xslt_params[key] = value_item.text().strip() return { "bez": bez, "xslt_params": xslt_params, "force_transform": self.ui.alle_xml_transformieren.isChecked(), } def accept(self): """Überschreibt accept() um Datenvalidierung durchzuführen.""" if self.get_data() is not None: super().accept()