3 Commits

Author SHA1 Message Date
info 74b08e31c7 Version 1.7.1: Icon-System vereinfacht und gecacht
- icons.py: _ICON_MAP entfernt (war reine Identitätsabbildung), Pfad
  wird direkt aus dem Namen abgeleitet
- icons.py: Render-Cache mit Schlüssel (name, theme-farbe) ergänzt,
  vermeidet wiederholtes SVG-Rendering bei Baum-/Kontextmenü-Aufbau
- icons.py: Qt-Ressourcen-Registrierung gekapselt (Import aus main.py
  hierher verschoben)
- download_icons.py: toten folder-open-Eintrag entfernt (in Feather
  nicht vorhanden, nirgends genutzt)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:51:21 +02:00
info c837802fe7 docs(web): update download links and version to 1.7.0
Update index.html to reflect the latest release version 1.7.0,
including MSI and ZIP download links with corrected release tag format.
2026-05-30 16:50:05 +02:00
info 712bd8917e version-bump Skill: Git-Tag nach Commit setzen
Der Skill setzt jetzt nach einem erfolgreichen Commit mit Versionserhöhung
automatisch einen passenden annotated Git-Tag (z.B. v1.7.1).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 16:38:57 +02:00
10 changed files with 36 additions and 41 deletions
+14
View File
@@ -60,6 +60,20 @@ Führe zuerst `uv version --bump` aus, lese danach die neue Version aus `pyproje
Nachdem die Versionsdateien aktualisiert wurden (oder der Benutzer "Nein" gewählt hat), erstelle den Commit ganz normal nach den üblichen Commit-Konventionen. Falls die Version geändert wurde, füge die geänderten Versionsdateien zum Commit hinzu. Nachdem die Versionsdateien aktualisiert wurden (oder der Benutzer "Nein" gewählt hat), erstelle den Commit ganz normal nach den üblichen Commit-Konventionen. Falls die Version geändert wurde, füge die geänderten Versionsdateien zum Commit hinzu.
### Schritt 4: Git-Tag setzen (nur bei Versionserhöhung)
Wenn der Benutzer eine Versionserhöhung gewählt hat und der Commit erfolgreich war, setze einen annotated Git-Tag mit der neuen Version:
```bash
git tag -a "vX.Y.Z" -m "Version X.Y.Z"
```
Wobei `X.Y.Z` die neue Version aus `pyproject.toml` ist. Das Tag-Format ist immer `v` + Versionsnummer (z.B. `v1.7.1`).
Informiere den Benutzer danach kurz: „Tag `vX.Y.Z` gesetzt. Mit `git push origin vX.Y.Z` kannst du ihn pushen."
Wenn der Benutzer "Nein" gewählt hat, wird kein Tag gesetzt.
## Wichtige Hinweise ## Wichtige Hinweise
- `pyproject.toml` **niemals direkt bearbeiten** — immer `uv version --bump` verwenden - `pyproject.toml` **niemals direkt bearbeiten** — immer `uv version --bump` verwenden
+1 -1
View File
@@ -4,7 +4,7 @@
<!-- Paket-Definition (ersetzt Product in v4) --> <!-- Paket-Definition (ersetzt Product in v4) -->
<Package <Package
Name="DocuMentor" Name="DocuMentor"
Version="1.7.0" Version="1.7.1"
Manufacturer="Vitali Graf / Software- und Datenbankentwicklung" Manufacturer="Vitali Graf / Software- und Datenbankentwicklung"
UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E" UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E"
Language="1031" Language="1031"
+2 -2
View File
@@ -262,6 +262,6 @@ HINWEISE
da sich diese ändern können. da sich diese ändern können.
================================================================================ ================================================================================
Stand: April 2026 Stand: Mai 2026
Erstellt für: DocuMentor v1.7.0 Erstellt für: DocuMentor v1.7.1
================================================================================ ================================================================================
+1 -1
View File
@@ -10,7 +10,7 @@
; Build-Befehl: iscc installer.iss ; Build-Befehl: iscc installer.iss
#define MyAppName "DocuMentor" #define MyAppName "DocuMentor"
#define MyAppVersion "1.7.0" #define MyAppVersion "1.7.1"
#define MyAppPublisher "Ihr Name/Organisation" #define MyAppPublisher "Ihr Name/Organisation"
#define MyAppURL "https://github.com/yourusername/xsl-validator" #define MyAppURL "https://github.com/yourusername/xsl-validator"
#define MyAppExeName "DocuMentor.exe" #define MyAppExeName "DocuMentor.exe"
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "DocuMentor" name = "DocuMentor"
version = "1.7.0" version = "1.7.1"
description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung" description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung"
readme = "README.md" readme = "README.md"
license = {text = "MIT"} license = {text = "MIT"}
-1
View File
@@ -29,7 +29,6 @@ ICONS = [
"file-plus", "file-plus",
"columns", "columns",
"sliders", "sliders",
"folder-open",
] ]
BASE_URL = "https://raw.githubusercontent.com/feathericons/feather/master/icons/{name}.svg" BASE_URL = "https://raw.githubusercontent.com/feathericons/feather/master/icons/{name}.svg"
+12 -27
View File
@@ -3,36 +3,19 @@ from PySide6.QtCore import QByteArray, QFile, Qt
from PySide6.QtGui import QIcon, QPainter, QPixmap, QPalette from PySide6.QtGui import QIcon, QPainter, QPixmap, QPalette
from PySide6.QtSvg import QSvgRenderer from PySide6.QtSvg import QSvgRenderer
from PySide6.QtWidgets import QApplication from PySide6.QtWidgets import QApplication
import res.resources_rc # noqa: F401 # registriert die Qt-Ressourcen (Icons) beim Import
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_ICON_MAP: dict[str, str] = { # Cache: (Icon-Name, Theme-Textfarbe) → fertig gerendertes QIcon.
"folder-plus": ":/icons/folder-plus.svg", # Der Farb-Anteil im Schlüssel sorgt dafür, dass ein Theme-Wechsel automatisch
"log-out": ":/icons/log-out.svg", # neue Einträge erzeugt, ohne dass der Cache explizit geleert werden muss.
"settings": ":/icons/settings.svg", _ICON_CACHE: dict[tuple[str, bytes], QIcon] = {}
"folder": ":/icons/folder.svg",
"refresh-cw": ":/icons/refresh-cw.svg",
"plus-circle": ":/icons/plus-circle.svg",
"minus-circle": ":/icons/minus-circle.svg",
"play-circle": ":/icons/play-circle.svg",
"file": ":/icons/file.svg",
"check-circle": ":/icons/check-circle.svg",
"info": ":/icons/info.svg",
"git-branch": ":/icons/git-branch.svg",
"file-text": ":/icons/file-text.svg",
"code": ":/icons/code.svg",
"chevron-down": ":/icons/chevron-down.svg",
"chevron-up": ":/icons/chevron-up.svg",
"trash-2": ":/icons/trash-2.svg",
"file-plus": ":/icons/file-plus.svg",
"columns": ":/icons/columns.svg",
"sliders": ":/icons/sliders.svg",
}
def icon(name: str) -> QIcon: def icon(name: str) -> QIcon:
""" """
Lädt ein Icon aus dem Qt-Ressource-System und färbt es mit der aktuellen Palette-Farbe. Lädt ein Feather-Icon aus dem Qt-Ressource-System und färbt es mit der aktuellen Palette-Farbe.
Args: Args:
name: Feather-Icon-Name (z.B. "folder-plus", "settings") name: Feather-Icon-Name (z.B. "folder-plus", "settings")
@@ -40,10 +23,7 @@ def icon(name: str) -> QIcon:
Returns: Returns:
QIcon in der Textfarbe des aktiven Themes, oder leerer QIcon bei unbekanntem Namen QIcon in der Textfarbe des aktiven Themes, oder leerer QIcon bei unbekanntem Namen
""" """
path = _ICON_MAP.get(name) path = f":/icons/{name}.svg"
if path is None:
logger.warning(f"Unbekannter Icon-Name: {name!r}")
return QIcon()
app = QApplication.instance() app = QApplication.instance()
if app is None: if app is None:
@@ -51,6 +31,10 @@ def icon(name: str) -> QIcon:
color = app.palette().color(QPalette.ColorRole.WindowText).name().encode() color = app.palette().color(QPalette.ColorRole.WindowText).name().encode()
cache_key = (name, color)
if (cached := _ICON_CACHE.get(cache_key)) is not None:
return cached
f = QFile(path) f = QFile(path)
if not f.open(QFile.OpenModeFlag.ReadOnly): if not f.open(QFile.OpenModeFlag.ReadOnly):
logger.warning(f"Icon konnte nicht geöffnet werden: {path}") logger.warning(f"Icon konnte nicht geöffnet werden: {path}")
@@ -69,4 +53,5 @@ def icon(name: str) -> QIcon:
painter.end() painter.end()
result.addPixmap(pixmap) result.addPixmap(pixmap)
_ICON_CACHE[cache_key] = result
return result return result
-3
View File
@@ -98,9 +98,6 @@ def main():
if icon_path.exists(): if icon_path.exists():
app.setWindowIcon(QIcon(str(icon_path))) app.setWindowIcon(QIcon(str(icon_path)))
# Qt-Ressourcen registrieren (Icons)
import res.resources_rc # noqa: F401
# Hauptfenster erstellen # Hauptfenster erstellen
window = MainWindow() window = MainWindow()
Generated
+1 -1
View File
@@ -39,7 +39,7 @@ wheels = [
[[package]] [[package]]
name = "documentor" name = "documentor"
version = "1.7.0" version = "1.7.1"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "connectorx" }, { name = "connectorx" },
+4 -4
View File
@@ -1873,8 +1873,8 @@
<span class="download-card-badge">EMPFOHLEN</span> <span class="download-card-badge">EMPFOHLEN</span>
</div> </div>
<p class="download-card-desc">Windows-Installer mit automatischer Einrichtung. Erstellt Startmenü-Einträge und ermöglicht saubere Deinstallation über die Systemsteuerung.</p> <p class="download-card-desc">Windows-Installer mit automatischer Einrichtung. Erstellt Startmenü-Einträge und ermöglicht saubere Deinstallation über die Systemsteuerung.</p>
<span class="download-card-meta">DocuMentor-1.6.3.msi &mdash; ca. 255 MB</span> <span class="download-card-meta">DocuMentor-1.7.0.msi &mdash; ca. 255 MB</span>
<a href="https://code.vitaligraf.de/info/xsl-validator/releases/download/1.6.3/DocuMentor-1.6.3.msi" class="btn-download">&#9660; MSI herunterladen</a> <a href="https://code.vitaligraf.de/info/xsl-validator/releases/download/v1.7.0/DocuMentor-1.7.0.msi" class="btn-download">&#9660; MSI herunterladen</a>
</div> </div>
<div class="download-card corner-brackets"> <div class="download-card corner-brackets">
<div class="download-card-header"> <div class="download-card-header">
@@ -1882,8 +1882,8 @@
<span class="download-card-badge">PORTABEL</span> <span class="download-card-badge">PORTABEL</span>
</div> </div>
<p class="download-card-desc">Portable Version ohne Installation. Entpacken und direkt starten &mdash; ideal für eingeschränkte Umgebungen ohne Administratorrechte.</p> <p class="download-card-desc">Portable Version ohne Installation. Entpacken und direkt starten &mdash; ideal für eingeschränkte Umgebungen ohne Administratorrechte.</p>
<span class="download-card-meta">DocuMentor-1.6.3.zip &mdash; ca. 315 MB</span> <span class="download-card-meta">DocuMentor-1.7.0.zip &mdash; ca. 315 MB</span>
<a href="https://code.vitaligraf.de/info/xsl-validator/releases/download/1.6.3/DocuMentor-1.6.3.zip" class="btn-download">&#9660; ZIP herunterladen</a> <a href="https://code.vitaligraf.de/info/xsl-validator/releases/download/v1.7.0/DocuMentor-1.7.0.zip" class="btn-download">&#9660; ZIP herunterladen</a>
</div> </div>
</div> </div>
</div> </div>