UX: Performance-Einstellungen in Programmeinstellungen integriert

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 <noreply@anthropic.com>
This commit is contained in:
2026-01-04 19:01:46 +01:00
parent a7a69d27d7
commit 6976d21768
5 changed files with 624 additions and 556 deletions
+23 -4
View File
@@ -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()
+141 -1
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>833</width>
<height>387</height>
<height>446</height>
</rect>
</property>
<property name="windowTitle">
@@ -520,6 +520,146 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabPerformance">
<attribute name="title">
<string>Performance</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QGroupBox" name="groupBoxWorker">
<property name="title">
<string>ThreadPoolExecutor Einstellungen</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QLabel" name="labelWorkerCount">
<property name="text">
<string>Anzahl paralleler Worker für Transformationen:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxWorkerCount">
<property name="toolTip">
<string>Anzahl der parallelen Worker-Threads für Transformationen (Standard: 8)</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>32</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxSaxonPool">
<property name="title">
<string>SaxonWorkerPool Einstellungen</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QCheckBox" name="checkBoxUseSaxonPool">
<property name="toolTip">
<string>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</string>
</property>
<property name="text">
<string>SaxonWorkerPool verwenden (empfohlen)</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelSaxonPoolInfo">
<property name="text">
<string>&lt;i&gt;Hinweis: SaxonWorkerPool benötigt ein JDK (Java Development Kit).&lt;br&gt;Mit JRE allein werden Transformationen im Fallback-Modus ausgeführt.&lt;/i&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxFopPool">
<property name="title">
<string>FopWorkerPool Einstellungen</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QCheckBox" name="checkBoxUseFopPool">
<property name="toolTip">
<string>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</string>
</property>
<property name="text">
<string>FopWorkerPool verwenden (empfohlen)</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelFopPoolInfo">
<property name="text">
<string>&lt;i&gt;Hinweis: FopWorkerPool benötigt ein JDK (Java Development Kit).&lt;br&gt;Mit JRE allein werden PDFs im Fallback-Modus generiert.&lt;/i&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700; font-style:italic;&quot;&gt;Hinweis: Änderungen in diesem Dialog sind unter Umständen erst nach neu start der Anwendung wirksam.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacerPerformance">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
+458 -351
View File
@@ -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"<i>Hinweis: SaxonWorkerPool ben\u00f6tigt ein JDK (Java Development Kit).<br>Mit JRE allein werden Transformationen im Fallback-Modus ausgef\u00fchrt.</i>", 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"<i>Hinweis: FopWorkerPool ben\u00f6tigt ein JDK (Java Development Kit).<br>Mit JRE allein werden PDFs im Fallback-Modus generiert.</i>", None))
self.label.setText(QCoreApplication.translate("Dialog", u"<html><head/><body><p><span style=\" font-weight:700; font-style:italic;\">Hinweis: \u00c4nderungen in diesem Dialog sind unter Umst\u00e4nden erst nach neu start der Anwendung wirksam.</span></p></body></html>", None))
self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPerformance), QCoreApplication.translate("Dialog", u"Performance", None))
# retranslateUi
-198
View File
@@ -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(
"<i>Hinweis: SaxonWorkerPool benötigt ein JDK (Java Development Kit).<br>"
"Mit JRE allein werden Transformationen im Fallback-Modus ausgeführt.</i>"
)
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(
"<i>Hinweis: FopWorkerPool benötigt ein JDK (Java Development Kit).<br>"
"Mit JRE allein werden PDFs im Fallback-Modus generiert.</i>"
)
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.