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:
+1
-1
@@ -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"
|
||||
|
||||
@@ -253,5 +253,5 @@ HINWEISE
|
||||
|
||||
================================================================================
|
||||
Stand: April 2026
|
||||
Erstellt für: DocuMentor v1.4.1
|
||||
Erstellt für: DocuMentor v1.5.0
|
||||
================================================================================
|
||||
|
||||
+1
-1
@@ -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
@@ -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
@@ -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">
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,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()
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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]:
|
||||
|
||||
Reference in New Issue
Block a user