diff --git a/DocuMentor.wxs b/DocuMentor.wxs index 22cffcd..cd483fb 100644 --- a/DocuMentor.wxs +++ b/DocuMentor.wxs @@ -4,7 +4,7 @@ str: diff --git a/src/ui/AppSettings.py b/src/ui/AppSettings.py index 059e932..a4b6a31 100644 --- a/src/ui/AppSettings.py +++ b/src/ui/AppSettings.py @@ -391,6 +391,7 @@ class AppSettingsDlg(QDialog): xsl_dir_id=project_data["xsl_dir_id"] if project_data["xsl_dir_id"] != -1 else 1, postgre_sql_db_id=project_data["postgre_sql_db_id"] if project_data["postgre_sql_db_id"] != -1 else 1, fop_config_dir=Path(project_data["fop_config_dir"]) if project_data.get("fop_config_dir") else None, + xslt_params=project_data.get("xslt_params", {}), ) self.temp_pdf_projects.append(new_project) self._populate_pdf_project_table() @@ -422,6 +423,7 @@ class AppSettingsDlg(QDialog): "xsl_dir_id": pdf_project.xsl_dir_id, "postgre_sql_db_id": pdf_project.postgre_sql_db_id, "fop_config_dir": str(pdf_project.fop_config_dir) if pdf_project.fop_config_dir else None, + "xslt_params": dict(pdf_project.xslt_params), } dialog = PdfProjectDlg(self, project_data, edit_mode=True) if dialog.exec() == PdfProjectDlg.DialogCode.Accepted: @@ -450,6 +452,7 @@ class AppSettingsDlg(QDialog): pdf_project.fop_config_dir = ( Path(new_data["fop_config_dir"]) if new_data.get("fop_config_dir") else None ) + pdf_project.xslt_params = new_data.get("xslt_params", {}) self._populate_pdf_project_table() self.settings.pdf_projects = self.temp_pdf_projects.copy() self.settings.save() diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index e6c1330..b165470 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -495,6 +495,7 @@ class MainWindow( if project_data["postgre_sql_db_id"] != -1 else 1, fop_config_dir=Path(project_data["fop_config_dir"]) if project_data.get("fop_config_dir") else None, + xslt_params=project_data.get("xslt_params", {}), ) # Erstelle Projekt-Ordnerstruktur diff --git a/src/ui/PdfProject.py b/src/ui/PdfProject.py index 3afefae..af16fbe 100644 --- a/src/ui/PdfProject.py +++ b/src/ui/PdfProject.py @@ -5,6 +5,7 @@ from PySide6.QtWidgets import QDialog, QFileDialog, QMessageBox from conf import app_settings from ui.PdfProject_ui import Ui_projectDlg +from ui.ProjectXsltParamsDialog import ProjectXsltParamsDialog class PdfProjectDlg(QDialog): @@ -26,6 +27,7 @@ class PdfProjectDlg(QDialog): # Projektdaten speichern self.project_data = project_data or {} self.edit_mode = edit_mode + self.xslt_params: dict[str, str] = dict(self.project_data.get("xslt_params", {})) # Dialog-Eigenschaften setzen self.setModal(True) @@ -53,6 +55,9 @@ class PdfProjectDlg(QDialog): # Browse-Button für FOP-Config-Ordner self.ui.btnBrowseFopConfig.clicked.connect(self.browse_fop_config_dir) + # XSLT-Parameter bearbeiten + self.ui.btnEditXsltParams.clicked.connect(self._edit_xslt_params) + # OK/Cancel Buttons sind bereits in der UI-Datei verbunden # self.ui.buttonBox.accepted.connect(self.accept) # self.ui.buttonBox.rejected.connect(self.reject) @@ -190,6 +195,12 @@ class PdfProjectDlg(QDialog): if selected_dir: self.ui.lineFopConfigDir.setText(selected_dir) + def _edit_xslt_params(self): + """Öffnet den Dialog zur Bearbeitung der projektweiten XSLT-Parameter.""" + dialog = ProjectXsltParamsDialog(self, self.xslt_params) + if dialog.exec() == ProjectXsltParamsDialog.DialogCode.Accepted: + self.xslt_params = dialog.get_params() + def validate_and_accept(self): """Validiert die Eingaben und akzeptiert den Dialog.""" # Projekt-Name prüfen @@ -269,7 +280,8 @@ class PdfProjectDlg(QDialog): 'apache_fop_id': self.ui.cB_ApacheFop.currentData(), 'diff_pdf_id': self.ui.cB_Diff_Pdf.currentData(), 'postgre_sql_db_id': self.ui.cB_Postgres.currentData(), - 'fop_config_dir': fop_config_dir if fop_config_dir else None + 'fop_config_dir': fop_config_dir if fop_config_dir else None, + 'xslt_params': self.xslt_params, } def _configure_edit_mode(self): diff --git a/src/ui/PdfProject.ui b/src/ui/PdfProject.ui index 37eecbd..1cb9121 100644 --- a/src/ui/PdfProject.ui +++ b/src/ui/PdfProject.ui @@ -7,7 +7,7 @@ 0 0 608 - 331 + 375 @@ -135,6 +135,20 @@ + + + + XSLT-Parameter: + + + + + + + Bearbeiten ... + + + diff --git a/src/ui/PdfProject_ui.py b/src/ui/PdfProject_ui.py index 9045736..adcc091 100644 --- a/src/ui/PdfProject_ui.py +++ b/src/ui/PdfProject_ui.py @@ -1,187 +1,199 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'PdfProject.ui' -## -## Created by: Qt User Interface Compiler version 6.9.2 -## -## 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, QApplication, QComboBox, QDialog, - QDialogButtonBox, QFormLayout, QFrame, QHBoxLayout, - QLabel, QLineEdit, QPushButton, QSizePolicy, - QVBoxLayout, QWidget) - -class Ui_projectDlg(object): - def setupUi(self, projectDlg): - if not projectDlg.objectName(): - projectDlg.setObjectName(u"projectDlg") - projectDlg.resize(608, 331) - self.verticalLayout = QVBoxLayout(projectDlg) - self.verticalLayout.setObjectName(u"verticalLayout") - self.widget = QWidget(projectDlg) - self.widget.setObjectName(u"widget") - self.formLayout = QFormLayout(self.widget) - self.formLayout.setObjectName(u"formLayout") - self.label = QLabel(self.widget) - self.label.setObjectName(u"label") - - self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label) - - self.lineProjectName = QLineEdit(self.widget) - self.lineProjectName.setObjectName(u"lineProjectName") - - self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.lineProjectName) - - self.label_2 = QLabel(self.widget) - self.label_2.setObjectName(u"label_2") - - self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_2) - - self.frame = QFrame(self.widget) - self.frame.setObjectName(u"frame") - self.frame.setFrameShape(QFrame.Shape.StyledPanel) - self.frame.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout = QHBoxLayout(self.frame) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.lineProjectDir = QLineEdit(self.frame) - self.lineProjectDir.setObjectName(u"lineProjectDir") - - self.horizontalLayout.addWidget(self.lineProjectDir) - - self.pushButton = QPushButton(self.frame) - self.pushButton.setObjectName(u"pushButton") - - self.horizontalLayout.addWidget(self.pushButton) - - - self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.frame) - - self.label_3 = QLabel(self.widget) - self.label_3.setObjectName(u"label_3") - - self.formLayout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_3) - - self.cB_XslDir = QComboBox(self.widget) - self.cB_XslDir.setObjectName(u"cB_XslDir") - - self.formLayout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.cB_XslDir) - - self.label_4 = QLabel(self.widget) - self.label_4.setObjectName(u"label_4") - - self.formLayout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_4) - - self.cB_JavaVm = QComboBox(self.widget) - self.cB_JavaVm.setObjectName(u"cB_JavaVm") - - self.formLayout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.cB_JavaVm) - - self.label_5 = QLabel(self.widget) - self.label_5.setObjectName(u"label_5") - - self.formLayout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_5) - - self.cB_SaxonJar = QComboBox(self.widget) - self.cB_SaxonJar.setObjectName(u"cB_SaxonJar") - - self.formLayout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.cB_SaxonJar) - - self.label_6 = QLabel(self.widget) - self.label_6.setObjectName(u"label_6") - - self.formLayout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_6) - - self.cB_ApacheFop = QComboBox(self.widget) - self.cB_ApacheFop.setObjectName(u"cB_ApacheFop") - - self.formLayout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.cB_ApacheFop) - - self.label_9 = QLabel(self.widget) - self.label_9.setObjectName(u"label_9") - - self.formLayout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.label_9) - - self.label_7 = QLabel(self.widget) - self.label_7.setObjectName(u"label_7") - - self.formLayout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.label_7) - - self.cB_Diff_Pdf = QComboBox(self.widget) - self.cB_Diff_Pdf.setObjectName(u"cB_Diff_Pdf") - - self.formLayout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.cB_Diff_Pdf) - - self.label_8 = QLabel(self.widget) - self.label_8.setObjectName(u"label_8") - - self.formLayout.setWidget(8, QFormLayout.ItemRole.LabelRole, self.label_8) - - self.cB_Postgres = QComboBox(self.widget) - self.cB_Postgres.setObjectName(u"cB_Postgres") - - self.formLayout.setWidget(8, QFormLayout.ItemRole.FieldRole, self.cB_Postgres) - - self.frame_2 = QFrame(self.widget) - self.frame_2.setObjectName(u"frame_2") - self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_2.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_2 = QHBoxLayout(self.frame_2) - self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") - self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) - self.lineFopConfigDir = QLineEdit(self.frame_2) - self.lineFopConfigDir.setObjectName(u"lineFopConfigDir") - - self.horizontalLayout_2.addWidget(self.lineFopConfigDir) - - self.btnBrowseFopConfig = QPushButton(self.frame_2) - self.btnBrowseFopConfig.setObjectName(u"btnBrowseFopConfig") - - self.horizontalLayout_2.addWidget(self.btnBrowseFopConfig) - - - self.formLayout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.frame_2) - - - self.verticalLayout.addWidget(self.widget) - - self.buttonBox = QDialogButtonBox(projectDlg) - 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(projectDlg) - self.buttonBox.accepted.connect(projectDlg.accept) - self.buttonBox.rejected.connect(projectDlg.reject) - - QMetaObject.connectSlotsByName(projectDlg) - # setupUi - - def retranslateUi(self, projectDlg): - projectDlg.setWindowTitle(QCoreApplication.translate("projectDlg", u"PDF-Projekt", None)) - self.label.setText(QCoreApplication.translate("projectDlg", u"Name:", None)) - self.label_2.setText(QCoreApplication.translate("projectDlg", u"Projekt-Ordner:", None)) - self.pushButton.setText(QCoreApplication.translate("projectDlg", u"Durchsuchen ...", None)) - self.label_3.setText(QCoreApplication.translate("projectDlg", u"XSL-Ordner:", None)) - self.label_4.setText(QCoreApplication.translate("projectDlg", u"Java VM:", None)) - self.label_5.setText(QCoreApplication.translate("projectDlg", u"Saxon Jar:", None)) - self.label_6.setText(QCoreApplication.translate("projectDlg", u"Apache FOP:", None)) - self.label_9.setText(QCoreApplication.translate("projectDlg", u"FOP-Config-Ordner:", None)) - self.label_7.setText(QCoreApplication.translate("projectDlg", u"diff-pdf:", None)) - self.label_8.setText(QCoreApplication.translate("projectDlg", u"Postgres:", None)) - self.btnBrowseFopConfig.setText(QCoreApplication.translate("projectDlg", u"Durchsuchen ...", None)) - # retranslateUi - +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'PdfProject.ui' +## +## Created by: Qt User Interface Compiler version 6.10.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, QApplication, QComboBox, QDialog, + QDialogButtonBox, QFormLayout, QFrame, QHBoxLayout, + QLabel, QLineEdit, QPushButton, QSizePolicy, + QVBoxLayout, QWidget) + +class Ui_projectDlg(object): + def setupUi(self, projectDlg): + if not projectDlg.objectName(): + projectDlg.setObjectName(u"projectDlg") + projectDlg.resize(608, 331) + self.verticalLayout = QVBoxLayout(projectDlg) + self.verticalLayout.setObjectName(u"verticalLayout") + self.widget = QWidget(projectDlg) + self.widget.setObjectName(u"widget") + self.formLayout = QFormLayout(self.widget) + self.formLayout.setObjectName(u"formLayout") + self.label = QLabel(self.widget) + self.label.setObjectName(u"label") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label) + + self.lineProjectName = QLineEdit(self.widget) + self.lineProjectName.setObjectName(u"lineProjectName") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.lineProjectName) + + self.label_2 = QLabel(self.widget) + self.label_2.setObjectName(u"label_2") + + self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_2) + + self.frame = QFrame(self.widget) + self.frame.setObjectName(u"frame") + self.frame.setFrameShape(QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout = QHBoxLayout(self.frame) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.lineProjectDir = QLineEdit(self.frame) + self.lineProjectDir.setObjectName(u"lineProjectDir") + + self.horizontalLayout.addWidget(self.lineProjectDir) + + self.pushButton = QPushButton(self.frame) + self.pushButton.setObjectName(u"pushButton") + + self.horizontalLayout.addWidget(self.pushButton) + + + self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.frame) + + self.label_3 = QLabel(self.widget) + self.label_3.setObjectName(u"label_3") + + self.formLayout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_3) + + self.cB_XslDir = QComboBox(self.widget) + self.cB_XslDir.setObjectName(u"cB_XslDir") + + self.formLayout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.cB_XslDir) + + self.label_4 = QLabel(self.widget) + self.label_4.setObjectName(u"label_4") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_4) + + self.cB_JavaVm = QComboBox(self.widget) + self.cB_JavaVm.setObjectName(u"cB_JavaVm") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.cB_JavaVm) + + self.label_5 = QLabel(self.widget) + self.label_5.setObjectName(u"label_5") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_5) + + self.cB_SaxonJar = QComboBox(self.widget) + self.cB_SaxonJar.setObjectName(u"cB_SaxonJar") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.cB_SaxonJar) + + self.label_6 = QLabel(self.widget) + self.label_6.setObjectName(u"label_6") + + self.formLayout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_6) + + self.cB_ApacheFop = QComboBox(self.widget) + self.cB_ApacheFop.setObjectName(u"cB_ApacheFop") + + self.formLayout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.cB_ApacheFop) + + self.label_9 = QLabel(self.widget) + self.label_9.setObjectName(u"label_9") + + self.formLayout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.label_9) + + self.label_7 = QLabel(self.widget) + self.label_7.setObjectName(u"label_7") + + self.formLayout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.label_7) + + self.cB_Diff_Pdf = QComboBox(self.widget) + self.cB_Diff_Pdf.setObjectName(u"cB_Diff_Pdf") + + self.formLayout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.cB_Diff_Pdf) + + self.label_8 = QLabel(self.widget) + self.label_8.setObjectName(u"label_8") + + self.formLayout.setWidget(8, QFormLayout.ItemRole.LabelRole, self.label_8) + + self.cB_Postgres = QComboBox(self.widget) + self.cB_Postgres.setObjectName(u"cB_Postgres") + + self.formLayout.setWidget(8, QFormLayout.ItemRole.FieldRole, self.cB_Postgres) + + self.label_10 = QLabel(self.widget) + self.label_10.setObjectName(u"label_10") + + self.formLayout.setWidget(9, QFormLayout.ItemRole.LabelRole, self.label_10) + + self.btnEditXsltParams = QPushButton(self.widget) + self.btnEditXsltParams.setObjectName(u"btnEditXsltParams") + + self.formLayout.setWidget(9, QFormLayout.ItemRole.FieldRole, self.btnEditXsltParams) + + self.frame_2 = QFrame(self.widget) + self.frame_2.setObjectName(u"frame_2") + self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_2 = QHBoxLayout(self.frame_2) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.lineFopConfigDir = QLineEdit(self.frame_2) + self.lineFopConfigDir.setObjectName(u"lineFopConfigDir") + + self.horizontalLayout_2.addWidget(self.lineFopConfigDir) + + self.btnBrowseFopConfig = QPushButton(self.frame_2) + self.btnBrowseFopConfig.setObjectName(u"btnBrowseFopConfig") + + self.horizontalLayout_2.addWidget(self.btnBrowseFopConfig) + + + self.formLayout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.frame_2) + + + self.verticalLayout.addWidget(self.widget) + + self.buttonBox = QDialogButtonBox(projectDlg) + 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(projectDlg) + self.buttonBox.accepted.connect(projectDlg.accept) + self.buttonBox.rejected.connect(projectDlg.reject) + + QMetaObject.connectSlotsByName(projectDlg) + # setupUi + + def retranslateUi(self, projectDlg): + projectDlg.setWindowTitle(QCoreApplication.translate("projectDlg", u"PDF-Projekt", None)) + self.label.setText(QCoreApplication.translate("projectDlg", u"Name:", None)) + self.label_2.setText(QCoreApplication.translate("projectDlg", u"Projekt-Ordner:", None)) + self.pushButton.setText(QCoreApplication.translate("projectDlg", u"Durchsuchen ...", None)) + self.label_3.setText(QCoreApplication.translate("projectDlg", u"XSL-Ordner:", None)) + self.label_4.setText(QCoreApplication.translate("projectDlg", u"Java VM:", None)) + self.label_5.setText(QCoreApplication.translate("projectDlg", u"Saxon Jar:", None)) + self.label_6.setText(QCoreApplication.translate("projectDlg", u"Apache FOP:", None)) + self.label_9.setText(QCoreApplication.translate("projectDlg", u"FOP-Config-Ordner:", None)) + self.label_7.setText(QCoreApplication.translate("projectDlg", u"diff-pdf:", None)) + self.label_8.setText(QCoreApplication.translate("projectDlg", u"Postgres:", None)) + self.label_10.setText(QCoreApplication.translate("projectDlg", u"XSLT-Parameter:", None)) + self.btnEditXsltParams.setText(QCoreApplication.translate("projectDlg", u"Bearbeiten ...", None)) + self.btnBrowseFopConfig.setText(QCoreApplication.translate("projectDlg", u"Durchsuchen ...", None)) + # retranslateUi + diff --git a/src/ui/ProjectXsltParamsDialog.py b/src/ui/ProjectXsltParamsDialog.py new file mode 100644 index 0000000..e44a09d --- /dev/null +++ b/src/ui/ProjectXsltParamsDialog.py @@ -0,0 +1,64 @@ +from PySide6.QtWidgets import QDialog, QTableWidgetItem +from ui.ProjectXsltParamsDialog_ui import Ui_ProjectXsltParamsDialog + + +class ProjectXsltParamsDialog(QDialog): + """Dialog zur Bearbeitung projektweiter XSLT-Parameter.""" + + def __init__(self, parent=None, xslt_params: dict[str, str] | None = None): + super().__init__(parent) + + self.ui = Ui_ProjectXsltParamsDialog() + self.ui.setupUi(self) + + self.ui.addParamButton.clicked.connect(self._add_parameter) + self.ui.removeParamButton.clicked.connect(self._remove_parameter) + + self._setup_table() + + if xslt_params: + self._load_params(xslt_params) + + def _setup_table(self): + """Konfiguriert die Tabelle.""" + self.ui.xsltParamsTable.setColumnWidth(0, 200) + self.ui.xsltParamsTable.setColumnWidth(1, 300) + self.ui.xsltParamsTable.horizontalHeader().setStretchLastSection(True) + + def _load_params(self, params: dict[str, str]): + """Lädt die XSLT-Parameter in die Tabelle.""" + 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 _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_params(self) -> dict[str, str]: + """ + Gibt die bearbeiteten XSLT-Parameter zurück. + + Returns: + dict[str, str]: Dictionary mit allen XSLT-Parametern + """ + 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: + params[key] = value_item.text().strip() + return params diff --git a/src/ui/ProjectXsltParamsDialog.ui b/src/ui/ProjectXsltParamsDialog.ui new file mode 100644 index 0000000..74f181d --- /dev/null +++ b/src/ui/ProjectXsltParamsDialog.ui @@ -0,0 +1,164 @@ + + + ProjectXsltParamsDialog + + + + 0 + 0 + 600 + 400 + + + + Projektweite XSLT-Parameter + + + true + + + + + + XSLT-Parameter + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::Shape::NoFrame + + + 2 + + + true + + + + Parameter + + + + + Wert + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + Parameter hinzufügen + + + + + + + + + + Parameter entfernen + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + true + + + + + + + + + buttonBox + accepted() + ProjectXsltParamsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ProjectXsltParamsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/ProjectXsltParamsDialog_ui.py b/src/ui/ProjectXsltParamsDialog_ui.py new file mode 100644 index 0000000..dc784fc --- /dev/null +++ b/src/ui/ProjectXsltParamsDialog_ui.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'ProjectXsltParamsDialog.ui' +## +## Created by: Qt User Interface Compiler version 6.10.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, QApplication, QDialog, QDialogButtonBox, + QFrame, QGroupBox, QHBoxLayout, QHeaderView, + QPushButton, QSizePolicy, QSpacerItem, QTableWidget, + QTableWidgetItem, QVBoxLayout, QWidget) + +class Ui_ProjectXsltParamsDialog(object): + def setupUi(self, ProjectXsltParamsDialog): + if not ProjectXsltParamsDialog.objectName(): + ProjectXsltParamsDialog.setObjectName(u"ProjectXsltParamsDialog") + ProjectXsltParamsDialog.resize(600, 400) + ProjectXsltParamsDialog.setModal(True) + self.verticalLayout = QVBoxLayout(ProjectXsltParamsDialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.xsltParamsGroupBox = QGroupBox(ProjectXsltParamsDialog) + self.xsltParamsGroupBox.setObjectName(u"xsltParamsGroupBox") + self.xsltParamsLayout = QVBoxLayout(self.xsltParamsGroupBox) + self.xsltParamsLayout.setObjectName(u"xsltParamsLayout") + self.xsltParamsLayout.setContentsMargins(0, 0, 0, 0) + 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.setFrameShape(QFrame.Shape.NoFrame) + self.xsltParamsTable.setColumnCount(2) + self.xsltParamsTable.horizontalHeader().setVisible(True) + + self.xsltParamsLayout.addWidget(self.xsltParamsTable) + + self.xsltParamsButtonLayout = QHBoxLayout() + self.xsltParamsButtonLayout.setObjectName(u"xsltParamsButtonLayout") + self.horizontalSpacer_left = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.xsltParamsButtonLayout.addItem(self.horizontalSpacer_left) + + self.addParamButton = QPushButton(self.xsltParamsGroupBox) + self.addParamButton.setObjectName(u"addParamButton") + icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) + self.addParamButton.setIcon(icon) + + self.xsltParamsButtonLayout.addWidget(self.addParamButton) + + self.removeParamButton = QPushButton(self.xsltParamsGroupBox) + self.removeParamButton.setObjectName(u"removeParamButton") + icon1 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) + self.removeParamButton.setIcon(icon1) + + self.xsltParamsButtonLayout.addWidget(self.removeParamButton) + + self.horizontalSpacer_right = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.xsltParamsButtonLayout.addItem(self.horizontalSpacer_right) + + + self.xsltParamsLayout.addLayout(self.xsltParamsButtonLayout) + + + self.verticalLayout.addWidget(self.xsltParamsGroupBox) + + self.buttonBox = QDialogButtonBox(ProjectXsltParamsDialog) + 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(ProjectXsltParamsDialog) + self.buttonBox.accepted.connect(ProjectXsltParamsDialog.accept) + self.buttonBox.rejected.connect(ProjectXsltParamsDialog.reject) + + QMetaObject.connectSlotsByName(ProjectXsltParamsDialog) + # setupUi + + def retranslateUi(self, ProjectXsltParamsDialog): + ProjectXsltParamsDialog.setWindowTitle(QCoreApplication.translate("ProjectXsltParamsDialog", u"Projektweite XSLT-Parameter", None)) + self.xsltParamsGroupBox.setTitle(QCoreApplication.translate("ProjectXsltParamsDialog", u"XSLT-Parameter", None)) + ___qtablewidgetitem = self.xsltParamsTable.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("ProjectXsltParamsDialog", u"Parameter", None)); + ___qtablewidgetitem1 = self.xsltParamsTable.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText(QCoreApplication.translate("ProjectXsltParamsDialog", u"Wert", None)); + self.addParamButton.setText(QCoreApplication.translate("ProjectXsltParamsDialog", u"Parameter hinzuf\u00fcgen", None)) + self.removeParamButton.setText(QCoreApplication.translate("ProjectXsltParamsDialog", u"Parameter entfernen", None)) + # retranslateUi + diff --git a/src/ui/mixins/transformation.py b/src/ui/mixins/transformation.py index 1af3271..d954640 100644 --- a/src/ui/mixins/transformation.py +++ b/src/ui/mixins/transformation.py @@ -486,6 +486,9 @@ class TransformationMixin: xslt_params.update(parent_params) logger.debug(f"Hierarchische Parameter gesammelt: {parent_params}") else: + # Ohne TreeWidgetItem-Kontext: nur Projekt-Parameter als Basis + if hasattr(self, "project") and self.project and self.project.xslt_params: + xslt_params.update(self.project.xslt_params) logger.warning( "Kein TreeWidgetItem-Kontext verfügbar - " "übergeordnete TreeNode-Parameter werden nicht berücksichtigt" diff --git a/src/ui/mixins/tree_manager.py b/src/ui/mixins/tree_manager.py index f233268..03eb2c2 100644 --- a/src/ui/mixins/tree_manager.py +++ b/src/ui/mixins/tree_manager.py @@ -1683,7 +1683,11 @@ class TreeManagerMixin: parent_params = {} try: - # Sammle alle Eltern-Items in einer Liste (von unten nach oben) + # 1. Projektweite Parameter als Basis (niedrigste Priorität) + if hasattr(self, "project") and self.project and self.project.xslt_params: + parent_params.update(self.project.xslt_params) + + # 2. Sammle alle Eltern-Items in einer Liste (von unten nach oben) parents = [] current_item = item.parent() diff --git a/uv.lock b/uv.lock index 02c5dcb..c760a81 100644 --- a/uv.lock +++ b/uv.lock @@ -34,7 +34,7 @@ wheels = [ [[package]] name = "documentor" -version = "1.3.0" +version = "1.4.0" source = { virtual = "." } dependencies = [ { name = "connectorx" },