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.
### 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
- `pyproject.toml` **niemals direkt bearbeiten** — immer `uv version --bump` verwenden
+1 -1
View File
@@ -4,7 +4,7 @@
<!-- Paket-Definition (ersetzt Product in v4) -->
<Package
Name="DocuMentor"
Version="1.7.0"
Version="1.7.1"
Manufacturer="Vitali Graf / Software- und Datenbankentwicklung"
UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E"
Language="1031"
+2 -2
View File
@@ -262,6 +262,6 @@ HINWEISE
da sich diese ändern können.
================================================================================
Stand: April 2026
Erstellt für: DocuMentor v1.7.0
Stand: Mai 2026
Erstellt für: DocuMentor v1.7.1
================================================================================
+1 -1
View File
@@ -10,7 +10,7 @@
; Build-Befehl: iscc installer.iss
#define MyAppName "DocuMentor"
#define MyAppVersion "1.7.0"
#define MyAppVersion "1.7.1"
#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.7.0"
version = "1.7.1"
description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung"
readme = "README.md"
license = {text = "MIT"}
-1
View File
@@ -29,7 +29,6 @@ ICONS = [
"file-plus",
"columns",
"sliders",
"folder-open",
]
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.QtSvg import QSvgRenderer
from PySide6.QtWidgets import QApplication
import res.resources_rc # noqa: F401 # registriert die Qt-Ressourcen (Icons) beim Import
logger = logging.getLogger(__name__)
_ICON_MAP: dict[str, str] = {
"folder-plus": ":/icons/folder-plus.svg",
"log-out": ":/icons/log-out.svg",
"settings": ":/icons/settings.svg",
"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",
}
# Cache: (Icon-Name, Theme-Textfarbe) → fertig gerendertes QIcon.
# Der Farb-Anteil im Schlüssel sorgt dafür, dass ein Theme-Wechsel automatisch
# neue Einträge erzeugt, ohne dass der Cache explizit geleert werden muss.
_ICON_CACHE: dict[tuple[str, bytes], 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:
name: Feather-Icon-Name (z.B. "folder-plus", "settings")
@@ -40,10 +23,7 @@ def icon(name: str) -> QIcon:
Returns:
QIcon in der Textfarbe des aktiven Themes, oder leerer QIcon bei unbekanntem Namen
"""
path = _ICON_MAP.get(name)
if path is None:
logger.warning(f"Unbekannter Icon-Name: {name!r}")
return QIcon()
path = f":/icons/{name}.svg"
app = QApplication.instance()
if app is None:
@@ -51,6 +31,10 @@ def icon(name: str) -> QIcon:
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)
if not f.open(QFile.OpenModeFlag.ReadOnly):
logger.warning(f"Icon konnte nicht geöffnet werden: {path}")
@@ -69,4 +53,5 @@ def icon(name: str) -> QIcon:
painter.end()
result.addPixmap(pixmap)
_ICON_CACHE[cache_key] = result
return result
-3
View File
@@ -98,9 +98,6 @@ def main():
if icon_path.exists():
app.setWindowIcon(QIcon(str(icon_path)))
# Qt-Ressourcen registrieren (Icons)
import res.resources_rc # noqa: F401
# Hauptfenster erstellen
window = MainWindow()
Generated
+1 -1
View File
@@ -39,7 +39,7 @@ wheels = [
[[package]]
name = "documentor"
version = "1.7.0"
version = "1.7.1"
source = { virtual = "." }
dependencies = [
{ name = "connectorx" },
+4 -4
View File
@@ -1873,8 +1873,8 @@
<span class="download-card-badge">EMPFOHLEN</span>
</div>
<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>
<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>
<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/v1.7.0/DocuMentor-1.7.0.msi" class="btn-download">&#9660; MSI herunterladen</a>
</div>
<div class="download-card corner-brackets">
<div class="download-card-header">
@@ -1882,8 +1882,8 @@
<span class="download-card-badge">PORTABEL</span>
</div>
<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>
<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>
<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/v1.7.0/DocuMentor-1.7.0.zip" class="btn-download">&#9660; ZIP herunterladen</a>
</div>
</div>
</div>