Slider (Alpha und Zoom) werden erst aktiviert, wenn PDF geladen:
- Initial deaktiviert (disabled=false in UI)
- Automatische Aktivierung beim Laden von Diff-PDFs
- Automatische Deaktivierung beim Leeren des Viewers
Verbesserte Tooltips für bessere Benutzerführung:
- Alpha-Slider: "Blendet zwischen Referenz-PDF (links) und neuer PDF (rechts) um. Doppelklick setzt auf Mitte zurück."
- Zoom-Slider: "Vergrößert oder verkleinert die PDF-Ansicht (25% bis 300%). Doppelklick setzt auf 100% zurück."
Implementierung:
- MainWinddow.ui: enabled=false für beide Slider
- MainWindow.py: Aktivierung in _load_pdf_for_comparison()
- MainWindow.py: Deaktivierung in _clear_pdf_viewer()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Buttons im PDF-Vergleichs-Viewer:
- "Vorher (Referenz)" Button öffnet Referenz-PDF im System-PDF-Viewer
- "Nachher (Neu)" Button öffnet neue PDF im System-PDF-Viewer
- Beide Buttons sind initial deaktiviert
- Automatische Aktivierung beim Laden von Diff-PDFs
- Automatische Deaktivierung beim Leeren des Viewers
Implementierung:
- Neue Instanzvariablen: current_ref_pdf_path, current_new_pdf_path
- Handler-Methoden: _on_view_ref_pdf_clicked(), _on_view_new_pdf_clicked()
- QDesktopServices.openUrl() für plattformunabhängiges Öffnen
- Fehlerbehandlung und Logging
UI-Änderungen:
- Buttons in MainWinddow.ui hinzugefügt (view_ref_pdf, view_new_pdf)
- MainWinddow_ui.py automatisch generiert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Performance-Dialog erweitert um Checkbox zur Aktivierung/Deaktivierung des SaxonWorkerPool.
Benutzer können jetzt zwischen Worker-Pool (schnell, benötigt JDK) und Fallback-Modus (robust, nur JRE) wählen.
Änderungen:
- Neue Einstellung 'use_saxon_worker_pool' in AppSettings (Standard: aktiviert)
- Erweiterter Performance-Dialog mit zwei Sektionen (ThreadPoolExecutor + SaxonWorkerPool)
- Pool-Initialisierung prüft nun Einstellung vor Worker-Start
- Aktualisiertes Menü-Tooltip zeigt beide Einstellungen
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fügt zusätzliche Sicherheitsprüfung hinzu, bevor project_dir verwendet wird:
- Verhindert AttributeError wenn self.project None ist
- Konsistent mit anderen Stellen im Code (Zeilen 2578, 3040, 3162)
- Behebt Pylance Type-Checking-Warnung
- Zeigt benutzerfreundliche Fehlermeldung statt Absturz
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Erweitert die Zusammenfassung nach Abschluss aller Transformationen um die Gesamtdauer:
- TransformationThread misst jetzt die Gesamtdauer aller Jobs
- Signal all_jobs_finished erweitert um total_duration Parameter
- Statusbar und MessageBox zeigen Gesamtdauer an (Format: "12.34s")
- Dauer wird sowohl bei Erfolg als auch bei Fehlern angezeigt
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Änderungen:
- XML-Batch-Processing in separaten Thread verlagert (XmlBatchProcessingThread)
• Verhindert UI-Freezing bei vielen XML-Dateien
• Hash-Berechnung, Duplikatserkennung und Dateikopieren asynchron
• Live Progress-Updates an Hauptthread
- Progressbar für XML-Batch-Verarbeitung in Statusbar
• Zeigt "X/Y Dateien" während Verarbeitung
• Aktueller Dateiname in Statusbar-Text
• Automatisches Verstecken nach Abschluss
- Progressbar für Transformationen in Statusbar hinzugefügt
• Zeigt "X/Y Jobs" während Transformation
• Live-Update nach jedem abgeschlossenen Job
• Funktioniert bei Erfolg und Fehlern
- Zusammenfassungsdialog am Ende statt einzelner Erfolgsdialoge
Technische Details:
- Neue Thread-Klasse mit Signalen für Progress-Updates
- Progressbar-Management-Methoden für beide Operationen
- Signal-Handler angepasst für Live-Updates
- Statistik-Sammlung für detaillierten Zusammenfassungsdialog
UX-Verbesserungen:
- UI bleibt während Verarbeitung reaktionsfähig
- Benutzer sieht Gesamtfortschritt in Echtzeit
- Kein wiederholtes Klicken auf OK-Dialoge mehr
- Transparente Anzeige laufender Operationen
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Checkbox 'Alle XML-Dateien zuordnen' im XmlToXslAssignDialog hinzugefügt
- Bei aktivierter Checkbox wird Dialog nur einmal angezeigt und Auswahl auf alle weiteren Dateien angewendet
- Einzelne Erfolgsdialoge durch einen zusammenfassenden Dialog ersetzt
- Zusammenfassungsdialog zeigt detaillierte Statistiken:
• Anzahl neu hinzugefügter Dateien
• Anzahl bereits vorhandener Dateien (Hash-Duplikate)
• Anzahl bereits zugeordneter Dateien
• Liste umbenannter Dateien
• Fehlerberichte falls aufgetreten
- Deutliche Verbesserung der UX: Bei 30 Dateien nur 1 Dialog statt 30
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Beim Durchführen von Transformationen werden jetzt die betroffenen XML-Knoten im Baum automatisch geöffnet und sichtbar gemacht, damit der Benutzer den Fortschritt besser verfolgen kann.
Änderungen:
- Neue Hilfsmethode _expand_tree_item_parents() zum rekursiven Öffnen aller Eltern-Knoten
- _on_transformation_job_started() erweitert um Auto-Expand und Scroll-to-Item
- Verbesserte Log-Meldung für besseres Debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Verbessert die Fehlerbehandlung und Code-Robustheit durch:
- Explizite bool()-Konvertierung für has_xml_files (Zeile 894)
- Frühere Initialisierung von pdf_basename für Exception-Handler (Zeile 3717)
- Null-Checks für self.project/project_dir mit Fallback-Logik (Zeile 3741)
Verhindert potenzielle AttributeError und UnboundLocalError.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Änderungen:
- Diff-PDFs werden automatisch im Viewer geladen wenn XML-Knoten ausgewählt wird
- Viewer wird geleert wenn Knoten ohne Diff-PDF ausgewählt wird
- Diff-Icon ist nicht mehr klickbar, dient nur noch als visueller Indikator
- Tree-Selection-Handler (_on_tree_selection_changed) implementiert
- XSL-ID wird nun auch in XML-Items gespeichert für direkten Zugriff
- Debug-Logging hinzugefügt für bessere Fehlersuche
Verhalten:
- Nutzer kann durch den Baum navigieren
- Bei Auswahl eines XML-Knotens mit Diff-PDF: automatisches Laden
- Bei Auswahl eines Knotens ohne Diff-PDF: Viewer leeren
- Tooltip angepasst: "Diff-PDF vorhanden (wird automatisch geladen bei Selektion)"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem:
Unter Windows trat Fehler [WinError 32] auf beim Versuch, ref-PDFs zu
löschen/verschieben, da Dateien von QPdfDocument-Instanzen gesperrt waren.
Lösung:
- Neue Methode _close_all_pdf_documents() zum expliziten Schließen aller PDFs
- Schließt QPdfDocument-Instanzen und löscht alle Referenzen
- Erzwingt Garbage Collection zur Freigabe von Dateihandles
- Leert UI-Layouts und verarbeitet Qt-Events vor Dateioperationen
- QApplication.processEvents() stellt sicher, dass Widgets/Ressourcen
wirklich freigegeben werden
Unter Linux war das Problem nicht aufgetreten, da dort geöffnete Dateien
gelöscht werden können.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Project-Modell um optionales fop_config_dir Feld erweitert
- TransformationJob verwendet nun projektspezifischen FOP-Config-Pfad
- Saxon und FOP stdout/stderr werden nun im Debug-Level geloggt
- UI-Elemente für FOP-Config-Ordner-Auswahl hinzugefügt
- AppSettings und MainWindow unterstützen neues Feld beim Laden/Speichern
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die Funktion _load_images() war Legacy-Code aus der Entwicklungsphase und versuchte PDFs aus einem nicht existierenden Verzeichnis (ui/res/pdf/) zu laden. Die tatsächliche PDF-Anzeige erfolgt über _load_pdf_for_comparison(), die PDFs aus dem Projekt-Verzeichnis lädt.
Entfernt:
- _load_images() Funktion (144 Zeilen)
- Aufruf in __init__()
- Ungenutzte Imports: glob, os
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Alle print()-Statements in MainWindow.py (~88) und XmlToXslAssignDialog.py (5) wurden durch passende Logger-Aufrufe ersetzt. Die Log-Level (debug, info, warning, error) wurden entsprechend der Nachrichtenart gewählt. XmlToXslAssignDialog.py erhielt zudem einen Logger-Import.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Das Icon zum Laden von Diff-PDFs verwendet jetzt semantisch korrekte Icons:
- Primär: view-split-left-right (zeigt Split-View-Konzept)
- Fallback: vcs-diff (universelles Diff-Symbol)
- Letzter Fallback: system-search
Dies verbessert die visuelle Semantik und Plattform-Kompatibilität.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Kontextmenü-Funktionalität zum Batch-Akzeptieren von Diff-PDFs:
- Neue Aktion "Alle Änderungen übernehmen" für TreeNode und XslFile
- Wird nur aktiviert, wenn mindestens eine Diff-PDF unter dem Knoten existiert
- Akzeptiert alle Diff-PDFs unter dem ausgewählten Knoten mit einem Klick
Verhalten:
- Verschiebt alle new-PDFs nach ref (alte ref-PDFs werden gelöscht)
- Löscht alle diff-PDFs
- Entfernt Diff-Icons bei allen betroffenen XML-Knoten
- Aktualisiert Diff-PDF-Zähler auf allen übergeordneten Ebenen
- Zeigt Bestätigungsdialog mit Anzahl der zu akzeptierenden Änderungen
- Zeigt Erfolgsmeldung nach Abschluss
Viewer-Behandlung:
- KEINE Diff-PDF wird in den Viewer geladen
- Falls eine akzeptierte Diff-PDF gerade im Viewer angezeigt wird, wird der Viewer geleert
- Kein XML-Knoten wird im TreeWidget ausgewählt
Bugfixes:
- XSL-ID wird korrekt als "2002_1_128" statt "(2002, 1, 128)" formatiert
- Relative Pfade werden für xml_item_map verwendet (statt absolute Pfade)
- Diff-Icons werden jetzt korrekt entfernt
Implementierungsdetails:
- _collect_all_diff_pdfs_under_node(): Sammelt alle Diff-PDFs unter TreeNode oder XslFile
- _accept_single_diff_pdf(): Akzeptiert eine einzelne Diff-PDF ohne Viewer-Update
- _accept_all_changes_under_node(): Handler für Batch-Accept-Operation
- Kontextmenü-Integration in _create_context_menu_for_type()
- Logging-Konfiguration in main.py hinzugefügt (DEBUG-Level)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
UI-Redesign für TreeNodeEditDialog und XslFileEditDialog:
- XSLT-Parameter-Tabellen werden jetzt nebeneinander angezeigt
- Eigene Parameter (editierbar) links, geerbte Parameter (read-only) rechts
- Bessere Übersicht durch direkten visuellen Vergleich
- Fensterbreite auf ~870px erhöht für optimale Darstellung
- Icons für Hinzufügen/Entfernen-Buttons hinzugefügt
- Kompakteres Layout durch reduzierte Margins
Neue Funktionalität: Force-Transformation nach Bearbeitung
- Neue CheckBox "Alle XML-Dateien neu transformieren (force)" in beiden Dialogen
- Beim Schließen mit OK werden alle untergeordneten XML-Dateien transformiert
- TreeNodeEditDialog: Transformiert rekursiv alle XML-Dateien unter dem Knoten
- XslFileEditDialog: Transformiert alle XML-Dateien der XSL-Datei
- Transformation erfolgt auch bei bereits aktuellem Output (force=True)
Implementierungsdetails:
- TreeNodeEditDialog.get_data() gibt jetzt force_transform zurück
- XslFileEditDialog.get_data() gibt jetzt force_transform zurück
- MainWindow._find_item_by_node() findet Item nach TreeWidget-Neuladen
- MainWindow._edit_tree_node() startet Force-Transformation bei Bedarf
- MainWindow._edit_xsl_file() startet Force-Transformation bei Bedarf
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neuer Button zum Akzeptieren von PDF-Änderungen mit automatischem Workflow:
- Verschiebt new-PDF nach ref (alte ref-PDF wird gelöscht)
- Löscht diff-PDF
- Entfernt Diff-Icon beim aktuellen XML-Knoten
- Aktualisiert Diff-PDF-Anzahl auf übergeordneten Ebenen
- Lädt automatisch nächste Diff-PDF oder leert Viewer falls keine mehr vorhanden
- Wählt den entsprechenden XML-Knoten im Baum aus für visuelle Rückmeldung
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fenstergeometrie, Splitter-Positionen und TreeWidget-Spaltenbreiten werden jetzt in der Konfiguration gespeichert und beim nächsten Start automatisch wiederhergestellt.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fix für zwei Probleme:
1. Icons fehlten beim ersten Transformationsdurchlauf via TreeNode
2. Icons fehlten direkt nach Projektladen
Lösung:
- _update_diff_icons_for_existing_pdfs() in _load_nodes_to_tree() hinzugefügt
- _update_diff_icons_for_existing_pdfs() in _on_all_transformations_finished() hinzugefügt
- Doppelten Aufruf in open_existing_project() entfernt
Icons werden jetzt zuverlässig aktualisiert nach:
- Projektladen
- Jeder Transformation (einzeln oder via TreeNode)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Zeigt die Anzahl der untergeordneten Diff-PDF-Dateien in der dritten Spalte
des TreeWidgets für TreeNode und XslFile Knoten (nicht für XML-Dateien).
Neue Funktionen:
- _count_diff_pdfs_under_node(): Zählt rekursiv existierende Diff-PDFs
- _update_diff_pdf_counts_recursive(): Aktualisiert Anzahl in Spalte 2
- _update_all_diff_pdf_counts(): Aktualisiert alle Knoten im TreeWidget
Automatische Aktualisierung:
- Nach jeder Transformation (_on_all_transformations_finished)
- Beim Laden eines Projekts (_load_nodes_to_tree)
- Initial beim Erstellen der Tree-Items
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die beiden Transformations-Menüpunkte im XslFile-Kontextmenü werden jetzt nur
aktiviert, wenn mindestens eine XML-Datei zugeordnet ist.
Änderungen:
- Prüfung auf vorhandene XML-Dateien (bool(xsl_file_obj.xmls))
- setEnabled(has_xml_files) für beide Transformations-Aktionen
- Analog zur TreeNode-Implementierung
Fix: Explizite bool()-Konvertierung, da xmls eine Liste ist
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Funktionalität:
- TreeNode-Kontextmenü hat jetzt "Alle XML-Dateien transformieren" Aktionen
- Beide Aktionen (normal und force) transformieren rekursiv alle untergeordneten XML-Dateien
- Menüpunkte sind nur aktiv, wenn mindestens eine XML-Datei vorhanden ist
Implementierung:
- _has_xml_files_recursive(): Prüft rekursiv auf vorhandene XML-Dateien
- _collect_all_xsl_xml_pairs_recursive(): Sammelt alle XSL/XML-Paare im Teilbaum
- _transform_tree_node(): Transformiert alle gefundenen XML-Dateien
- Kontextmenü erweitert mit intelligenter Aktivierung/Deaktivierung
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ändert die Ausrichtung von zentriert zu linksbündig in der dritten Spalte
des TreeWidgets für bessere Übersichtlichkeit.
Änderungen:
- _create_centered_progress_bar(): AlignCenter → AlignLeft
- _create_centered_diff_icon(): AlignCenter → AlignLeft
- Docstrings aktualisiert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes:
- fullsize_label wird nach _clear_layout korrekt auf None gesetzt
- Verhindert, dass beim zweiten PDF-Laden kein Widget erstellt wird
- RuntimeError-Handling für gelöschte C++-Widgets in update_current_display()
- Verbessertes Error-Logging mit logger.error() statt print()
Problem: Nach dem ersten PDF-Laden wurden weitere PDFs nicht mehr angezeigt,
da fullsize_label auf ein gelöschtes Widget zeigte und kein neues erstellt wurde.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
XML-Transformationen berücksichtigen jetzt alle XSLT-Parameter der übergeordneten
TreeNodes, nicht nur die des direkten XslFile-Knotens. Tiefere Ebenen überschreiben
höhere Ebenen (XslFile hat höchste Priorität).
Änderungen:
- _collect_parent_params(): Bug-Fix für korrekte Prioritätsreihenfolge
- _create_transformation_job(): Hierarchische Parameter-Sammlung mit TreeWidgetItem-Kontext
- _transform_xml_file() und _transform_xsl_file(): Weitergabe des TreeWidgetItem-Kontexts
- Verbessertes Logging mit logger statt print()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Der PDF-Vergleich im integrierten Viewer wird jetzt durch einen einfachen
Klick auf das Diff-Icon geladen, nicht mehr durch Doppelklick.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Zusätzliche Sicherheitsprüfungen für path_to_binary_file, path_to_jar_file,
path_to_dir und path_to_root_dir Attribute, um NoneType-Fehler zu vermeiden.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Das Diff-PDF-Icon lädt nun alle drei PDFs (diff, ref, new) direkt in den eingebauten Vergleichs-Viewer, statt ein externes Programm zu öffnen. Zusätzlich wurde die Alpha-Blending-Logik für sanftere Übergänge zwischen den Ansichten korrigiert.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Features:
- Progress Bar in Spalte 2 während XML-Transformationen
- Diff-PDF-Icon erscheint nach Transformation bei vorhandener Diff-PDF
- Doppelklick auf Icon öffnet Diff-PDF mit System-Viewer
- Initial-Laden von Icons für existierende Diff-PDFs beim Projektstart
Technische Implementierung:
- XML-Item-Mapping mit eindeutigem Key-Format: "xml_path|xsl_id"
- Unterstützt mehrfache Verwendung derselben XML bei verschiedenen XSL-Dateien
- TransformationThread-Signale erweitert um XSL-ID-Parameter
- Widget-Factory-Methoden für zentrierte Progress Bar und klickbare Icons
- Result-Dictionary in transform.py enthält jetzt xsl_id
UI-Anpassungen:
- TreeWidget Spaltenanzahl von 2 auf 3 erhöht
- setItemWidget() für dynamische Widget-Verwaltung in Spalte 2
Dateien:
- src/ui/MainWindow.py: Hauptimplementierung mit Signal-Handlern
- src/transform.py: xsl_id im Result-Dictionary
- src/ui/MainWinddow.ui: Spalte 3 hinzugefügt
- src/ui/MainWinddow_ui.py: Auto-generiert aus UI-Datei
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die PDF-Generierung verwendet nun die Ordner 'new', 'ref' und 'diff'
anstelle von 'output', 'valide' und 'diff'. Dies ermöglicht die
Integration mit MainWindow._load_images(), die PDFs in den Ordnern
'new', 'ref' und 'diff' sucht.
Änderungen:
- output_dir → new_dir (für neu generierte PDFs)
- valide_dir → ref_dir (für Referenz-PDFs)
- Alle Variablen und Log-Meldungen entsprechend angepasst
- Unused import entfernt (typing.Optional)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Wenn eine XML-Datei mehreren XSL-Dateien zugeordnet ist, wurden die
generierten PDFs bisher überschrieben. Jetzt wird die XSL-ID in den
Dateinamen integriert (z.B. rechnung_xsl_1.pdf, rechnung_xsl_2.pdf),
sodass jede Transformation ihre eigene PDF-Datei erhält.
Änderungen:
- TransformationJob: xsl_id Parameter hinzugefügt
- Dateinamen-Generierung berücksichtigt XSL-ID (Tuple → String)
- MainWindow: XSL-ID wird an TransformationJob übergeben
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ergänzt umfassende Existenzprüfungen für pdf_project, project und nodes-Attribute
vor dem Zugriff, um NoneType-Fehler zu vermeiden. Verbessert die Robustheit der
Anwendung bei nicht initialisierten Projekten.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implementiert automatische Erkennung von XML-Datei-Duplikaten basierend auf blake2b-Hashes. Bei Hash-Match wird die vorhandene Datei automatisch zugeordnet statt sie zu kopieren. Bei Dateinamen-Konflikten werden alternative Namen (datei_1.xml, datei_2.xml, etc.) mit Auswahl-Dialog angeboten.
Neue Features:
- Projekt-weite Hash-Duplikatserkennung
- Automatische Zuordnung vorhandener Dateien bei Hash-Match
- Alternative Dateinamen-Generierung mit Benutzer-Dialog
- Performance-Optimierung durch Set-basierte Dateinamen-Prüfung
- Umfassende Dokumentation und Test-Suite
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>