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>
This commit is contained in:
2026-05-31 11:51:21 +02:00
parent c837802fe7
commit 74b08e31c7
8 changed files with 18 additions and 37 deletions
+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" },