From 6976d21768734a44015077e099125ee3225960d5 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Sun, 4 Jan 2026 19:01:46 +0100 Subject: [PATCH] UX: Performance-Einstellungen in Programmeinstellungen integriert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Performance-Einstellungen wurden vom separaten Menüeintrag in den Programmeinstellungen-Dialog als eigener Tab verschoben: - Neuer "Performance"-Tab in AppSettings.ui mit drei Konfigurationsbereichen: • ThreadPoolExecutor: Worker-Anzahl (1-32, Standard: 8) • SaxonWorkerPool: Toggle für persistente JVM-Prozesse • FopWorkerPool: Toggle für persistente JVM-Prozesse - AppSettings.py erweitert: • _populate_performance_tab(): Lädt aktuelle Performance-Einstellungen • accept(): Speichert Performance-Einstellungen in app_settings - MainWindow.py bereinigt: • _setup_performance_menu() entfernt • _open_performance_settings() entfernt • Separater Menüeintrag im Projekt-Menü entfernt - AppSettings_ui.py mit pyside6-uic neu generiert Vorteile: Alle Programmeinstellungen sind nun zentral an einem Ort verfügbar, bessere Benutzererfahrung durch konsistente UI-Struktur. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CLAUDE.md | 4 +- src/ui/AppSettings.py | 27 +- src/ui/AppSettings.ui | 142 ++++++- src/ui/AppSettings_ui.py | 809 ++++++++++++++++++++++----------------- src/ui/MainWindow.py | 198 ---------- 5 files changed, 624 insertions(+), 556 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ff170a6..7468198 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,8 +7,8 @@ Spreche mit mir auf Deutsch! (Communicate with me in German!) DocuMentor (ehemals xsl-validator) ist eine PySide6-basierte Desktop-Anwendung zur Verwaltung und Validierung von XSL-Transformationen mit XML-Dateien. Sie bietet eine GUI zur Konfiguration von Transformations-Toolchains (Saxon, Apache FOP, diff-pdf) und zur Verwaltung von PDF-Generierungsprojekten mit PostgreSQL-Datenbankintegration. ## PySide6-GUI -- Beim Erstellen neuer Dialoge sollte immer eine passende UI-Datei erstellt werden -- Der Entwickler sollte später in der Lage sein, den neuen Dialog über die UI-Datei zu gestalten +- Beim Erstellen neuer Dialoge und Fenster sollte immer eine entsprechende UI-Datei erstellt werden +- Der Entwickler sollte später in der Lage sein, den neuen Dialog bzw. Fenster über diese UI-Datei zu gestalten - Aus der UI-Datei wird in Visual Studio Code über eine Erweiterung automatisch eine .py-Datei erzeugt - Die automatisch generierte .py-Datei muss in den Code eingebunden und verwendet werden diff --git a/src/ui/AppSettings.py b/src/ui/AppSettings.py index 09c791e..beda06b 100644 --- a/src/ui/AppSettings.py +++ b/src/ui/AppSettings.py @@ -46,6 +46,9 @@ class AppSettingsDlg(QDialog): self._setup_tables() self._populate_tables() + # Performance-Tab initialisieren + self._populate_performance_tab() + def _connect_signals(self): """Verbindet die Signale der UI-Elemente.""" # XSL-Ordner Tab @@ -253,24 +256,35 @@ class AppSettingsDlg(QDialog): name_item = QTableWidgetItem(postgresql_db.name) name_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.tablePostgreSqlDbs.setItem(row, 0, name_item) - + host_item = QTableWidgetItem(postgresql_db.host) host_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.tablePostgreSqlDbs.setItem(row, 1, host_item) - + port_item = QTableWidgetItem(str(postgresql_db.port)) port_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.tablePostgreSqlDbs.setItem(row, 2, port_item) - + database_item = QTableWidgetItem(postgresql_db.database) database_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.tablePostgreSqlDbs.setItem(row, 3, database_item) - + username_item = QTableWidgetItem(postgresql_db.username) username_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.ui.tablePostgreSqlDbs.setItem(row, 4, username_item) self.ui.tablePostgreSqlDbs.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) + def _populate_performance_tab(self): + """Initialisiert den Performance-Tab mit den aktuellen Einstellungen.""" + # Worker-Anzahl setzen + self.ui.spinBoxWorkerCount.setValue(self.settings.max_workers) + + # SaxonWorkerPool-Checkbox setzen + self.ui.checkBoxUseSaxonPool.setChecked(self.settings.use_saxon_worker_pool) + + # FopWorkerPool-Checkbox setzen + self.ui.checkBoxUseFopPool.setChecked(self.settings.use_fop_worker_pool) + # XSL-Ordner Methoden def _add_xsl_dir(self): """Fügt einen neuen XSL-Ordner hinzu.""" @@ -723,6 +737,11 @@ class AppSettingsDlg(QDialog): self.settings.xsl_dirs = self.temp_xsl_dirs.copy() self.settings.pdf_projects = self.temp_pdf_projects.copy() + # Performance-Einstellungen übernehmen + self.settings.max_workers = self.ui.spinBoxWorkerCount.value() + self.settings.use_saxon_worker_pool = self.ui.checkBoxUseSaxonPool.isChecked() + self.settings.use_fop_worker_pool = self.ui.checkBoxUseFopPool.isChecked() + self.settings.save() super().accept() diff --git a/src/ui/AppSettings.ui b/src/ui/AppSettings.ui index 0cccdec..f4d11fe 100644 --- a/src/ui/AppSettings.ui +++ b/src/ui/AppSettings.ui @@ -7,7 +7,7 @@ 0 0 833 - 387 + 446 @@ -520,6 +520,146 @@ + + + Performance + + + + + + ThreadPoolExecutor Einstellungen + + + + + + Anzahl paralleler Worker für Transformationen: + + + + + + + Anzahl der parallelen Worker-Threads für Transformationen (Standard: 8) + + + 1 + + + 32 + + + 8 + + + + + + + + + + SaxonWorkerPool Einstellungen + + + + + + Aktiviert persistente JVM-Prozesse für Saxon-Transformationen. +Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead +Nachteile: Benötigt JDK (javac) - funktioniert nicht mit JRE allein + +Deaktivieren Sie diese Option, wenn: +• Sie nur ein JRE (keine JDK) installiert haben +• Sie Probleme mit dem Worker-Pool haben +• Sie die Funktion testen möchten + + + SaxonWorkerPool verwenden (empfohlen) + + + + + + + <i>Hinweis: SaxonWorkerPool benötigt ein JDK (Java Development Kit).<br>Mit JRE allein werden Transformationen im Fallback-Modus ausgeführt.</i> + + + true + + + + + + + + + + FopWorkerPool Einstellungen + + + + + + Aktiviert persistente JVM-Prozesse für Apache FOP PDF-Generierung. +Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead +Nachteile: Benötigt JDK (javac) - funktioniert nicht mit JRE allein + +Deaktivieren Sie diese Option, wenn: +• Sie nur ein JRE (keine JDK) installiert haben +• Sie Probleme mit dem Worker-Pool haben +• Sie die Funktion testen möchten + + + FopWorkerPool verwenden (empfohlen) + + + + + + + <i>Hinweis: FopWorkerPool benötigt ein JDK (Java Development Kit).<br>Mit JRE allein werden PDFs im Fallback-Modus generiert.</i> + + + true + + + + + + + + + + true + + + <html><head/><body><p><span style=" font-weight:700; font-style:italic;">Hinweis: Änderungen in diesem Dialog sind unter Umständen erst nach neu start der Anwendung wirksam.</span></p></body></html> + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + diff --git a/src/ui/AppSettings_ui.py b/src/ui/AppSettings_ui.py index 4307ac4..f87de87 100644 --- a/src/ui/AppSettings_ui.py +++ b/src/ui/AppSettings_ui.py @@ -1,351 +1,458 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'AppSettings.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, QApplication, QDialog, QDialogButtonBox, - QFrame, QHBoxLayout, QHeaderView, QPushButton, - QSizePolicy, QTabWidget, QTableWidget, QTableWidgetItem, - QVBoxLayout, QWidget) - -class Ui_Dialog(object): - def setupUi(self, Dialog): - if not Dialog.objectName(): - Dialog.setObjectName(u"Dialog") - Dialog.resize(833, 387) - self.verticalLayout = QVBoxLayout(Dialog) - self.verticalLayout.setObjectName(u"verticalLayout") - self.tabSettings = QTabWidget(Dialog) - self.tabSettings.setObjectName(u"tabSettings") - self.tabSettings.setEnabled(True) - self.tabSettings.setElideMode(Qt.TextElideMode.ElideRight) - self.tabXsls = QWidget() - self.tabXsls.setObjectName(u"tabXsls") - self.verticalLayout_5 = QVBoxLayout(self.tabXsls) - self.verticalLayout_5.setObjectName(u"verticalLayout_5") - self.tableXsls = QTableWidget(self.tabXsls) - if (self.tableXsls.columnCount() < 2): - self.tableXsls.setColumnCount(2) - self.tableXsls.setObjectName(u"tableXsls") - self.tableXsls.setColumnCount(2) - - self.verticalLayout_5.addWidget(self.tableXsls) - - self.frame_2 = QFrame(self.tabXsls) - self.frame_2.setObjectName(u"frame_2") - sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) - self.frame_2.setSizePolicy(sizePolicy) - self.frame_2.setFrameShape(QFrame.Shape.NoFrame) - 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, 1, 0, 0) - self.addXsl = QPushButton(self.frame_2) - self.addXsl.setObjectName(u"addXsl") - icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) - self.addXsl.setIcon(icon) - - self.horizontalLayout_2.addWidget(self.addXsl) - - self.removeXsl = QPushButton(self.frame_2) - self.removeXsl.setObjectName(u"removeXsl") - self.removeXsl.setEnabled(False) - icon1 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) - self.removeXsl.setIcon(icon1) - - self.horizontalLayout_2.addWidget(self.removeXsl) - - - self.verticalLayout_5.addWidget(self.frame_2) - - self.tabSettings.addTab(self.tabXsls, "") - self.tabJavaVm = QWidget() - self.tabJavaVm.setObjectName(u"tabJavaVm") - self.verticalLayout_2 = QVBoxLayout(self.tabJavaVm) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.tableJavaVms = QTableWidget(self.tabJavaVm) - if (self.tableJavaVms.columnCount() < 2): - self.tableJavaVms.setColumnCount(2) - self.tableJavaVms.setObjectName(u"tableJavaVms") - self.tableJavaVms.setColumnCount(2) - - self.verticalLayout_2.addWidget(self.tableJavaVms) - - self.frame_3 = QFrame(self.tabJavaVm) - self.frame_3.setObjectName(u"frame_3") - sizePolicy.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) - self.frame_3.setSizePolicy(sizePolicy) - self.frame_3.setFrameShape(QFrame.Shape.NoFrame) - self.frame_3.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_3 = QHBoxLayout(self.frame_3) - self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") - self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) - self.addJavaVm = QPushButton(self.frame_3) - self.addJavaVm.setObjectName(u"addJavaVm") - self.addJavaVm.setIcon(icon) - - self.horizontalLayout_3.addWidget(self.addJavaVm) - - self.removeJavaVm = QPushButton(self.frame_3) - self.removeJavaVm.setObjectName(u"removeJavaVm") - self.removeJavaVm.setEnabled(False) - self.removeJavaVm.setIcon(icon1) - - self.horizontalLayout_3.addWidget(self.removeJavaVm) - - - self.verticalLayout_2.addWidget(self.frame_3) - - self.tabSettings.addTab(self.tabJavaVm, "") - self.tabSaxon = QWidget() - self.tabSaxon.setObjectName(u"tabSaxon") - self.verticalLayout_4 = QVBoxLayout(self.tabSaxon) - self.verticalLayout_4.setObjectName(u"verticalLayout_4") - self.tableSaxons = QTableWidget(self.tabSaxon) - if (self.tableSaxons.columnCount() < 3): - self.tableSaxons.setColumnCount(3) - self.tableSaxons.setObjectName(u"tableSaxons") - self.tableSaxons.setColumnCount(3) - - self.verticalLayout_4.addWidget(self.tableSaxons) - - self.frame_4 = QFrame(self.tabSaxon) - self.frame_4.setObjectName(u"frame_4") - sizePolicy.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth()) - self.frame_4.setSizePolicy(sizePolicy) - self.frame_4.setFrameShape(QFrame.Shape.NoFrame) - self.frame_4.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_4 = QHBoxLayout(self.frame_4) - self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") - self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) - self.addSaxon = QPushButton(self.frame_4) - self.addSaxon.setObjectName(u"addSaxon") - self.addSaxon.setIcon(icon) - - self.horizontalLayout_4.addWidget(self.addSaxon) - - self.removeSaxon = QPushButton(self.frame_4) - self.removeSaxon.setObjectName(u"removeSaxon") - self.removeSaxon.setEnabled(False) - self.removeSaxon.setIcon(icon1) - - self.horizontalLayout_4.addWidget(self.removeSaxon) - - - self.verticalLayout_4.addWidget(self.frame_4) - - self.tabSettings.addTab(self.tabSaxon, "") - self.tabApacheFop = QWidget() - self.tabApacheFop.setObjectName(u"tabApacheFop") - self.verticalLayout_3 = QVBoxLayout(self.tabApacheFop) - self.verticalLayout_3.setObjectName(u"verticalLayout_3") - self.tableApacheFops = QTableWidget(self.tabApacheFop) - if (self.tableApacheFops.columnCount() < 3): - self.tableApacheFops.setColumnCount(3) - self.tableApacheFops.setObjectName(u"tableApacheFops") - self.tableApacheFops.setColumnCount(3) - - self.verticalLayout_3.addWidget(self.tableApacheFops) - - self.frame = QFrame(self.tabApacheFop) - self.frame.setObjectName(u"frame") - sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy) - self.frame.setFrameShape(QFrame.Shape.NoFrame) - self.frame.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout = QHBoxLayout(self.frame) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.addApacheFop = QPushButton(self.frame) - self.addApacheFop.setObjectName(u"addApacheFop") - self.addApacheFop.setIcon(icon) - - self.horizontalLayout.addWidget(self.addApacheFop) - - self.removeApacheFop = QPushButton(self.frame) - self.removeApacheFop.setObjectName(u"removeApacheFop") - self.removeApacheFop.setEnabled(False) - self.removeApacheFop.setIcon(icon1) - - self.horizontalLayout.addWidget(self.removeApacheFop) - - - self.verticalLayout_3.addWidget(self.frame) - - self.tabSettings.addTab(self.tabApacheFop, "") - self.tabDiffPdf = QWidget() - self.tabDiffPdf.setObjectName(u"tabDiffPdf") - self.verticalLayout_6 = QVBoxLayout(self.tabDiffPdf) - self.verticalLayout_6.setObjectName(u"verticalLayout_6") - self.tableDiffPdfs = QTableWidget(self.tabDiffPdf) - if (self.tableDiffPdfs.columnCount() < 4): - self.tableDiffPdfs.setColumnCount(4) - self.tableDiffPdfs.setObjectName(u"tableDiffPdfs") - self.tableDiffPdfs.setColumnCount(4) - - self.verticalLayout_6.addWidget(self.tableDiffPdfs) - - self.frame_5 = QFrame(self.tabDiffPdf) - self.frame_5.setObjectName(u"frame_5") - sizePolicy.setHeightForWidth(self.frame_5.sizePolicy().hasHeightForWidth()) - self.frame_5.setSizePolicy(sizePolicy) - self.frame_5.setFrameShape(QFrame.Shape.NoFrame) - self.frame_5.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_5 = QHBoxLayout(self.frame_5) - self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") - self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) - self.addDiffPdf = QPushButton(self.frame_5) - self.addDiffPdf.setObjectName(u"addDiffPdf") - self.addDiffPdf.setIcon(icon) - - self.horizontalLayout_5.addWidget(self.addDiffPdf) - - self.removeDiffPdf = QPushButton(self.frame_5) - self.removeDiffPdf.setObjectName(u"removeDiffPdf") - self.removeDiffPdf.setEnabled(False) - self.removeDiffPdf.setIcon(icon1) - - self.horizontalLayout_5.addWidget(self.removeDiffPdf) - - - self.verticalLayout_6.addWidget(self.frame_5) - - self.tabSettings.addTab(self.tabDiffPdf, "") - self.tabPostgreSql = QWidget() - self.tabPostgreSql.setObjectName(u"tabPostgreSql") - self.verticalLayout_8 = QVBoxLayout(self.tabPostgreSql) - self.verticalLayout_8.setObjectName(u"verticalLayout_8") - self.tablePostgreSqlDbs = QTableWidget(self.tabPostgreSql) - if (self.tablePostgreSqlDbs.columnCount() < 5): - self.tablePostgreSqlDbs.setColumnCount(5) - self.tablePostgreSqlDbs.setObjectName(u"tablePostgreSqlDbs") - self.tablePostgreSqlDbs.setColumnCount(5) - - self.verticalLayout_8.addWidget(self.tablePostgreSqlDbs) - - self.frame_7 = QFrame(self.tabPostgreSql) - self.frame_7.setObjectName(u"frame_7") - sizePolicy.setHeightForWidth(self.frame_7.sizePolicy().hasHeightForWidth()) - self.frame_7.setSizePolicy(sizePolicy) - self.frame_7.setFrameShape(QFrame.Shape.NoFrame) - self.frame_7.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_7 = QHBoxLayout(self.frame_7) - self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") - self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) - self.addPostgreSql = QPushButton(self.frame_7) - self.addPostgreSql.setObjectName(u"addPostgreSql") - self.addPostgreSql.setIcon(icon) - - self.horizontalLayout_7.addWidget(self.addPostgreSql) - - self.removePostgreSql = QPushButton(self.frame_7) - self.removePostgreSql.setObjectName(u"removePostgreSql") - self.removePostgreSql.setEnabled(False) - self.removePostgreSql.setIcon(icon1) - - self.horizontalLayout_7.addWidget(self.removePostgreSql) - - - self.verticalLayout_8.addWidget(self.frame_7) - - self.tabSettings.addTab(self.tabPostgreSql, "") - self.tabPdfProject = QWidget() - self.tabPdfProject.setObjectName(u"tabPdfProject") - self.verticalLayout_7 = QVBoxLayout(self.tabPdfProject) - self.verticalLayout_7.setObjectName(u"verticalLayout_7") - self.tablePdfProjects = QTableWidget(self.tabPdfProject) - if (self.tablePdfProjects.columnCount() < 7): - self.tablePdfProjects.setColumnCount(7) - self.tablePdfProjects.setObjectName(u"tablePdfProjects") - self.tablePdfProjects.setColumnCount(7) - - self.verticalLayout_7.addWidget(self.tablePdfProjects) - - self.frame_6 = QFrame(self.tabPdfProject) - self.frame_6.setObjectName(u"frame_6") - sizePolicy.setHeightForWidth(self.frame_6.sizePolicy().hasHeightForWidth()) - self.frame_6.setSizePolicy(sizePolicy) - self.frame_6.setFrameShape(QFrame.Shape.NoFrame) - self.frame_6.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_6 = QHBoxLayout(self.frame_6) - self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") - self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) - self.addProject = QPushButton(self.frame_6) - self.addProject.setObjectName(u"addProject") - self.addProject.setIcon(icon) - - self.horizontalLayout_6.addWidget(self.addProject) - - self.removeProject = QPushButton(self.frame_6) - self.removeProject.setObjectName(u"removeProject") - self.removeProject.setEnabled(False) - self.removeProject.setIcon(icon1) - - self.horizontalLayout_6.addWidget(self.removeProject) - - - self.verticalLayout_7.addWidget(self.frame_6) - - self.tabSettings.addTab(self.tabPdfProject, "") - - self.verticalLayout.addWidget(self.tabSettings) - - self.buttonBox = QDialogButtonBox(Dialog) - 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(Dialog) - self.buttonBox.accepted.connect(Dialog.accept) - self.buttonBox.rejected.connect(Dialog.reject) - - self.tabSettings.setCurrentIndex(0) - - - QMetaObject.connectSlotsByName(Dialog) - # setupUi - - def retranslateUi(self, Dialog): - Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Programm Einstellungen", None)) - self.addXsl.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeXsl.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabXsls), QCoreApplication.translate("Dialog", u"XSL-Ordner", None)) - self.addJavaVm.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeJavaVm.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabJavaVm), QCoreApplication.translate("Dialog", u"Java VM", None)) - self.addSaxon.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeSaxon.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabSaxon), QCoreApplication.translate("Dialog", u"Saxon", None)) - self.addApacheFop.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeApacheFop.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabApacheFop), QCoreApplication.translate("Dialog", u"Apache FOP", None)) - self.addDiffPdf.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeDiffPdf.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabDiffPdf), QCoreApplication.translate("Dialog", u"Diff-PDF", None)) - self.addPostgreSql.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removePostgreSql.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPostgreSql), QCoreApplication.translate("Dialog", u"PostgreSQL", None)) - self.addProject.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) - self.removeProject.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) - self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPdfProject), QCoreApplication.translate("Dialog", u"PDF-Projekte", None)) - # retranslateUi - +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'AppSettings.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, QCheckBox, QDialog, + QDialogButtonBox, QFrame, QGroupBox, QHBoxLayout, + QHeaderView, QLabel, QPushButton, QSizePolicy, + QSpacerItem, QSpinBox, QTabWidget, QTableWidget, + QTableWidgetItem, QVBoxLayout, QWidget) + +class Ui_Dialog(object): + def setupUi(self, Dialog): + if not Dialog.objectName(): + Dialog.setObjectName(u"Dialog") + Dialog.resize(833, 446) + self.verticalLayout = QVBoxLayout(Dialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.tabSettings = QTabWidget(Dialog) + self.tabSettings.setObjectName(u"tabSettings") + self.tabSettings.setEnabled(True) + self.tabSettings.setElideMode(Qt.TextElideMode.ElideRight) + self.tabXsls = QWidget() + self.tabXsls.setObjectName(u"tabXsls") + self.verticalLayout_5 = QVBoxLayout(self.tabXsls) + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.tableXsls = QTableWidget(self.tabXsls) + if (self.tableXsls.columnCount() < 2): + self.tableXsls.setColumnCount(2) + self.tableXsls.setObjectName(u"tableXsls") + self.tableXsls.setColumnCount(2) + + self.verticalLayout_5.addWidget(self.tableXsls) + + self.frame_2 = QFrame(self.tabXsls) + self.frame_2.setObjectName(u"frame_2") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) + self.frame_2.setSizePolicy(sizePolicy) + self.frame_2.setFrameShape(QFrame.Shape.NoFrame) + 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, 1, 0, 0) + self.addXsl = QPushButton(self.frame_2) + self.addXsl.setObjectName(u"addXsl") + icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) + self.addXsl.setIcon(icon) + + self.horizontalLayout_2.addWidget(self.addXsl) + + self.removeXsl = QPushButton(self.frame_2) + self.removeXsl.setObjectName(u"removeXsl") + self.removeXsl.setEnabled(False) + icon1 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) + self.removeXsl.setIcon(icon1) + + self.horizontalLayout_2.addWidget(self.removeXsl) + + + self.verticalLayout_5.addWidget(self.frame_2) + + self.tabSettings.addTab(self.tabXsls, "") + self.tabJavaVm = QWidget() + self.tabJavaVm.setObjectName(u"tabJavaVm") + self.verticalLayout_2 = QVBoxLayout(self.tabJavaVm) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.tableJavaVms = QTableWidget(self.tabJavaVm) + if (self.tableJavaVms.columnCount() < 2): + self.tableJavaVms.setColumnCount(2) + self.tableJavaVms.setObjectName(u"tableJavaVms") + self.tableJavaVms.setColumnCount(2) + + self.verticalLayout_2.addWidget(self.tableJavaVms) + + self.frame_3 = QFrame(self.tabJavaVm) + self.frame_3.setObjectName(u"frame_3") + sizePolicy.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) + self.frame_3.setSizePolicy(sizePolicy) + self.frame_3.setFrameShape(QFrame.Shape.NoFrame) + self.frame_3.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_3 = QHBoxLayout(self.frame_3) + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) + self.addJavaVm = QPushButton(self.frame_3) + self.addJavaVm.setObjectName(u"addJavaVm") + self.addJavaVm.setIcon(icon) + + self.horizontalLayout_3.addWidget(self.addJavaVm) + + self.removeJavaVm = QPushButton(self.frame_3) + self.removeJavaVm.setObjectName(u"removeJavaVm") + self.removeJavaVm.setEnabled(False) + self.removeJavaVm.setIcon(icon1) + + self.horizontalLayout_3.addWidget(self.removeJavaVm) + + + self.verticalLayout_2.addWidget(self.frame_3) + + self.tabSettings.addTab(self.tabJavaVm, "") + self.tabSaxon = QWidget() + self.tabSaxon.setObjectName(u"tabSaxon") + self.verticalLayout_4 = QVBoxLayout(self.tabSaxon) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.tableSaxons = QTableWidget(self.tabSaxon) + if (self.tableSaxons.columnCount() < 3): + self.tableSaxons.setColumnCount(3) + self.tableSaxons.setObjectName(u"tableSaxons") + self.tableSaxons.setColumnCount(3) + + self.verticalLayout_4.addWidget(self.tableSaxons) + + self.frame_4 = QFrame(self.tabSaxon) + self.frame_4.setObjectName(u"frame_4") + sizePolicy.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth()) + self.frame_4.setSizePolicy(sizePolicy) + self.frame_4.setFrameShape(QFrame.Shape.NoFrame) + self.frame_4.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_4 = QHBoxLayout(self.frame_4) + self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") + self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) + self.addSaxon = QPushButton(self.frame_4) + self.addSaxon.setObjectName(u"addSaxon") + self.addSaxon.setIcon(icon) + + self.horizontalLayout_4.addWidget(self.addSaxon) + + self.removeSaxon = QPushButton(self.frame_4) + self.removeSaxon.setObjectName(u"removeSaxon") + self.removeSaxon.setEnabled(False) + self.removeSaxon.setIcon(icon1) + + self.horizontalLayout_4.addWidget(self.removeSaxon) + + + self.verticalLayout_4.addWidget(self.frame_4) + + self.tabSettings.addTab(self.tabSaxon, "") + self.tabApacheFop = QWidget() + self.tabApacheFop.setObjectName(u"tabApacheFop") + self.verticalLayout_3 = QVBoxLayout(self.tabApacheFop) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.tableApacheFops = QTableWidget(self.tabApacheFop) + if (self.tableApacheFops.columnCount() < 3): + self.tableApacheFops.setColumnCount(3) + self.tableApacheFops.setObjectName(u"tableApacheFops") + self.tableApacheFops.setColumnCount(3) + + self.verticalLayout_3.addWidget(self.tableApacheFops) + + self.frame = QFrame(self.tabApacheFop) + self.frame.setObjectName(u"frame") + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setFrameShape(QFrame.Shape.NoFrame) + self.frame.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout = QHBoxLayout(self.frame) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.addApacheFop = QPushButton(self.frame) + self.addApacheFop.setObjectName(u"addApacheFop") + self.addApacheFop.setIcon(icon) + + self.horizontalLayout.addWidget(self.addApacheFop) + + self.removeApacheFop = QPushButton(self.frame) + self.removeApacheFop.setObjectName(u"removeApacheFop") + self.removeApacheFop.setEnabled(False) + self.removeApacheFop.setIcon(icon1) + + self.horizontalLayout.addWidget(self.removeApacheFop) + + + self.verticalLayout_3.addWidget(self.frame) + + self.tabSettings.addTab(self.tabApacheFop, "") + self.tabDiffPdf = QWidget() + self.tabDiffPdf.setObjectName(u"tabDiffPdf") + self.verticalLayout_6 = QVBoxLayout(self.tabDiffPdf) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.tableDiffPdfs = QTableWidget(self.tabDiffPdf) + if (self.tableDiffPdfs.columnCount() < 4): + self.tableDiffPdfs.setColumnCount(4) + self.tableDiffPdfs.setObjectName(u"tableDiffPdfs") + self.tableDiffPdfs.setColumnCount(4) + + self.verticalLayout_6.addWidget(self.tableDiffPdfs) + + self.frame_5 = QFrame(self.tabDiffPdf) + self.frame_5.setObjectName(u"frame_5") + sizePolicy.setHeightForWidth(self.frame_5.sizePolicy().hasHeightForWidth()) + self.frame_5.setSizePolicy(sizePolicy) + self.frame_5.setFrameShape(QFrame.Shape.NoFrame) + self.frame_5.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_5 = QHBoxLayout(self.frame_5) + self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") + self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) + self.addDiffPdf = QPushButton(self.frame_5) + self.addDiffPdf.setObjectName(u"addDiffPdf") + self.addDiffPdf.setIcon(icon) + + self.horizontalLayout_5.addWidget(self.addDiffPdf) + + self.removeDiffPdf = QPushButton(self.frame_5) + self.removeDiffPdf.setObjectName(u"removeDiffPdf") + self.removeDiffPdf.setEnabled(False) + self.removeDiffPdf.setIcon(icon1) + + self.horizontalLayout_5.addWidget(self.removeDiffPdf) + + + self.verticalLayout_6.addWidget(self.frame_5) + + self.tabSettings.addTab(self.tabDiffPdf, "") + self.tabPostgreSql = QWidget() + self.tabPostgreSql.setObjectName(u"tabPostgreSql") + self.verticalLayout_8 = QVBoxLayout(self.tabPostgreSql) + self.verticalLayout_8.setObjectName(u"verticalLayout_8") + self.tablePostgreSqlDbs = QTableWidget(self.tabPostgreSql) + if (self.tablePostgreSqlDbs.columnCount() < 5): + self.tablePostgreSqlDbs.setColumnCount(5) + self.tablePostgreSqlDbs.setObjectName(u"tablePostgreSqlDbs") + self.tablePostgreSqlDbs.setColumnCount(5) + + self.verticalLayout_8.addWidget(self.tablePostgreSqlDbs) + + self.frame_7 = QFrame(self.tabPostgreSql) + self.frame_7.setObjectName(u"frame_7") + sizePolicy.setHeightForWidth(self.frame_7.sizePolicy().hasHeightForWidth()) + self.frame_7.setSizePolicy(sizePolicy) + self.frame_7.setFrameShape(QFrame.Shape.NoFrame) + self.frame_7.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_7 = QHBoxLayout(self.frame_7) + self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.addPostgreSql = QPushButton(self.frame_7) + self.addPostgreSql.setObjectName(u"addPostgreSql") + self.addPostgreSql.setIcon(icon) + + self.horizontalLayout_7.addWidget(self.addPostgreSql) + + self.removePostgreSql = QPushButton(self.frame_7) + self.removePostgreSql.setObjectName(u"removePostgreSql") + self.removePostgreSql.setEnabled(False) + self.removePostgreSql.setIcon(icon1) + + self.horizontalLayout_7.addWidget(self.removePostgreSql) + + + self.verticalLayout_8.addWidget(self.frame_7) + + self.tabSettings.addTab(self.tabPostgreSql, "") + self.tabPdfProject = QWidget() + self.tabPdfProject.setObjectName(u"tabPdfProject") + self.verticalLayout_7 = QVBoxLayout(self.tabPdfProject) + self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.tablePdfProjects = QTableWidget(self.tabPdfProject) + if (self.tablePdfProjects.columnCount() < 7): + self.tablePdfProjects.setColumnCount(7) + self.tablePdfProjects.setObjectName(u"tablePdfProjects") + self.tablePdfProjects.setColumnCount(7) + + self.verticalLayout_7.addWidget(self.tablePdfProjects) + + self.frame_6 = QFrame(self.tabPdfProject) + self.frame_6.setObjectName(u"frame_6") + sizePolicy.setHeightForWidth(self.frame_6.sizePolicy().hasHeightForWidth()) + self.frame_6.setSizePolicy(sizePolicy) + self.frame_6.setFrameShape(QFrame.Shape.NoFrame) + self.frame_6.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_6 = QHBoxLayout(self.frame_6) + self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") + self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) + self.addProject = QPushButton(self.frame_6) + self.addProject.setObjectName(u"addProject") + self.addProject.setIcon(icon) + + self.horizontalLayout_6.addWidget(self.addProject) + + self.removeProject = QPushButton(self.frame_6) + self.removeProject.setObjectName(u"removeProject") + self.removeProject.setEnabled(False) + self.removeProject.setIcon(icon1) + + self.horizontalLayout_6.addWidget(self.removeProject) + + + self.verticalLayout_7.addWidget(self.frame_6) + + self.tabSettings.addTab(self.tabPdfProject, "") + self.tabPerformance = QWidget() + self.tabPerformance.setObjectName(u"tabPerformance") + self.verticalLayout_9 = QVBoxLayout(self.tabPerformance) + self.verticalLayout_9.setObjectName(u"verticalLayout_9") + self.groupBoxWorker = QGroupBox(self.tabPerformance) + self.groupBoxWorker.setObjectName(u"groupBoxWorker") + self.verticalLayout_10 = QVBoxLayout(self.groupBoxWorker) + self.verticalLayout_10.setObjectName(u"verticalLayout_10") + self.labelWorkerCount = QLabel(self.groupBoxWorker) + self.labelWorkerCount.setObjectName(u"labelWorkerCount") + + self.verticalLayout_10.addWidget(self.labelWorkerCount) + + self.spinBoxWorkerCount = QSpinBox(self.groupBoxWorker) + self.spinBoxWorkerCount.setObjectName(u"spinBoxWorkerCount") + self.spinBoxWorkerCount.setMinimum(1) + self.spinBoxWorkerCount.setMaximum(32) + self.spinBoxWorkerCount.setValue(8) + + self.verticalLayout_10.addWidget(self.spinBoxWorkerCount) + + + self.verticalLayout_9.addWidget(self.groupBoxWorker) + + self.groupBoxSaxonPool = QGroupBox(self.tabPerformance) + self.groupBoxSaxonPool.setObjectName(u"groupBoxSaxonPool") + self.verticalLayout_11 = QVBoxLayout(self.groupBoxSaxonPool) + self.verticalLayout_11.setObjectName(u"verticalLayout_11") + self.checkBoxUseSaxonPool = QCheckBox(self.groupBoxSaxonPool) + self.checkBoxUseSaxonPool.setObjectName(u"checkBoxUseSaxonPool") + + self.verticalLayout_11.addWidget(self.checkBoxUseSaxonPool) + + self.labelSaxonPoolInfo = QLabel(self.groupBoxSaxonPool) + self.labelSaxonPoolInfo.setObjectName(u"labelSaxonPoolInfo") + self.labelSaxonPoolInfo.setWordWrap(True) + + self.verticalLayout_11.addWidget(self.labelSaxonPoolInfo) + + + self.verticalLayout_9.addWidget(self.groupBoxSaxonPool) + + self.groupBoxFopPool = QGroupBox(self.tabPerformance) + self.groupBoxFopPool.setObjectName(u"groupBoxFopPool") + self.verticalLayout_12 = QVBoxLayout(self.groupBoxFopPool) + self.verticalLayout_12.setObjectName(u"verticalLayout_12") + self.checkBoxUseFopPool = QCheckBox(self.groupBoxFopPool) + self.checkBoxUseFopPool.setObjectName(u"checkBoxUseFopPool") + + self.verticalLayout_12.addWidget(self.checkBoxUseFopPool) + + self.labelFopPoolInfo = QLabel(self.groupBoxFopPool) + self.labelFopPoolInfo.setObjectName(u"labelFopPoolInfo") + self.labelFopPoolInfo.setWordWrap(True) + + self.verticalLayout_12.addWidget(self.labelFopPoolInfo) + + + self.verticalLayout_9.addWidget(self.groupBoxFopPool) + + self.label = QLabel(self.tabPerformance) + self.label.setObjectName(u"label") + self.label.setMouseTracking(True) + self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.label.setWordWrap(True) + + self.verticalLayout_9.addWidget(self.label) + + self.verticalSpacerPerformance = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_9.addItem(self.verticalSpacerPerformance) + + self.tabSettings.addTab(self.tabPerformance, "") + + self.verticalLayout.addWidget(self.tabSettings) + + self.buttonBox = QDialogButtonBox(Dialog) + 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(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) + self.buttonBox.rejected.connect(Dialog.reject) + + self.tabSettings.setCurrentIndex(0) + + + QMetaObject.connectSlotsByName(Dialog) + # setupUi + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Programm Einstellungen", None)) + self.addXsl.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeXsl.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabXsls), QCoreApplication.translate("Dialog", u"XSL-Ordner", None)) + self.addJavaVm.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeJavaVm.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabJavaVm), QCoreApplication.translate("Dialog", u"Java VM", None)) + self.addSaxon.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeSaxon.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabSaxon), QCoreApplication.translate("Dialog", u"Saxon", None)) + self.addApacheFop.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeApacheFop.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabApacheFop), QCoreApplication.translate("Dialog", u"Apache FOP", None)) + self.addDiffPdf.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeDiffPdf.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabDiffPdf), QCoreApplication.translate("Dialog", u"Diff-PDF", None)) + self.addPostgreSql.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removePostgreSql.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPostgreSql), QCoreApplication.translate("Dialog", u"PostgreSQL", None)) + self.addProject.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removeProject.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPdfProject), QCoreApplication.translate("Dialog", u"PDF-Projekte", None)) + self.groupBoxWorker.setTitle(QCoreApplication.translate("Dialog", u"ThreadPoolExecutor Einstellungen", None)) + self.labelWorkerCount.setText(QCoreApplication.translate("Dialog", u"Anzahl paralleler Worker f\u00fcr Transformationen:", None)) +#if QT_CONFIG(tooltip) + self.spinBoxWorkerCount.setToolTip(QCoreApplication.translate("Dialog", u"Anzahl der parallelen Worker-Threads f\u00fcr Transformationen (Standard: 8)", None)) +#endif // QT_CONFIG(tooltip) + self.groupBoxSaxonPool.setTitle(QCoreApplication.translate("Dialog", u"SaxonWorkerPool Einstellungen", None)) +#if QT_CONFIG(tooltip) + self.checkBoxUseSaxonPool.setToolTip(QCoreApplication.translate("Dialog", u"Aktiviert persistente JVM-Prozesse f\u00fcr Saxon-Transformationen.\n" +"Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead\n" +"Nachteile: Ben\u00f6tigt JDK (javac) - funktioniert nicht mit JRE allein\n" +"\n" +"Deaktivieren Sie diese Option, wenn:\n" +"\u2022 Sie nur ein JRE (keine JDK) installiert haben\n" +"\u2022 Sie Probleme mit dem Worker-Pool haben\n" +"\u2022 Sie die Funktion testen m\u00f6chten", None)) +#endif // QT_CONFIG(tooltip) + self.checkBoxUseSaxonPool.setText(QCoreApplication.translate("Dialog", u"SaxonWorkerPool verwenden (empfohlen)", None)) + self.labelSaxonPoolInfo.setText(QCoreApplication.translate("Dialog", u"Hinweis: SaxonWorkerPool ben\u00f6tigt ein JDK (Java Development Kit).
Mit JRE allein werden Transformationen im Fallback-Modus ausgef\u00fchrt.
", None)) + self.groupBoxFopPool.setTitle(QCoreApplication.translate("Dialog", u"FopWorkerPool Einstellungen", None)) +#if QT_CONFIG(tooltip) + self.checkBoxUseFopPool.setToolTip(QCoreApplication.translate("Dialog", u"Aktiviert persistente JVM-Prozesse f\u00fcr Apache FOP PDF-Generierung.\n" +"Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead\n" +"Nachteile: Ben\u00f6tigt JDK (javac) - funktioniert nicht mit JRE allein\n" +"\n" +"Deaktivieren Sie diese Option, wenn:\n" +"\u2022 Sie nur ein JRE (keine JDK) installiert haben\n" +"\u2022 Sie Probleme mit dem Worker-Pool haben\n" +"\u2022 Sie die Funktion testen m\u00f6chten", None)) +#endif // QT_CONFIG(tooltip) + self.checkBoxUseFopPool.setText(QCoreApplication.translate("Dialog", u"FopWorkerPool verwenden (empfohlen)", None)) + self.labelFopPoolInfo.setText(QCoreApplication.translate("Dialog", u"Hinweis: FopWorkerPool ben\u00f6tigt ein JDK (Java Development Kit).
Mit JRE allein werden PDFs im Fallback-Modus generiert.
", None)) + self.label.setText(QCoreApplication.translate("Dialog", u"

Hinweis: \u00c4nderungen in diesem Dialog sind unter Umst\u00e4nden erst nach neu start der Anwendung wirksam.

", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPerformance), QCoreApplication.translate("Dialog", u"Performance", None)) + # retranslateUi + diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 2bdb43c..b0cf1c1 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -554,9 +554,6 @@ class MainWindow(QMainWindow): # Vorhandene Projekte-Menü initialisieren self._setup_projects_menu() - # Performance-Einstellungen-Menü initialisieren - self._setup_performance_menu() - # if theme := app_settings.theme: self.change_theme(theme) @@ -655,201 +652,6 @@ class MainWindow(QMainWindow): logger.info(f"Projekte-Menü initialisiert mit {len(app_settings.pdf_projects)} Projekten") - def _setup_performance_menu(self): - """Fügt ein Menü-Item für Performance-Einstellungen hinzu.""" - # Füge Separator vor der Performance-Einstellung hinzu - self.ui.menuProjekt.addSeparator() - - # Erstelle Aktion für Performance-Einstellungen - performance_action = QAction("Performance-Einstellungen...", self) - saxon_pool_status = "aktiviert" if app_settings.use_saxon_worker_pool else "deaktiviert" - fop_pool_status = "aktiviert" if app_settings.use_fop_worker_pool else "deaktiviert" - performance_action.setToolTip( - f"Worker: {app_settings.max_workers} | SaxonWorkerPool: {saxon_pool_status} | FopWorkerPool: {fop_pool_status}" - ) - performance_action.triggered.connect(self._open_performance_settings) - - # Füge die Aktion zum Projekt-Menü hinzu - self.ui.menuProjekt.addAction(performance_action) - - logger.debug(f"Performance-Menü initialisiert (max_workers={app_settings.max_workers})") - - def _open_performance_settings(self): - """Öffnet einen Dialog für Performance-Einstellungen.""" - from PySide6.QtWidgets import ( - QDialog, - QVBoxLayout, - QHBoxLayout, - QLabel, - QSpinBox, - QCheckBox, - QPushButton, - QGroupBox, - ) - - # Erstelle benutzerdefinierten Dialog - dialog = QDialog(self) - dialog.setWindowTitle("Performance-Einstellungen") - dialog.setMinimumWidth(450) - - layout = QVBoxLayout() - - # Worker-Anzahl Einstellung - worker_group = QGroupBox("ThreadPoolExecutor Einstellungen") - worker_layout = QVBoxLayout() - - worker_label = QLabel("Anzahl paralleler Worker für Transformationen:") - worker_spinbox = QSpinBox() - worker_spinbox.setMinimum(1) - worker_spinbox.setMaximum(32) - worker_spinbox.setValue(app_settings.max_workers) - worker_spinbox.setToolTip("Anzahl der parallelen Worker-Threads für Transformationen (Standard: 8)") - - worker_layout.addWidget(worker_label) - worker_layout.addWidget(worker_spinbox) - worker_group.setLayout(worker_layout) - layout.addWidget(worker_group) - - # SaxonWorkerPool Einstellung - pool_group = QGroupBox("SaxonWorkerPool Einstellungen") - pool_layout = QVBoxLayout() - - pool_checkbox = QCheckBox("SaxonWorkerPool verwenden (empfohlen)") - pool_checkbox.setChecked(app_settings.use_saxon_worker_pool) - pool_checkbox.setToolTip( - "Aktiviert persistente JVM-Prozesse für Saxon-Transformationen.\n" - "Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead\n" - "Nachteile: Benötigt JDK (javac) - funktioniert nicht mit JRE allein\n\n" - "Deaktivieren Sie diese Option, wenn:\n" - "• Sie nur ein JRE (keine JDK) installiert haben\n" - "• Sie Probleme mit dem Worker-Pool haben\n" - "• Sie die Funktion testen möchten" - ) - - pool_info = QLabel( - "Hinweis: SaxonWorkerPool benötigt ein JDK (Java Development Kit).
" - "Mit JRE allein werden Transformationen im Fallback-Modus ausgeführt.
" - ) - pool_info.setWordWrap(True) - - pool_layout.addWidget(pool_checkbox) - pool_layout.addWidget(pool_info) - pool_group.setLayout(pool_layout) - layout.addWidget(pool_group) - - # FopWorkerPool Einstellung - fop_pool_group = QGroupBox("FopWorkerPool Einstellungen") - fop_pool_layout = QVBoxLayout() - - fop_pool_checkbox = QCheckBox("FopWorkerPool verwenden (empfohlen)") - fop_pool_checkbox.setChecked(app_settings.use_fop_worker_pool) - fop_pool_checkbox.setToolTip( - "Aktiviert persistente JVM-Prozesse für Apache FOP PDF-Generierung.\n" - "Vorteile: Bis zu 10x schneller durch Eliminierung von JVM-Startup-Overhead\n" - "Nachteile: Benötigt JDK (javac) - funktioniert nicht mit JRE allein\n\n" - "Deaktivieren Sie diese Option, wenn:\n" - "• Sie nur ein JRE (keine JDK) installiert haben\n" - "• Sie Probleme mit dem Worker-Pool haben\n" - "• Sie die Funktion testen möchten" - ) - - fop_pool_info = QLabel( - "Hinweis: FopWorkerPool benötigt ein JDK (Java Development Kit).
" - "Mit JRE allein werden PDFs im Fallback-Modus generiert.
" - ) - fop_pool_info.setWordWrap(True) - - fop_pool_layout.addWidget(fop_pool_checkbox) - fop_pool_layout.addWidget(fop_pool_info) - fop_pool_group.setLayout(fop_pool_layout) - layout.addWidget(fop_pool_group) - - # OK/Abbrechen Buttons - button_layout = QHBoxLayout() - ok_button = QPushButton("OK") - cancel_button = QPushButton("Abbrechen") - - ok_button.clicked.connect(dialog.accept) - cancel_button.clicked.connect(dialog.reject) - - button_layout.addStretch() - button_layout.addWidget(ok_button) - button_layout.addWidget(cancel_button) - layout.addLayout(button_layout) - - dialog.setLayout(layout) - - # Dialog anzeigen - if dialog.exec() == QDialog.DialogCode.Accepted: - # Speichere Änderungen - current_workers = app_settings.max_workers - current_use_pool = app_settings.use_saxon_worker_pool - current_use_fop_pool = app_settings.use_fop_worker_pool - - new_workers = worker_spinbox.value() - new_use_pool = pool_checkbox.isChecked() - new_use_fop_pool = fop_pool_checkbox.isChecked() - - changes = [] - - if new_workers != current_workers: - app_settings.max_workers = new_workers - changes.append(f"Worker-Anzahl: {current_workers} → {new_workers}") - logger.info(f"max_workers geändert: {current_workers} → {new_workers}") - - if new_use_pool != current_use_pool: - app_settings.use_saxon_worker_pool = new_use_pool - status = "aktiviert" if new_use_pool else "deaktiviert" - changes.append(f"SaxonWorkerPool: {status}") - logger.info(f"use_saxon_worker_pool geändert: {current_use_pool} → {new_use_pool}") - - if new_use_fop_pool != current_use_fop_pool: - app_settings.use_fop_worker_pool = new_use_fop_pool - status = "aktiviert" if new_use_fop_pool else "deaktiviert" - changes.append(f"FopWorkerPool: {status}") - logger.info(f"use_fop_worker_pool geändert: {current_use_fop_pool} → {new_use_fop_pool}") - - if changes: - # WICHTIG: Speichere Settings BEVOR wir Pools neu initialisieren - app_settings.save() - logger.info(f"Performance-Einstellungen gespeichert: {changes}") - - # Initialisiere Worker Pools neu falls sich relevante Einstellungen geändert haben - pools_reinitialized = False - if self.project: - # Saxon Worker Pool neu initialisieren? - if new_use_pool != current_use_pool or new_workers != current_workers: - logger.info( - f"Saxon Worker Pool wird neu initialisiert " - f"(use_pool: {current_use_pool}→{new_use_pool}, workers: {current_workers}→{new_workers})" - ) - self._initialize_saxon_worker_pool() - pools_reinitialized = True - - # FOP Worker Pool neu initialisieren? - if new_use_fop_pool != current_use_fop_pool or new_workers != current_workers: - logger.info( - f"FOP Worker Pool wird neu initialisiert " - f"(use_pool: {current_use_fop_pool}→{new_use_fop_pool}, workers: {current_workers}→{new_workers})" - ) - self._initialize_fop_worker_pool() - pools_reinitialized = True - else: - logger.warning("Kein Projekt geladen - Worker Pools werden nicht neu initialisiert") - - # Informiere Benutzer über Änderungen - changes_text = "\n".join(f"• {change}" for change in changes) - status_hint = "" - - if pools_reinitialized: - status_hint = "\n\nDie Worker Pools wurden automatisch mit den neuen Einstellungen neu gestartet." - - QMessageBox.information( - self, - "Einstellungen gespeichert", - f"Folgende Einstellungen wurden geändert:\n\n{changes_text}{status_hint}", - ) - def open_existing_project(self, project: Project): """ Öffnet ein vorhandenes Projekt.