Feat: Projekt-Baum verschlanken und XSL-Dateiname im Edit-Dialog anzeigen (v1.5.0)

Mittlere Spalte (Kontextinfos) aus dem Projekt-Baum entfernt, sodass nur noch
Bezeichnung und Diff-PDF-Anzahl angezeigt werden. XSL-Dateiname wird jetzt als
nur-lese Label oben im XslFileEditDialog angezeigt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 12:31:41 +02:00
parent 8c59187fe9
commit 3d2efe628b
13 changed files with 75 additions and 53 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<!-- Paket-Definition (ersetzt Product in v4) -->
<Package
Name="DocuMentor"
Version="1.4.1"
Version="1.5.0"
Manufacturer="Vitali Graf / Software- und Datenbankentwicklung"
UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E"
Language="1031"
+1 -1
View File
@@ -253,5 +253,5 @@ HINWEISE
================================================================================
Stand: April 2026
Erstellt für: DocuMentor v1.4.1
Erstellt für: DocuMentor v1.5.0
================================================================================
+1 -1
View File
@@ -10,7 +10,7 @@
; Build-Befehl: iscc installer.iss
#define MyAppName "DocuMentor"
#define MyAppVersion "1.4.1"
#define MyAppVersion "1.5.0"
#define MyAppPublisher "Ihr Name/Organisation"
#define MyAppURL "https://github.com/yourusername/xsl-validator"
#define MyAppExeName "DocuMentor.exe"
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "DocuMentor"
version = "1.4.1"
version = "1.5.0"
description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung"
readme = "README.md"
license = {text = "MIT"}
+5 -10
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>1263</width>
<height>774</height>
<height>779</height>
</rect>
</property>
<property name="windowTitle">
@@ -100,7 +100,7 @@ QTreeWidget::item:selected {
}</string>
</property>
<property name="columnCount">
<number>3</number>
<number>2</number>
</property>
<attribute name="headerHighlightSections">
<bool>true</bool>
@@ -118,11 +118,6 @@ QTreeWidget::item:selected {
<string notr="true">2</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">3</string>
</property>
</column>
</widget>
</item>
</layout>
@@ -149,7 +144,7 @@ QTreeWidget::item:selected {
<x>0</x>
<y>0</y>
<width>68</width>
<height>728</height>
<height>733</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@@ -385,8 +380,8 @@ QTreeWidget::item:selected {
<rect>
<x>0</x>
<y>0</y>
<width>880</width>
<height>697</height>
<width>892</width>
<height>702</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
+1 -2
View File
@@ -91,7 +91,6 @@ class Ui_MainWindow(object):
self.treeWidget = QTreeWidget(self.frame)
__qtreewidgetitem = QTreeWidgetItem()
__qtreewidgetitem.setText(2, u"3");
__qtreewidgetitem.setText(1, u"2");
__qtreewidgetitem.setText(0, u"1");
self.treeWidget.setHeaderItem(__qtreewidgetitem)
@@ -109,7 +108,7 @@ class Ui_MainWindow(object):
" background-color: palette(highlight);\n"
" color: palette(highlighted-text);\n"
"}")
self.treeWidget.setColumnCount(3)
self.treeWidget.setColumnCount(2)
self.treeWidget.header().setHighlightSections(True)
self.treeWidget.header().setStretchLastSection(True)
+7 -7
View File
@@ -586,7 +586,7 @@ class MainWindow(
if expected_pdf.exists():
# Icon setzen
icon_widget = self._create_centered_diff_icon(xml_path, xsl_id_str)
self.ui.treeWidget.setItemWidget(tree_item, 2, icon_widget)
self.ui.treeWidget.setItemWidget(tree_item, 1, icon_widget)
icon_count += 1
logger.debug(f"Diff-Icon für existierende PDF gesetzt: {map_key}")
@@ -755,9 +755,9 @@ class MainWindow(
map_key = f"{xml_relative_path}|{xsl_id_str}"
if map_key in self.xml_item_map:
tree_item = self.xml_item_map[map_key]
# Entferne Icon-Widget aus Spalte 2
tree_item.setData(2, Qt.ItemDataRole.UserRole, None)
self.ui.treeWidget.setItemWidget(tree_item, 2, None)
# Entferne Icon-Widget aus Spalte 1
tree_item.setData(1, Qt.ItemDataRole.UserRole, None)
self.ui.treeWidget.setItemWidget(tree_item, 1, None)
logger.info(f"Änderungen akzeptiert für: {pdf_basename}")
return True
@@ -904,9 +904,9 @@ class MainWindow(
map_key = f"{self.current_diff_xml_path}|{self.current_diff_xsl_id}"
if map_key in self.xml_item_map:
tree_item = self.xml_item_map[map_key]
# Entferne Icon-Widget aus Spalte 2
tree_item.setData(2, Qt.ItemDataRole.UserRole, None)
self.ui.treeWidget.setItemWidget(tree_item, 2, None)
# Entferne Icon-Widget aus Spalte 1
tree_item.setData(1, Qt.ItemDataRole.UserRole, None)
self.ui.treeWidget.setItemWidget(tree_item, 1, None)
logger.info(f"Diff-Icon entfernt für: {map_key}")
# Diff-PDF-Anzahl auf übergeordneten Ebenen aktualisieren
+7
View File
@@ -7,3 +7,10 @@ class XslFileEditDialog(XsltParamsEditDialog):
def _create_ui(self):
return Ui_XslFileEditDialog()
def _load_data(self):
"""Lädt die Daten des XslFile-Knotens in den Dialog."""
if not self.node:
return
self.ui.xslFileValueLabel.setText(str(self.node.xsl_file) if self.node.xsl_file else "")
super()._load_data()
+19 -2
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>865</width>
<height>400</height>
<height>403</height>
</rect>
</property>
<property name="windowTitle">
@@ -23,13 +23,30 @@
<enum>QLayout::SizeConstraint::SetMaximumSize</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="xslFileLabel">
<property name="text">
<string>XSL-Datei:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="xslFileValueLabel">
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="bezLabel">
<property name="text">
<string>Bezeichnung:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<item row="1" column="1">
<widget class="QLineEdit" name="bezEdit"/>
</item>
</layout>
+15 -2
View File
@@ -33,15 +33,26 @@ class Ui_XslFileEditDialog(object):
self.formLayout = QFormLayout()
self.formLayout.setObjectName(u"formLayout")
self.formLayout.setSizeConstraint(QLayout.SizeConstraint.SetMaximumSize)
self.xslFileLabel = QLabel(XslFileEditDialog)
self.xslFileLabel.setObjectName(u"xslFileLabel")
self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.xslFileLabel)
self.xslFileValueLabel = QLabel(XslFileEditDialog)
self.xslFileValueLabel.setObjectName(u"xslFileValueLabel")
self.xslFileValueLabel.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.xslFileValueLabel)
self.bezLabel = QLabel(XslFileEditDialog)
self.bezLabel.setObjectName(u"bezLabel")
self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.bezLabel)
self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.bezLabel)
self.bezEdit = QLineEdit(XslFileEditDialog)
self.bezEdit.setObjectName(u"bezEdit")
self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.bezEdit)
self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.bezEdit)
self.verticalLayout.addLayout(self.formLayout)
@@ -151,6 +162,8 @@ class Ui_XslFileEditDialog(object):
def retranslateUi(self, XslFileEditDialog):
XslFileEditDialog.setWindowTitle(QCoreApplication.translate("XslFileEditDialog", u"XSL-Datei bearbeiten", None))
self.xslFileLabel.setText(QCoreApplication.translate("XslFileEditDialog", u"XSL-Datei:", None))
self.xslFileValueLabel.setText("")
self.bezLabel.setText(QCoreApplication.translate("XslFileEditDialog", u"Bezeichnung:", None))
self.xsltParamsGroupBox.setTitle(QCoreApplication.translate("XslFileEditDialog", u"XSLT-Parameter", None))
___qtablewidgetitem = self.xsltParamsTable.horizontalHeaderItem(0)
+8 -8
View File
@@ -227,7 +227,7 @@ class TransformationMixin:
def _update_diff_pdf_counts_recursive(self, tree_item: QTreeWidgetItem):
"""
Aktualisiert rekursiv die Diff-PDF-Anzahl in Spalte 2 für alle TreeNode und XslFile Items.
Aktualisiert rekursiv die Diff-PDF-Anzahl in Spalte 1 für alle TreeNode und XslFile Items.
Args:
tree_item: Das TreeWidgetItem (kann Root oder beliebiger Knoten sein)
@@ -237,7 +237,7 @@ class TransformationMixin:
# Aktualisiere nur für TreeNode und XslFile, nicht für XmlFile
if isinstance(node, (TreeNode, XslFile)):
count = self._count_diff_pdfs_under_node(node, tree_item)
tree_item.setText(2, str(count) if count > 0 else "")
tree_item.setText(1, str(count) if count > 0 else "")
# Rekursiv für alle Kinder
for i in range(tree_item.childCount()):
@@ -614,11 +614,11 @@ class TransformationMixin:
self.ui.treeWidget.scrollToItem(tree_item)
# Entferne vorhandenes Widget (falls Icon vorhanden)
self.ui.treeWidget.removeItemWidget(tree_item, 2)
self.ui.treeWidget.removeItemWidget(tree_item, 1)
# Erstelle und setze Progress Bar
progress_widget, progress_bar = self._create_centered_progress_bar()
self.ui.treeWidget.setItemWidget(tree_item, 2, progress_widget)
self.ui.treeWidget.setItemWidget(tree_item, 1, progress_widget)
logger.debug(f"Progress Bar für {xml_file_name} gesetzt und Eltern-Knoten geöffnet")
else:
@@ -659,7 +659,7 @@ class TransformationMixin:
self, "Transformation fehlgeschlagen", f"XML-Datei: {xml_file}\n\nFehler:\n{error_text}"
)
# Update Widget in Spalte 2: Entferne Progress Bar, zeige Icon wenn Diff-PDF existiert
# Update Widget in Spalte 1: Entferne Progress Bar, zeige Icon wenn Diff-PDF existiert
xml_file_str = result.get("xml_file", "")
xsl_id = result.get("xsl_id", None)
xsl_id_str = "_".join(str(x) for x in xsl_id) if xsl_id else ""
@@ -669,13 +669,13 @@ class TransformationMixin:
if tree_item:
# Entferne Progress Bar
self.ui.treeWidget.removeItemWidget(tree_item, 2)
self.ui.treeWidget.removeItemWidget(tree_item, 1)
# Wenn Diff-PDF existiert, zeige Icon
if diff_pdf_str and Path(diff_pdf_str).exists():
xml_file_path = Path(xml_file_str)
icon_widget = self._create_centered_diff_icon(xml_file_path, xsl_id_str)
self.ui.treeWidget.setItemWidget(tree_item, 2, icon_widget)
self.ui.treeWidget.setItemWidget(tree_item, 1, icon_widget)
logger.debug(f"Diff-Icon für {xml_file_str} gesetzt")
else:
logger.debug(f"Keine Diff-PDF für {xml_file_str}, kein Icon gesetzt")
@@ -699,7 +699,7 @@ class TransformationMixin:
map_key = f"{xml_file_name}|{xsl_id_str}"
tree_item = self.xml_item_map.get(map_key)
if tree_item:
self.ui.treeWidget.removeItemWidget(tree_item, 2)
self.ui.treeWidget.removeItemWidget(tree_item, 1)
logger.debug(f"Progress Bar für {map_key} entfernt (Fehler)")
def _on_all_transformations_finished(self, successful_count: int, total_count: int, total_duration: float):
+8 -17
View File
@@ -120,7 +120,7 @@ class TreeManagerMixin:
if node_type == ItemType.XML_FILE:
# Hole XmlFile-Objekt und XSL-ID aus UserRole
xml_file_obj = item.data(0, Qt.ItemDataRole.UserRole)
xsl_id_str = item.data(1, Qt.ItemDataRole.UserRole)
xsl_id_str = item.data(0, Qt.ItemDataRole.UserRole + 2)
logger.debug(f"XML-File-Daten: xml_file_obj={xml_file_obj}, xsl_id_str={xsl_id_str}")
@@ -630,12 +630,7 @@ class TreeManagerMixin:
xsl_icon = QIcon.fromTheme("text-x-generic")
item.setIcon(0, xsl_icon)
# Setze zusätzliche Informationen in Spalte 1
if isinstance(node, TreeNode):
# TreeNode: Zeige Anzahl der Knoten
child_count = len(node.children) if node.children else 0
item.setText(1, f"{child_count} Knoten")
# Speichere zusätzlich die Node-ID in UserRole+1 für Kompatibilität
item.setData(0, Qt.ItemDataRole.UserRole + 1, node.id)
@@ -646,22 +641,19 @@ class TreeManagerMixin:
child_item = self._create_tree_item_from_node(child)
item.addChild(child_item)
# Setze Diff-PDF-Anzahl in Spalte 2 (wird später aktualisiert)
# Setze Diff-PDF-Anzahl in Spalte 1
diff_count = self._count_diff_pdfs_under_node(node, item)
if diff_count > 0:
item.setText(2, str(diff_count))
item.setText(1, str(diff_count))
elif isinstance(node, XslFile):
# XslFile: Zeige XSL-Datei-Pfad
item.setText(1, str(node.xsl_file))
# Speichere zusätzlich die Node-ID in UserRole+1 für Kompatibilität
item.setData(0, Qt.ItemDataRole.UserRole + 1, node.id)
# Setze Diff-PDF-Anzahl in Spalte 2 (wird später aktualisiert)
# Setze Diff-PDF-Anzahl in Spalte 1
diff_count = self._count_diff_pdfs_under_node(node, item)
if diff_count > 0:
item.setText(2, str(diff_count))
item.setText(1, str(diff_count))
# Prüfe ob XSL-Datei existiert
xsl_file_missing = False
@@ -689,15 +681,14 @@ class TreeManagerMixin:
for xml in node.xmls:
xml_item = QTreeWidgetItem()
xml_item.setText(0, f"XML: {xml.xml.name}")
xml_item.setText(1, str(xml.xml))
# Speichere auch das XmlFile-Objekt für XML-Items
xml_item.setData(0, Qt.ItemDataRole.UserRole, xml)
xml_item.setData(0, Qt.ItemDataRole.UserRole + 1, f"xml_{xml.xml.name}")
# Speichere XSL-ID in Spalte 1, UserRole für einfachen Zugriff
# Speichere XSL-ID in Spalte 0, UserRole+2 für einfachen Zugriff
xsl_id_str = "_".join(str(x) for x in node.id)
xml_item.setData(1, Qt.ItemDataRole.UserRole, xsl_id_str)
xml_item.setData(0, Qt.ItemDataRole.UserRole + 2, xsl_id_str)
# Setze XML-Icon
xml_icon = QIcon.fromTheme("text-xml")
@@ -736,7 +727,7 @@ class TreeManagerMixin:
# Fallback: Erstelle einfaches Item
fallback_item = QTreeWidgetItem()
fallback_item.setText(0, "Fehler beim Laden")
fallback_item.setText(1, str(e))
fallback_item.setToolTip(0, str(e))
return fallback_item
def _create_centered_progress_bar(self) -> tuple[QWidget, QProgressBar]:
Generated
+1 -1
View File
@@ -34,7 +34,7 @@ wheels = [
[[package]]
name = "documentor"
version = "1.4.1"
version = "1.5.0"
source = { virtual = "." }
dependencies = [
{ name = "connectorx" },