From 21547003f92a88796ca1fdfc4402d73b672fa3c0 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Tue, 12 Aug 2025 20:56:26 +0200 Subject: [PATCH] Nodes sollen bearbeitbar sein --- src/ui/MainWindow.py | 127 +++++++++++++++++++++- src/ui/TreeNodeEditDialog.py | 158 ++++++++++++++++++++++++++++ src/ui/TreeNodeEditDialog.ui | 179 ++++++++++++++++++++++++++++++++ src/ui/TreeNodeEditDialog_ui.py | 140 +++++++++++++++++++++++++ src/ui/XslFileEditDialog.py | 158 ++++++++++++++++++++++++++++ src/ui/XslFileEditDialog.ui | 179 ++++++++++++++++++++++++++++++++ src/ui/XslFileEditDialog_ui.py | 140 +++++++++++++++++++++++++ 7 files changed, 1077 insertions(+), 4 deletions(-) create mode 100644 src/ui/TreeNodeEditDialog.py create mode 100644 src/ui/TreeNodeEditDialog.ui create mode 100644 src/ui/TreeNodeEditDialog_ui.py create mode 100644 src/ui/XslFileEditDialog.py create mode 100644 src/ui/XslFileEditDialog.ui create mode 100644 src/ui/XslFileEditDialog_ui.py diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 2700531..57ccbce 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -12,6 +12,8 @@ from PySide6.QtPdf import QPdfDocument from ui.MainWinddow_ui import Ui_MainWindow from ui.AppSettings import AppSettingsDlg from ui.PdfProject import PdfProjectDlg +from ui.TreeNodeEditDialog import TreeNodeEditDialog +from ui.XslFileEditDialog import XslFileEditDialog from conf import app_settings, Project, ProjectData, TreeNode, XslFile, XmlFile from pathlib import Path @@ -1041,9 +1043,49 @@ class MainWindow(QMainWindow): # TODO: Dialog zum Auswählen der XSL-Datei öffnen def _edit_tree_node(self, item): - """Bearbeitet einen TreeNode.""" + """ + Bearbeitet einen TreeNode. + + Args: + item: Das TreeWidgetItem des TreeNode + """ print(f"TreeNode bearbeiten: {item.text(0)}") - # TODO: Dialog zum Bearbeiten der Node-Daten öffnen + + try: + # Hole das Node-Objekt aus dem TreeWidgetItem + node = item.data(0, Qt.ItemDataRole.UserRole) + if not node or not isinstance(node, TreeNode): + QMessageBox.warning(self, "Warnung", "Kein gültiger TreeNode gefunden.") + return + + # Sammle Eltern-Parameter + parent_params = self._collect_parent_params(item) + + # Erstelle und zeige den Dialog + dialog = TreeNodeEditDialog(self, node, parent_params) + if dialog.exec() == TreeNodeEditDialog.DialogCode.Accepted: + # Hole die bearbeiteten Daten + data = dialog.get_data() + if data: + # Aktualisiere den Node + node.bez = data['bez'] + node.xslt_params = data['xslt_params'] + + print(f"TreeNode '{node.bez}' wurde aktualisiert") + print(f"XSLT-Parameter: {node.xslt_params}") + + # Speichere die Änderungen + self._save_project_settings() + + # Aktualisiere das TreeWidget + self._load_nodes_to_tree() + + QMessageBox.information(self, "Erfolg", "TreeNode wurde erfolgreich aktualisiert.") + + except Exception as e: + error_msg = f"Fehler beim Bearbeiten des TreeNode: {str(e)}" + print(error_msg) + QMessageBox.critical(self, "Fehler", error_msg) def _delete_tree_node(self, item): """Löscht einen TreeNode.""" @@ -1168,9 +1210,49 @@ class MainWindow(QMainWindow): QMessageBox.critical(self, "Fehler", error_msg) def _edit_xsl_file(self, item): - """Bearbeitet eine XSL-Datei.""" + """ + Bearbeitet eine XSL-Datei. + + Args: + item: Das TreeWidgetItem des XslFile + """ print(f"XslFile bearbeiten: {item.text(0)}") - # TODO: Dialog zum Bearbeiten der XSL-Datei öffnen + + try: + # Hole das Node-Objekt aus dem TreeWidgetItem + node = item.data(0, Qt.ItemDataRole.UserRole) + if not node or not isinstance(node, XslFile): + QMessageBox.warning(self, "Warnung", "Keine gültige XSL-Datei gefunden.") + return + + # Sammle Eltern-Parameter + parent_params = self._collect_parent_params(item) + + # Erstelle und zeige den Dialog + dialog = XslFileEditDialog(self, node, parent_params) + if dialog.exec() == XslFileEditDialog.DialogCode.Accepted: + # Hole die bearbeiteten Daten + data = dialog.get_data() + if data: + # Aktualisiere den Node + node.bez = data['bez'] + node.xslt_params = data['xslt_params'] + + print(f"XslFile '{node.bez}' wurde aktualisiert") + print(f"XSLT-Parameter: {node.xslt_params}") + + # Speichere die Änderungen + self._save_project_settings() + + # Aktualisiere das TreeWidget + self._load_nodes_to_tree() + + QMessageBox.information(self, "Erfolg", "XSL-Datei wurde erfolgreich aktualisiert.") + + except Exception as e: + error_msg = f"Fehler beim Bearbeiten der XSL-Datei: {str(e)}" + print(error_msg) + QMessageBox.critical(self, "Fehler", error_msg) def _delete_xsl_file(self, item): """Löscht eine XSL-Datei.""" @@ -1439,6 +1521,43 @@ class MainWindow(QMainWindow): existing_node.children.append(new_child) print(f"Neues Kind hinzugefügt zu Node {existing_node.id}: {new_child.bez}") + def _collect_parent_params(self, item): + """ + Sammelt die XSLT-Parameter aller Eltern-Nodes. + + Args: + item: Das TreeWidgetItem + + Returns: + dict: Dictionary mit allen Eltern-Parametern + """ + parent_params = {} + + try: + # Gehe die Hierarchie nach oben durch + current_item = item.parent() + + while current_item: + # Hole das Node-Objekt + parent_node = current_item.data(0, Qt.ItemDataRole.UserRole) + + if parent_node and hasattr(parent_node, 'xslt_params') and parent_node.xslt_params: + # Füge die Parameter des Eltern-Nodes hinzu + # Eltern-Parameter haben niedrigere Priorität (werden überschrieben) + for key, value in parent_node.xslt_params.items(): + if key not in parent_params: # Nur hinzufügen wenn noch nicht vorhanden + parent_params[key] = value + + # Gehe zum nächsten Eltern-Element + current_item = current_item.parent() + + print(f"Gesammelte Eltern-Parameter: {parent_params}") + return parent_params + + except Exception as e: + print(f"Fehler beim Sammeln der Eltern-Parameter: {e}") + return {} + def _save_project_settings(self): """ Speichert die aktualisierten Projekt-Einstellungen. diff --git a/src/ui/TreeNodeEditDialog.py b/src/ui/TreeNodeEditDialog.py new file mode 100644 index 0000000..fd883e1 --- /dev/null +++ b/src/ui/TreeNodeEditDialog.py @@ -0,0 +1,158 @@ +from PySide6.QtWidgets import QDialog, QTableWidgetItem, QMessageBox +from PySide6.QtCore import Qt + +from ui.TreeNodeEditDialog_ui import Ui_TreeNodeEditDialog +from conf import TreeNode + + +class TreeNodeEditDialog(QDialog): + """Dialog zur Bearbeitung von TreeNode-Objekten.""" + + def __init__(self, parent=None, node=None, parent_params=None): + """ + Initialisiert den Dialog. + + Args: + parent: Übergeordnetes Widget + node: TreeNode-Objekt zum Bearbeiten + parent_params: Dictionary mit Eltern-Parametern (nur anzeigen) + """ + super().__init__(parent) + + # UI einrichten + self.ui = Ui_TreeNodeEditDialog() + self.ui.setupUi(self) + + # Node-Objekt speichern + self.node = node + self.parent_params = parent_params or {} + + # Signale verbinden + self.ui.addParamButton.clicked.connect(self.add_parameter) + self.ui.removeParamButton.clicked.connect(self.remove_parameter) + + # Tabellen konfigurieren + self._setup_tables() + + # Daten laden + if self.node: + self._load_data() + + def _setup_tables(self): + """Konfiguriert die Tabellen.""" + # XSLT Parameter Tabelle + self.ui.xsltParamsTable.setColumnWidth(0, 200) + self.ui.xsltParamsTable.setColumnWidth(1, 300) + self.ui.xsltParamsTable.horizontalHeader().setStretchLastSection(True) + + # Eltern-Parameter Tabelle + 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 TreeNode in den Dialog.""" + if not self.node: + return + + # Bezeichnung setzen + self.ui.bezEdit.setText(str(self.node.bez) if self.node.bez else "") + + # XSLT Parameter laden + self._load_xslt_params() + + # Eltern-Parameter laden + 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()): + # Parameter-Name + key_item = QTableWidgetItem(str(key)) + self.ui.xsltParamsTable.setItem(row, 0, key_item) + + # Parameter-Wert + value_item = QTableWidgetItem(str(value)) + self.ui.xsltParamsTable.setItem(row, 1, value_item) + + 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()): + # Parameter-Name + key_item = QTableWidgetItem(str(key)) + key_item.setFlags(key_item.flags() & ~Qt.ItemFlag.ItemIsEditable) + self.ui.parentParamsTable.setItem(row, 0, key_item) + + # Parameter-Wert + 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) + + # Leere Items hinzufügen + key_item = QTableWidgetItem("") + value_item = QTableWidgetItem("") + + self.ui.xsltParamsTable.setItem(row_count, 0, key_item) + self.ui.xsltParamsTable.setItem(row_count, 1, value_item) + + # Fokus auf den neuen Parameter setzen + 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: Dictionary mit den bearbeiteten Daten oder None bei Fehler + """ + # Bezeichnung prüfen + bez = self.ui.bezEdit.text().strip() + if not bez: + QMessageBox.warning(self, "Warnung", "Bitte geben Sie eine Bezeichnung ein.") + return None + + # XSLT Parameter sammeln + 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() + value = value_item.text().strip() + + if key: # Nur Parameter mit nicht-leerem Schlüssel hinzufügen + xslt_params[key] = value + + return { + "bez": bez, + "xslt_params": xslt_params + } + + def accept(self): + """Überschreibt accept() um Datenvalidierung durchzuführen.""" + data = self.get_data() + if data is not None: + super().accept() diff --git a/src/ui/TreeNodeEditDialog.ui b/src/ui/TreeNodeEditDialog.ui new file mode 100644 index 0000000..2f4b6dc --- /dev/null +++ b/src/ui/TreeNodeEditDialog.ui @@ -0,0 +1,179 @@ + + + TreeNodeEditDialog + + + + 0 + 0 + 600 + 400 + + + + TreeNode bearbeiten + + + true + + + + + + QLayout::SizeConstraint::SetMaximumSize + + + + + Bezeichnung: + + + + + + + + + + + + XSLT Parameter + + + + + + 2 + + + true + + + + Parameter + + + + + Wert + + + + + + + + + + Parameter hinzufügen + + + + + + + Parameter entfernen + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Eltern-Parameter (nur anzeigen) + + + + + + 2 + + + QAbstractItemView::EditTrigger::NoEditTriggers + + + true + + + + Parameter + + + + + Wert + + + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + true + + + + + + + + + buttonBox + accepted() + TreeNodeEditDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TreeNodeEditDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/TreeNodeEditDialog_ui.py b/src/ui/TreeNodeEditDialog_ui.py new file mode 100644 index 0000000..2a47cf1 --- /dev/null +++ b/src/ui/TreeNodeEditDialog_ui.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'TreeNodeEditDialog.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QAbstractItemView, QApplication, QDialog, + QDialogButtonBox, QFormLayout, QGroupBox, QHBoxLayout, + QHeaderView, QLabel, QLayout, QLineEdit, + QPushButton, QSizePolicy, QSpacerItem, QTableWidget, + QTableWidgetItem, QVBoxLayout, QWidget) + +class Ui_TreeNodeEditDialog(object): + def setupUi(self, TreeNodeEditDialog): + if not TreeNodeEditDialog.objectName(): + TreeNodeEditDialog.setObjectName(u"TreeNodeEditDialog") + TreeNodeEditDialog.resize(600, 400) + TreeNodeEditDialog.setModal(True) + self.verticalLayout = QVBoxLayout(TreeNodeEditDialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.formLayout = QFormLayout() + self.formLayout.setObjectName(u"formLayout") + self.formLayout.setSizeConstraint(QLayout.SizeConstraint.SetMaximumSize) + self.bezLabel = QLabel(TreeNodeEditDialog) + self.bezLabel.setObjectName(u"bezLabel") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.bezLabel) + + self.bezEdit = QLineEdit(TreeNodeEditDialog) + self.bezEdit.setObjectName(u"bezEdit") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.bezEdit) + + + self.verticalLayout.addLayout(self.formLayout) + + self.xsltParamsGroupBox = QGroupBox(TreeNodeEditDialog) + self.xsltParamsGroupBox.setObjectName(u"xsltParamsGroupBox") + self.xsltParamsLayout = QVBoxLayout(self.xsltParamsGroupBox) + self.xsltParamsLayout.setObjectName(u"xsltParamsLayout") + self.xsltParamsTable = QTableWidget(self.xsltParamsGroupBox) + if (self.xsltParamsTable.columnCount() < 2): + self.xsltParamsTable.setColumnCount(2) + __qtablewidgetitem = QTableWidgetItem() + self.xsltParamsTable.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.xsltParamsTable.setHorizontalHeaderItem(1, __qtablewidgetitem1) + self.xsltParamsTable.setObjectName(u"xsltParamsTable") + self.xsltParamsTable.setColumnCount(2) + self.xsltParamsTable.horizontalHeader().setVisible(True) + + self.xsltParamsLayout.addWidget(self.xsltParamsTable) + + self.xsltParamsButtonLayout = QHBoxLayout() + self.xsltParamsButtonLayout.setObjectName(u"xsltParamsButtonLayout") + self.addParamButton = QPushButton(self.xsltParamsGroupBox) + self.addParamButton.setObjectName(u"addParamButton") + + self.xsltParamsButtonLayout.addWidget(self.addParamButton) + + self.removeParamButton = QPushButton(self.xsltParamsGroupBox) + self.removeParamButton.setObjectName(u"removeParamButton") + + self.xsltParamsButtonLayout.addWidget(self.removeParamButton) + + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.xsltParamsButtonLayout.addItem(self.horizontalSpacer) + + + self.xsltParamsLayout.addLayout(self.xsltParamsButtonLayout) + + + self.verticalLayout.addWidget(self.xsltParamsGroupBox) + + self.parentParamsGroupBox = QGroupBox(TreeNodeEditDialog) + self.parentParamsGroupBox.setObjectName(u"parentParamsGroupBox") + self.parentParamsLayout = QVBoxLayout(self.parentParamsGroupBox) + self.parentParamsLayout.setObjectName(u"parentParamsLayout") + self.parentParamsTable = QTableWidget(self.parentParamsGroupBox) + if (self.parentParamsTable.columnCount() < 2): + self.parentParamsTable.setColumnCount(2) + __qtablewidgetitem2 = QTableWidgetItem() + self.parentParamsTable.setHorizontalHeaderItem(0, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.parentParamsTable.setHorizontalHeaderItem(1, __qtablewidgetitem3) + self.parentParamsTable.setObjectName(u"parentParamsTable") + self.parentParamsTable.setColumnCount(2) + self.parentParamsTable.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.parentParamsTable.horizontalHeader().setVisible(True) + + self.parentParamsLayout.addWidget(self.parentParamsTable) + + + self.verticalLayout.addWidget(self.parentParamsGroupBox) + + self.buttonBox = QDialogButtonBox(TreeNodeEditDialog) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setOrientation(Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Cancel|QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setCenterButtons(True) + + self.verticalLayout.addWidget(self.buttonBox) + + + self.retranslateUi(TreeNodeEditDialog) + self.buttonBox.accepted.connect(TreeNodeEditDialog.accept) + self.buttonBox.rejected.connect(TreeNodeEditDialog.reject) + + QMetaObject.connectSlotsByName(TreeNodeEditDialog) + # setupUi + + def retranslateUi(self, TreeNodeEditDialog): + TreeNodeEditDialog.setWindowTitle(QCoreApplication.translate("TreeNodeEditDialog", u"TreeNode bearbeiten", None)) + self.bezLabel.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Bezeichnung:", None)) + self.xsltParamsGroupBox.setTitle(QCoreApplication.translate("TreeNodeEditDialog", u"XSLT Parameter", None)) + ___qtablewidgetitem = self.xsltParamsTable.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Parameter", None)); + ___qtablewidgetitem1 = self.xsltParamsTable.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Wert", None)); + self.addParamButton.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Parameter hinzuf\u00fcgen", None)) + self.removeParamButton.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Parameter entfernen", None)) + self.parentParamsGroupBox.setTitle(QCoreApplication.translate("TreeNodeEditDialog", u"Eltern-Parameter (nur anzeigen)", None)) + ___qtablewidgetitem2 = self.parentParamsTable.horizontalHeaderItem(0) + ___qtablewidgetitem2.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Parameter", None)); + ___qtablewidgetitem3 = self.parentParamsTable.horizontalHeaderItem(1) + ___qtablewidgetitem3.setText(QCoreApplication.translate("TreeNodeEditDialog", u"Wert", None)); + # retranslateUi + diff --git a/src/ui/XslFileEditDialog.py b/src/ui/XslFileEditDialog.py new file mode 100644 index 0000000..99a72b0 --- /dev/null +++ b/src/ui/XslFileEditDialog.py @@ -0,0 +1,158 @@ +from PySide6.QtWidgets import QDialog, QTableWidgetItem, QMessageBox +from PySide6.QtCore import Qt + +from ui.XslFileEditDialog_ui import Ui_XslFileEditDialog +from conf import XslFile + + +class XslFileEditDialog(QDialog): + """Dialog zur Bearbeitung von XslFile-Objekten.""" + + def __init__(self, parent=None, node=None, parent_params=None): + """ + Initialisiert den Dialog. + + Args: + parent: Übergeordnetes Widget + node: XslFile-Objekt zum Bearbeiten + parent_params: Dictionary mit Eltern-Parametern (nur anzeigen) + """ + super().__init__(parent) + + # UI einrichten + self.ui = Ui_XslFileEditDialog() + self.ui.setupUi(self) + + # Node-Objekt speichern + self.node = node + self.parent_params = parent_params or {} + + # Signale verbinden + self.ui.addParamButton.clicked.connect(self.add_parameter) + self.ui.removeParamButton.clicked.connect(self.remove_parameter) + + # Tabellen konfigurieren + self._setup_tables() + + # Daten laden + if self.node: + self._load_data() + + def _setup_tables(self): + """Konfiguriert die Tabellen.""" + # XSLT Parameter Tabelle + self.ui.xsltParamsTable.setColumnWidth(0, 200) + self.ui.xsltParamsTable.setColumnWidth(1, 300) + self.ui.xsltParamsTable.horizontalHeader().setStretchLastSection(True) + + # Eltern-Parameter Tabelle + 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 XslFile in den Dialog.""" + if not self.node: + return + + # Bezeichnung setzen + self.ui.bezEdit.setText(str(self.node.bez) if self.node.bez else "") + + # XSLT Parameter laden + self._load_xslt_params() + + # Eltern-Parameter laden + 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()): + # Parameter-Name + key_item = QTableWidgetItem(str(key)) + self.ui.xsltParamsTable.setItem(row, 0, key_item) + + # Parameter-Wert + value_item = QTableWidgetItem(str(value)) + self.ui.xsltParamsTable.setItem(row, 1, value_item) + + 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()): + # Parameter-Name + key_item = QTableWidgetItem(str(key)) + key_item.setFlags(key_item.flags() & ~Qt.ItemFlag.ItemIsEditable) + self.ui.parentParamsTable.setItem(row, 0, key_item) + + # Parameter-Wert + 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) + + # Leere Items hinzufügen + key_item = QTableWidgetItem("") + value_item = QTableWidgetItem("") + + self.ui.xsltParamsTable.setItem(row_count, 0, key_item) + self.ui.xsltParamsTable.setItem(row_count, 1, value_item) + + # Fokus auf den neuen Parameter setzen + 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: Dictionary mit den bearbeiteten Daten oder None bei Fehler + """ + # Bezeichnung prüfen + bez = self.ui.bezEdit.text().strip() + if not bez: + QMessageBox.warning(self, "Warnung", "Bitte geben Sie eine Bezeichnung ein.") + return None + + # XSLT Parameter sammeln + 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() + value = value_item.text().strip() + + if key: # Nur Parameter mit nicht-leerem Schlüssel hinzufügen + xslt_params[key] = value + + return { + "bez": bez, + "xslt_params": xslt_params + } + + def accept(self): + """Überschreibt accept() um Datenvalidierung durchzuführen.""" + data = self.get_data() + if data is not None: + super().accept() diff --git a/src/ui/XslFileEditDialog.ui b/src/ui/XslFileEditDialog.ui new file mode 100644 index 0000000..27ab48a --- /dev/null +++ b/src/ui/XslFileEditDialog.ui @@ -0,0 +1,179 @@ + + + XslFileEditDialog + + + + 0 + 0 + 600 + 400 + + + + XSL-Datei bearbeiten + + + true + + + + + + QLayout::SizeConstraint::SetMaximumSize + + + + + Bezeichnung: + + + + + + + + + + + + XSLT Parameter + + + + + + 2 + + + true + + + + Parameter + + + + + Wert + + + + + + + + + + Parameter hinzufügen + + + + + + + Parameter entfernen + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Eltern-Parameter (nur anzeigen) + + + + + + 2 + + + QAbstractItemView::EditTrigger::NoEditTriggers + + + true + + + + Parameter + + + + + Wert + + + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + true + + + + + + + + + buttonBox + accepted() + XslFileEditDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + XslFileEditDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/XslFileEditDialog_ui.py b/src/ui/XslFileEditDialog_ui.py new file mode 100644 index 0000000..91cdf6c --- /dev/null +++ b/src/ui/XslFileEditDialog_ui.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'XslFileEditDialog.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QAbstractItemView, QApplication, QDialog, + QDialogButtonBox, QFormLayout, QGroupBox, QHBoxLayout, + QHeaderView, QLabel, QLayout, QLineEdit, + QPushButton, QSizePolicy, QSpacerItem, QTableWidget, + QTableWidgetItem, QVBoxLayout, QWidget) + +class Ui_XslFileEditDialog(object): + def setupUi(self, XslFileEditDialog): + if not XslFileEditDialog.objectName(): + XslFileEditDialog.setObjectName(u"XslFileEditDialog") + XslFileEditDialog.resize(600, 400) + XslFileEditDialog.setModal(True) + self.verticalLayout = QVBoxLayout(XslFileEditDialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.formLayout = QFormLayout() + self.formLayout.setObjectName(u"formLayout") + self.formLayout.setSizeConstraint(QLayout.SizeConstraint.SetMaximumSize) + self.bezLabel = QLabel(XslFileEditDialog) + self.bezLabel.setObjectName(u"bezLabel") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.bezLabel) + + self.bezEdit = QLineEdit(XslFileEditDialog) + self.bezEdit.setObjectName(u"bezEdit") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.bezEdit) + + + self.verticalLayout.addLayout(self.formLayout) + + self.xsltParamsGroupBox = QGroupBox(XslFileEditDialog) + self.xsltParamsGroupBox.setObjectName(u"xsltParamsGroupBox") + self.xsltParamsLayout = QVBoxLayout(self.xsltParamsGroupBox) + self.xsltParamsLayout.setObjectName(u"xsltParamsLayout") + self.xsltParamsTable = QTableWidget(self.xsltParamsGroupBox) + if (self.xsltParamsTable.columnCount() < 2): + self.xsltParamsTable.setColumnCount(2) + __qtablewidgetitem = QTableWidgetItem() + self.xsltParamsTable.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.xsltParamsTable.setHorizontalHeaderItem(1, __qtablewidgetitem1) + self.xsltParamsTable.setObjectName(u"xsltParamsTable") + self.xsltParamsTable.setColumnCount(2) + self.xsltParamsTable.horizontalHeader().setVisible(True) + + self.xsltParamsLayout.addWidget(self.xsltParamsTable) + + self.xsltParamsButtonLayout = QHBoxLayout() + self.xsltParamsButtonLayout.setObjectName(u"xsltParamsButtonLayout") + self.addParamButton = QPushButton(self.xsltParamsGroupBox) + self.addParamButton.setObjectName(u"addParamButton") + + self.xsltParamsButtonLayout.addWidget(self.addParamButton) + + self.removeParamButton = QPushButton(self.xsltParamsGroupBox) + self.removeParamButton.setObjectName(u"removeParamButton") + + self.xsltParamsButtonLayout.addWidget(self.removeParamButton) + + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.xsltParamsButtonLayout.addItem(self.horizontalSpacer) + + + self.xsltParamsLayout.addLayout(self.xsltParamsButtonLayout) + + + self.verticalLayout.addWidget(self.xsltParamsGroupBox) + + self.parentParamsGroupBox = QGroupBox(XslFileEditDialog) + self.parentParamsGroupBox.setObjectName(u"parentParamsGroupBox") + self.parentParamsLayout = QVBoxLayout(self.parentParamsGroupBox) + self.parentParamsLayout.setObjectName(u"parentParamsLayout") + self.parentParamsTable = QTableWidget(self.parentParamsGroupBox) + if (self.parentParamsTable.columnCount() < 2): + self.parentParamsTable.setColumnCount(2) + __qtablewidgetitem2 = QTableWidgetItem() + self.parentParamsTable.setHorizontalHeaderItem(0, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.parentParamsTable.setHorizontalHeaderItem(1, __qtablewidgetitem3) + self.parentParamsTable.setObjectName(u"parentParamsTable") + self.parentParamsTable.setColumnCount(2) + self.parentParamsTable.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.parentParamsTable.horizontalHeader().setVisible(True) + + self.parentParamsLayout.addWidget(self.parentParamsTable) + + + self.verticalLayout.addWidget(self.parentParamsGroupBox) + + self.buttonBox = QDialogButtonBox(XslFileEditDialog) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setOrientation(Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Cancel|QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setCenterButtons(True) + + self.verticalLayout.addWidget(self.buttonBox) + + + self.retranslateUi(XslFileEditDialog) + self.buttonBox.accepted.connect(XslFileEditDialog.accept) + self.buttonBox.rejected.connect(XslFileEditDialog.reject) + + QMetaObject.connectSlotsByName(XslFileEditDialog) + # setupUi + + def retranslateUi(self, XslFileEditDialog): + XslFileEditDialog.setWindowTitle(QCoreApplication.translate("XslFileEditDialog", u"XSL-Datei bearbeiten", None)) + self.bezLabel.setText(QCoreApplication.translate("XslFileEditDialog", u"Bezeichnung:", None)) + self.xsltParamsGroupBox.setTitle(QCoreApplication.translate("XslFileEditDialog", u"XSLT Parameter", None)) + ___qtablewidgetitem = self.xsltParamsTable.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("XslFileEditDialog", u"Parameter", None)); + ___qtablewidgetitem1 = self.xsltParamsTable.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText(QCoreApplication.translate("XslFileEditDialog", u"Wert", None)); + self.addParamButton.setText(QCoreApplication.translate("XslFileEditDialog", u"Parameter hinzuf\u00fcgen", None)) + self.removeParamButton.setText(QCoreApplication.translate("XslFileEditDialog", u"Parameter entfernen", None)) + self.parentParamsGroupBox.setTitle(QCoreApplication.translate("XslFileEditDialog", u"Eltern-Parameter (nur anzeigen)", None)) + ___qtablewidgetitem2 = self.parentParamsTable.horizontalHeaderItem(0) + ___qtablewidgetitem2.setText(QCoreApplication.translate("XslFileEditDialog", u"Parameter", None)); + ___qtablewidgetitem3 = self.parentParamsTable.horizontalHeaderItem(1) + ___qtablewidgetitem3.setText(QCoreApplication.translate("XslFileEditDialog", u"Wert", None)); + # retranslateUi +