Dialoge in eigene Dateien ausgelagert

- `JavaVmConfigDialog`
- `DiffPdfConfigDialog`
- `SaxonJarConfigDialog`
- `ApacheFopConfigDialog`
- `XslDirConfigDialog`
This commit is contained in:
2025-06-17 20:12:38 +02:00
parent 02d1d4ada4
commit 76b5182a53
7 changed files with 317 additions and 203 deletions
+42
View File
@@ -0,0 +1,42 @@
from PySide6.QtWidgets import QDialog, QFileDialog
from pathlib import Path
from ui.ApacheFopConfigDialog_ui import Ui_ApacheFopConfigDialog
class ApacheFopConfigDialog(QDialog):
"""Dialog zur Konfiguration von Apache FOP ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_ApacheFopConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_directory)
def browse_directory(self):
"""Öffnet einen Verzeichnisdialog."""
dir_path = QFileDialog.getExistingDirectory(self, "Apache FOP Verzeichnis auswählen")
if dir_path:
self.ui.pathEdit.setText(dir_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_dir", "")))
self.ui.extensionEdit.setText(data.get("output_file_extension", "pdf"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_dir": Path(self.ui.pathEdit.text().strip()),
"output_file_extension": self.ui.extensionEdit.text().strip() or "pdf",
}
+86 -202
View File
@@ -2,208 +2,13 @@ from PySide6.QtWidgets import QDialog, QTableWidgetItem, QFileDialog, QHeaderVie
from pathlib import Path from pathlib import Path
from ui.AppSettings_ui import Ui_Dialog from ui.AppSettings_ui import Ui_Dialog
from ui.JavaVmConfigDialog_ui import Ui_JavaVmConfigDialog from ui.JavaVmConfigDialog import JavaVmConfigDialog
from ui.DiffPdfConfigDialog_ui import Ui_DiffPdfConfigDialog from ui.DiffPdfConfigDialog import DiffPdfConfigDialog
from ui.SaxonJarConfigDialog_ui import Ui_SaxonJarConfigDialog from ui.SaxonJarConfigDialog import SaxonJarConfigDialog
from ui.ApacheFopConfigDialog_ui import Ui_ApacheFopConfigDialog from ui.ApacheFopConfigDialog import ApacheFopConfigDialog
from ui.XslDirConfigDialog_ui import Ui_XslDirConfigDialog from ui.XslDirConfigDialog import XslDirConfigDialog
from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir from ui.PdfProject import PdfProjectDlg
from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir, PdfProject
# Dialog-Klassen für die Eingabe ohne ID
class JavaVmConfigDialog(QDialog):
"""Dialog zur Konfiguration einer Java VM ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_JavaVmConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_binary_file)
def browse_binary_file(self):
"""Öffnet einen Dateidialog für die Binary-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "Java Binary-Datei auswählen", "", "Executable Files (*.exe);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_binary_file", "")))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_binary_file": Path(self.ui.pathEdit.text().strip()),
}
class DiffPdfConfigDialog(QDialog):
"""Dialog zur Konfiguration von DiffPdf ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_DiffPdfConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_binary_file)
def browse_binary_file(self):
"""Öffnet einen Dateidialog für die Binary-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "DiffPdf Binary-Datei auswählen", "", "Executable Files (*.exe);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_binary_file", "")))
self.ui.paramsEdit.setPlainText("\n".join(data.get("default_params", [])))
self.ui.extensionEdit.setText(data.get("output_file_extension", "pdf"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
# Parameter aus dem Text extrahieren
params_text = self.ui.paramsEdit.toPlainText().strip()
params = [line.strip() for line in params_text.split("\n") if line.strip()] if params_text else []
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_binary_file": Path(self.ui.pathEdit.text().strip()),
"default_params": params,
"output_file_extension": self.ui.extensionEdit.text().strip() or "pdf",
}
class SaxonJarConfigDialog(QDialog):
"""Dialog zur Konfiguration von Saxon JAR ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_SaxonJarConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_jar_file)
def browse_jar_file(self):
"""Öffnet einen Dateidialog für die JAR-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "Saxon JAR-Datei auswählen", "", "JAR Files (*.jar);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_jar_file", "")))
self.ui.extensionEdit.setText(data.get("output_file_extension", "fo"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_jar_file": Path(self.ui.pathEdit.text().strip()),
"output_file_extension": self.ui.extensionEdit.text().strip() or "fo",
}
class ApacheFopConfigDialog(QDialog):
"""Dialog zur Konfiguration von Apache FOP ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_ApacheFopConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_directory)
def browse_directory(self):
"""Öffnet einen Verzeichnisdialog."""
dir_path = QFileDialog.getExistingDirectory(self, "Apache FOP Verzeichnis auswählen")
if dir_path:
self.ui.pathEdit.setText(dir_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_dir", "")))
self.ui.extensionEdit.setText(data.get("output_file_extension", "pdf"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_dir": Path(self.ui.pathEdit.text().strip()),
"output_file_extension": self.ui.extensionEdit.text().strip() or "pdf",
}
class XslDirConfigDialog(QDialog):
"""Dialog zur Konfiguration von XSL-Verzeichnis ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_XslDirConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_directory)
def browse_directory(self):
"""Öffnet einen Verzeichnisdialog."""
dir_path = QFileDialog.getExistingDirectory(self, "XSL Root-Verzeichnis auswählen")
if dir_path:
self.ui.pathEdit.setText(dir_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.nameEdit.setText(data.get("name", ""))
self.ui.pathEdit.setText(str(data.get("path_to_root_dir", "")))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.nameEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {"name": self.ui.nameEdit.text().strip(), "path_to_root_dir": Path(self.ui.pathEdit.text().strip())}
class AppSettingsDlg(QDialog): class AppSettingsDlg(QDialog):
@@ -345,6 +150,13 @@ class AppSettingsDlg(QDialog):
self.ui.tableDiffPdfs.setItem(row, 3, QTableWidgetItem(diff_pdf.output_file_extension)) self.ui.tableDiffPdfs.setItem(row, 3, QTableWidgetItem(diff_pdf.output_file_extension))
self.ui.tableDiffPdfs.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) self.ui.tableDiffPdfs.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
def _populate_pdf_project_table(self):
"""Füllt die PDF-Projekte Tabelle."""
self.ui.tablePdfProjekts.setRowCount(len(self.temp_pdf_projects))
for row, pdf_project in enumerate(self.temp_pdf_projects):
self.ui.tablePdfProjekts.setItem(row, 0, QTableWidgetItem(pdf_project.name))
self.ui.tablePdfProjekts.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
# XSL-Ordner Methoden # XSL-Ordner Methoden
def _add_xsl_dir(self): def _add_xsl_dir(self):
"""Fügt einen neuen XSL-Ordner hinzu.""" """Fügt einen neuen XSL-Ordner hinzu."""
@@ -602,6 +414,77 @@ class AppSettingsDlg(QDialog):
diff_pdf.output_file_extension = new_data["output_file_extension"] diff_pdf.output_file_extension = new_data["output_file_extension"]
self._populate_diff_pdf_table() self._populate_diff_pdf_table()
# PDF-Projekt Methoden
def _add_pdf_project(self):
"""Fügt ein neues PDF-Projekt hinzu."""
dialog = PdfProjectDlg(self)
if dialog.exec() == PdfProjectDlg.DialogCode.Accepted:
project_data = dialog.get_project_data()
# Neue ID generieren
new_id = max([p.id for p in self.temp_pdf_projects], default=0) + 1
# Erstelle PdfProject-Objekt
new_project = PdfProject(
id=new_id,
name=project_data['name'],
project_dir=Path(project_data['project_dir']),
java_vm_id=project_data['java_vm_id'] if project_data['java_vm_id'] != -1 else 1,
diff_pdf_id=project_data['diff_pdf_id'] if project_data['diff_pdf_id'] != -1 else 1,
saxon_jar_id=project_data['saxon_jar_id'] if project_data['saxon_jar_id'] != -1 else 1,
apache_fop_id=project_data['apache_fop_id'] if project_data['apache_fop_id'] != -1 else 1,
xsl_dir_id=project_data['xsl_dir_id'] if project_data['xsl_dir_id'] != -1 else 1,
default_xslt_params={}
)
self.temp_pdf_projects.append(new_project)
self._populate_pdf_project_table()
def _remove_pdf_project(self):
"""Entfernt das ausgewählte PDF-Projekt."""
current_row = self.ui.tablePdfProjekts.currentRow()
if current_row >= 0:
del self.temp_pdf_projects[current_row]
self._populate_pdf_project_table()
self._update_pdf_project_buttons()
def _update_pdf_project_buttons(self):
"""Aktualisiert den Status der PDF-Projekt-Buttons."""
has_selection = self.ui.tablePdfProjekts.currentRow() >= 0
self.ui.removeProject.setEnabled(has_selection)
def _edit_pdf_project(self, index):
"""Bearbeitet ein PDF-Projekt per Doppelklick (nur Einstellungen)."""
row = index.row()
if 0 <= row < len(self.temp_pdf_projects):
pdf_project = self.temp_pdf_projects[row]
# Projektdaten für Dialog vorbereiten
project_data = {
'name': pdf_project.name,
'project_dir': str(pdf_project.project_dir),
'java_vm_id': pdf_project.java_vm_id,
'diff_pdf_id': pdf_project.diff_pdf_id,
'saxon_jar_id': pdf_project.saxon_jar_id,
'apache_fop_id': pdf_project.apache_fop_id,
'xsl_dir_id': pdf_project.xsl_dir_id
}
# Dialog im Edit-Modus öffnen (Projekt-Name und -Ordner deaktiviert)
dialog = PdfProjectDlg(self, project_data, edit_mode=True)
if dialog.exec() == PdfProjectDlg.DialogCode.Accepted:
new_data = dialog.get_project_data()
# Nur die Einstellungen aktualisieren (Name und Ordner bleiben unverändert)
pdf_project.java_vm_id = new_data['java_vm_id'] if new_data['java_vm_id'] != -1 else pdf_project.java_vm_id
pdf_project.diff_pdf_id = new_data['diff_pdf_id'] if new_data['diff_pdf_id'] != -1 else pdf_project.diff_pdf_id
pdf_project.saxon_jar_id = new_data['saxon_jar_id'] if new_data['saxon_jar_id'] != -1 else pdf_project.saxon_jar_id
pdf_project.apache_fop_id = new_data['apache_fop_id'] if new_data['apache_fop_id'] != -1 else pdf_project.apache_fop_id
pdf_project.xsl_dir_id = new_data['xsl_dir_id'] if new_data['xsl_dir_id'] != -1 else pdf_project.xsl_dir_id
self._populate_pdf_project_table()
def accept(self): def accept(self):
"""Übernimmt die Änderungen und schließt den Dialog.""" """Übernimmt die Änderungen und schließt den Dialog."""
# Aktualisiere die ursprünglichen Einstellungen # Aktualisiere die ursprünglichen Einstellungen
@@ -610,6 +493,7 @@ class AppSettingsDlg(QDialog):
self.settings.saxon_jars = self.temp_saxon_jars.copy() self.settings.saxon_jars = self.temp_saxon_jars.copy()
self.settings.apache_fops = self.temp_apache_fops.copy() self.settings.apache_fops = self.temp_apache_fops.copy()
self.settings.xsl_dirs = self.temp_xsl_dirs.copy() self.settings.xsl_dirs = self.temp_xsl_dirs.copy()
self.settings.pdf_projects = self.temp_pdf_projects.copy()
self.settings.save() self.settings.save()
+50
View File
@@ -0,0 +1,50 @@
from PySide6.QtWidgets import QDialog, QFileDialog
from pathlib import Path
from ui.DiffPdfConfigDialog_ui import Ui_DiffPdfConfigDialog
class DiffPdfConfigDialog(QDialog):
"""Dialog zur Konfiguration von DiffPdf ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_DiffPdfConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_binary_file)
def browse_binary_file(self):
"""Öffnet einen Dateidialog für die Binary-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "DiffPdf Binary-Datei auswählen", "", "Executable Files (*.exe);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_binary_file", "")))
self.ui.paramsEdit.setPlainText("\n".join(data.get("default_params", [])))
self.ui.extensionEdit.setText(data.get("output_file_extension", "pdf"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
# Parameter aus dem Text extrahieren
params_text = self.ui.paramsEdit.toPlainText().strip()
params = [line.strip() for line in params_text.split("\n") if line.strip()] if params_text else []
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_binary_file": Path(self.ui.pathEdit.text().strip()),
"default_params": params,
"output_file_extension": self.ui.extensionEdit.text().strip() or "pdf",
}
+42
View File
@@ -0,0 +1,42 @@
from PySide6.QtWidgets import QDialog, QFileDialog
from pathlib import Path
from ui.JavaVmConfigDialog_ui import Ui_JavaVmConfigDialog
class JavaVmConfigDialog(QDialog):
"""Dialog zur Konfiguration einer Java VM ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_JavaVmConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_binary_file)
def browse_binary_file(self):
"""Öffnet einen Dateidialog für die Binary-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "Java Binary-Datei auswählen", "", "Executable Files (*.exe);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_binary_file", "")))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_binary_file": Path(self.ui.pathEdit.text().strip()),
}
+16 -1
View File
@@ -8,13 +8,14 @@ from ui.PdfProject_ui import Ui_projectDlg
class PdfProjectDlg(QDialog): class PdfProjectDlg(QDialog):
def __init__(self, parent=None, project_data=None): def __init__(self, parent=None, project_data=None, edit_mode=False):
""" """
Konstruktor für den PDF-Projekt-Dialog. Konstruktor für den PDF-Projekt-Dialog.
Args: Args:
parent: Übergeordnetes Widget parent: Übergeordnetes Widget
project_data: Bestehende Projektdaten zum Bearbeiten (optional) project_data: Bestehende Projektdaten zum Bearbeiten (optional)
edit_mode: Wenn True, werden Projekt-Name und -Ordner deaktiviert (nur Einstellungen ändern)
""" """
super().__init__(parent) super().__init__(parent)
@@ -24,6 +25,7 @@ class PdfProjectDlg(QDialog):
# Projektdaten speichern # Projektdaten speichern
self.project_data = project_data or {} self.project_data = project_data or {}
self.edit_mode = edit_mode
# Dialog-Eigenschaften setzen # Dialog-Eigenschaften setzen
self.setModal(True) self.setModal(True)
@@ -35,6 +37,10 @@ class PdfProjectDlg(QDialog):
# ComboBoxen initialisieren # ComboBoxen initialisieren
self._init_combo_boxes() self._init_combo_boxes()
# Edit-Modus konfigurieren
if self.edit_mode:
self._configure_edit_mode()
# Bestehende Projektdaten laden, falls vorhanden # Bestehende Projektdaten laden, falls vorhanden
if self.project_data: if self.project_data:
self._load_project_data() self._load_project_data()
@@ -233,6 +239,15 @@ class PdfProjectDlg(QDialog):
'diff_pdf_id': self.ui.comboBox.currentData() 'diff_pdf_id': self.ui.comboBox.currentData()
} }
def _configure_edit_mode(self):
"""Konfiguriert den Dialog für den Edit-Modus (nur Einstellungen ändern)."""
# Projekt-Ordner und Browse-Button deaktivieren
self.ui.lineProjectDir.setEnabled(False)
self.ui.pushButton.setEnabled(False)
# Dialog-Titel ändern
self.setWindowTitle("Projekt-Einstellungen bearbeiten")
def set_project_data(self, project_data): def set_project_data(self, project_data):
""" """
Setzt die Projektdaten in den Dialog. Setzt die Projektdaten in den Dialog.
+44
View File
@@ -0,0 +1,44 @@
from PySide6.QtWidgets import QDialog, QFileDialog
from pathlib import Path
from ui.SaxonJarConfigDialog_ui import Ui_SaxonJarConfigDialog
class SaxonJarConfigDialog(QDialog):
"""Dialog zur Konfiguration von Saxon JAR ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_SaxonJarConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_jar_file)
def browse_jar_file(self):
"""Öffnet einen Dateidialog für die JAR-Datei."""
file_path, _ = QFileDialog.getOpenFileName(
self, "Saxon JAR-Datei auswählen", "", "JAR Files (*.jar);;All Files (*)"
)
if file_path:
self.ui.pathEdit.setText(file_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.versionEdit.setText(data.get("version", ""))
self.ui.pathEdit.setText(str(data.get("path_to_jar_file", "")))
self.ui.extensionEdit.setText(data.get("output_file_extension", "fo"))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.versionEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {
"version": self.ui.versionEdit.text().strip(),
"path_to_jar_file": Path(self.ui.pathEdit.text().strip()),
"output_file_extension": self.ui.extensionEdit.text().strip() or "fo",
}
+37
View File
@@ -0,0 +1,37 @@
from PySide6.QtWidgets import QDialog, QFileDialog
from pathlib import Path
from ui.XslDirConfigDialog_ui import Ui_XslDirConfigDialog
class XslDirConfigDialog(QDialog):
"""Dialog zur Konfiguration von XSL-Verzeichnis ohne ID."""
def __init__(self, parent=None):
super().__init__(parent)
# UI einrichten
self.ui = Ui_XslDirConfigDialog()
self.ui.setupUi(self)
# Signale verbinden
self.ui.browseButton.clicked.connect(self.browse_directory)
def browse_directory(self):
"""Öffnet einen Verzeichnisdialog."""
dir_path = QFileDialog.getExistingDirectory(self, "XSL Root-Verzeichnis auswählen")
if dir_path:
self.ui.pathEdit.setText(dir_path)
def set_data(self, data):
"""Setzt die Daten in den Dialog."""
if data:
self.ui.nameEdit.setText(data.get("name", ""))
self.ui.pathEdit.setText(str(data.get("path_to_root_dir", "")))
def get_data(self):
"""Gibt die eingegebenen Daten zurück."""
if not self.ui.nameEdit.text().strip() or not self.ui.pathEdit.text().strip():
return None
return {"name": self.ui.nameEdit.text().strip(), "path_to_root_dir": Path(self.ui.pathEdit.text().strip())}