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 ui.AppSettings_ui import Ui_Dialog
from ui.JavaVmConfigDialog_ui import Ui_JavaVmConfigDialog
from ui.DiffPdfConfigDialog_ui import Ui_DiffPdfConfigDialog
from ui.SaxonJarConfigDialog_ui import Ui_SaxonJarConfigDialog
from ui.ApacheFopConfigDialog_ui import Ui_ApacheFopConfigDialog
from ui.XslDirConfigDialog_ui import Ui_XslDirConfigDialog
from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir
# 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())}
from ui.JavaVmConfigDialog import JavaVmConfigDialog
from ui.DiffPdfConfigDialog import DiffPdfConfigDialog
from ui.SaxonJarConfigDialog import SaxonJarConfigDialog
from ui.ApacheFopConfigDialog import ApacheFopConfigDialog
from ui.XslDirConfigDialog import XslDirConfigDialog
from ui.PdfProject import PdfProjectDlg
from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir, PdfProject
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.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
def _add_xsl_dir(self):
"""Fügt einen neuen XSL-Ordner hinzu."""
@@ -602,6 +414,77 @@ class AppSettingsDlg(QDialog):
diff_pdf.output_file_extension = new_data["output_file_extension"]
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):
"""Übernimmt die Änderungen und schließt den Dialog."""
# Aktualisiere die ursprünglichen Einstellungen
@@ -610,6 +493,7 @@ class AppSettingsDlg(QDialog):
self.settings.saxon_jars = self.temp_saxon_jars.copy()
self.settings.apache_fops = self.temp_apache_fops.copy()
self.settings.xsl_dirs = self.temp_xsl_dirs.copy()
self.settings.pdf_projects = self.temp_pdf_projects.copy()
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):
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.
Args:
parent: Übergeordnetes Widget
project_data: Bestehende Projektdaten zum Bearbeiten (optional)
edit_mode: Wenn True, werden Projekt-Name und -Ordner deaktiviert (nur Einstellungen ändern)
"""
super().__init__(parent)
@@ -24,6 +25,7 @@ class PdfProjectDlg(QDialog):
# Projektdaten speichern
self.project_data = project_data or {}
self.edit_mode = edit_mode
# Dialog-Eigenschaften setzen
self.setModal(True)
@@ -35,6 +37,10 @@ class PdfProjectDlg(QDialog):
# ComboBoxen initialisieren
self._init_combo_boxes()
# Edit-Modus konfigurieren
if self.edit_mode:
self._configure_edit_mode()
# Bestehende Projektdaten laden, falls vorhanden
if self.project_data:
self._load_project_data()
@@ -233,6 +239,15 @@ class PdfProjectDlg(QDialog):
'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):
"""
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())}