Compare commits
3 Commits
5f10b79906
...
v1.7.0
| Author | SHA1 | Date | |
|---|---|---|---|
| ec753a5770 | |||
| bf2db92040 | |||
| 19f7deec20 |
@@ -4,7 +4,10 @@ PyInstaller Konfiguration für DocuMentor
|
||||
Erstellt eine eigenständige Windows-Executable ohne Python-Installation
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from importlib.metadata import PackageNotFoundError
|
||||
from importlib.metadata import version as pkg_version
|
||||
from pathlib import Path
|
||||
from PyInstaller.utils.hooks import collect_all
|
||||
|
||||
@@ -14,6 +17,22 @@ block_cipher = None
|
||||
project_root = Path(SPECPATH)
|
||||
src_path = project_root / 'src'
|
||||
|
||||
# Versions-Snapshot erzeugen und ins Bundle einbetten
|
||||
_packages_to_snapshot = [
|
||||
"PySide6", "pydantic", "pydantic-settings", "pydantic-yaml",
|
||||
"polars", "connectorx", "pyarrow", "psutil", "lxml",
|
||||
"ruff", "pyinstaller", "pillow",
|
||||
]
|
||||
_versions_snapshot: dict[str, str] = {}
|
||||
for _pkg in _packages_to_snapshot:
|
||||
try:
|
||||
_versions_snapshot[_pkg.lower()] = pkg_version(_pkg)
|
||||
except PackageNotFoundError:
|
||||
_versions_snapshot[_pkg.lower()] = ""
|
||||
|
||||
_versions_file = project_root / "versions.json"
|
||||
_versions_file.write_text(json.dumps(_versions_snapshot), encoding="utf-8")
|
||||
|
||||
# connectorx komplett sammeln (Python-Code, native .pyd und Metadaten)
|
||||
# PyInstaller erkennt connectorx nicht automatisch, da es zur Laufzeit
|
||||
# von polars per importlib.import_module() geladen wird
|
||||
@@ -36,6 +55,7 @@ a = Analysis(
|
||||
datas=ui_files + res_files + cx_datas + [
|
||||
(str(project_root / 'pyproject.toml'), '.'),
|
||||
(str(project_root / 'THIRD_PARTY_LICENSES.txt'), '.'),
|
||||
(str(_versions_file), '.'),
|
||||
(str(project_root / 'resources' / 'icon.ico'), 'resources'),
|
||||
],
|
||||
hiddenimports=[
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<!-- Paket-Definition (ersetzt Product in v4) -->
|
||||
<Package
|
||||
Name="DocuMentor"
|
||||
Version="1.6.5"
|
||||
Version="1.7.0"
|
||||
Manufacturer="Vitali Graf / Software- und Datenbankentwicklung"
|
||||
UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E"
|
||||
Language="1031"
|
||||
|
||||
@@ -115,6 +115,16 @@ Diese Bibliotheken sind direkt im Quellcode von DocuMentor enthalten.
|
||||
Datei: src/res/vis-network.min.js
|
||||
Hinweis: Wird inline in QWebEngineView für den XSL-Abhängigkeitsgraph verwendet
|
||||
|
||||
2. Feather Icons
|
||||
Version: 4.29.2
|
||||
Lizenz: MIT License
|
||||
Webseite: https://feathericons.com
|
||||
GitHub: https://github.com/feathericons/feather
|
||||
Beschreibung: Simply beautiful open source icons
|
||||
Copyright: Copyright (c) 2013-2017 Cole Bemis
|
||||
Datei: src/res/icons/, src/res/resources_rc.py
|
||||
Hinweis: SVG-Icons werden via Qt-Ressourcensystem eingebettet; Farbe wird zur Laufzeit aus der Qt-Palette gesetzt
|
||||
|
||||
================================================================================
|
||||
Externe Tools (nicht eingebettet)
|
||||
================================================================================
|
||||
@@ -253,5 +263,5 @@ HINWEISE
|
||||
|
||||
================================================================================
|
||||
Stand: April 2026
|
||||
Erstellt für: DocuMentor v1.6.5
|
||||
Erstellt für: DocuMentor v1.7.0
|
||||
================================================================================
|
||||
|
||||
@@ -48,10 +48,19 @@ def build_msi():
|
||||
|
||||
# Schritt 2: MSI kompilieren mit WiX v6
|
||||
print("Schritt 2/2: Kompiliere MSI-Installer...")
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["wix", "build", "DocuMentor.wxs", "ProductFiles.wxs", "-o", str(msi_output)],
|
||||
check=False,
|
||||
)
|
||||
except FileNotFoundError:
|
||||
print("\nFEHLER: 'wix' wurde nicht gefunden!")
|
||||
print("WiX v6 muss installiert sein. Installationsschritte:")
|
||||
print(" 1. .NET SDK installieren: https://dot.net")
|
||||
print(" 2. WiX als dotnet tool installieren:")
|
||||
print(" dotnet tool install --global wix --version 6.*")
|
||||
print(" 3. Neues Terminal öffnen (PATH aktualisieren)")
|
||||
sys.exit(1)
|
||||
|
||||
if result.returncode != 0:
|
||||
print("\nFEHLER: MSI-Kompilierung fehlgeschlagen!")
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
; Build-Befehl: iscc installer.iss
|
||||
|
||||
#define MyAppName "DocuMentor"
|
||||
#define MyAppVersion "1.6.5"
|
||||
#define MyAppVersion "1.7.0"
|
||||
#define MyAppPublisher "Ihr Name/Organisation"
|
||||
#define MyAppURL "https://github.com/yourusername/xsl-validator"
|
||||
#define MyAppExeName "DocuMentor.exe"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "DocuMentor"
|
||||
version = "1.6.5"
|
||||
version = "1.7.0"
|
||||
description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung"
|
||||
readme = "README.md"
|
||||
license = {text = "MIT"}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
Lädt Feather Icons (MIT-Lizenz) von GitHub herunter und speichert sie in src/res/icons/.
|
||||
Stroke-Farbe wird auf #444444 gesetzt für bessere Sichtbarkeit in hellen und dunklen Themes.
|
||||
|
||||
Ausführung: uv run python scripts/download_icons.py
|
||||
"""
|
||||
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
ICONS = [
|
||||
"folder-plus",
|
||||
"log-out",
|
||||
"settings",
|
||||
"folder",
|
||||
"refresh-cw",
|
||||
"plus-circle",
|
||||
"minus-circle",
|
||||
"play-circle",
|
||||
"file",
|
||||
"check-circle",
|
||||
"info",
|
||||
"git-branch",
|
||||
"file-text",
|
||||
"code",
|
||||
"chevron-down",
|
||||
"chevron-up",
|
||||
"trash-2",
|
||||
"file-plus",
|
||||
"columns",
|
||||
"sliders",
|
||||
"folder-open",
|
||||
]
|
||||
|
||||
BASE_URL = "https://raw.githubusercontent.com/feathericons/feather/master/icons/{name}.svg"
|
||||
OUTPUT_DIR = Path(__file__).parent.parent / "src" / "res" / "icons"
|
||||
|
||||
|
||||
def download_icons():
|
||||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
success = 0
|
||||
failed = []
|
||||
|
||||
for name in ICONS:
|
||||
url = BASE_URL.format(name=name)
|
||||
dest = OUTPUT_DIR / f"{name}.svg"
|
||||
|
||||
if dest.exists():
|
||||
print(f" [OK] {name}.svg (bereits vorhanden)")
|
||||
success += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=10) as response:
|
||||
content = response.read().decode("utf-8")
|
||||
|
||||
content = content.replace('stroke="#000000"', 'stroke="#444444"')
|
||||
content = content.replace("stroke='#000000'", "stroke='#444444'")
|
||||
|
||||
dest.write_text(content, encoding="utf-8")
|
||||
print(f" [OK] {name}.svg")
|
||||
success += 1
|
||||
|
||||
except Exception as e:
|
||||
print(f" [FEHLER] {name}.svg: {e}")
|
||||
failed.append(name)
|
||||
|
||||
print(f"\n{success}/{len(ICONS)} Icons heruntergeladen nach {OUTPUT_DIR}")
|
||||
if failed:
|
||||
print(f"Fehlgeschlagen: {', '.join(failed)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"Lade {len(ICONS)} Feather Icons herunter ...")
|
||||
download_icons()
|
||||
@@ -0,0 +1,72 @@
|
||||
import logging
|
||||
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
|
||||
|
||||
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",
|
||||
}
|
||||
|
||||
|
||||
def icon(name: str) -> QIcon:
|
||||
"""
|
||||
Lädt ein 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")
|
||||
|
||||
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()
|
||||
|
||||
app = QApplication.instance()
|
||||
if app is None:
|
||||
return QIcon(path)
|
||||
|
||||
color = app.palette().color(QPalette.ColorRole.WindowText).name().encode()
|
||||
|
||||
f = QFile(path)
|
||||
if not f.open(QFile.OpenModeFlag.ReadOnly):
|
||||
logger.warning(f"Icon konnte nicht geöffnet werden: {path}")
|
||||
return QIcon(path)
|
||||
|
||||
svg_data = QByteArray(bytes(f.readAll()).replace(b"currentColor", color))
|
||||
f.close()
|
||||
|
||||
renderer = QSvgRenderer(svg_data)
|
||||
result = QIcon()
|
||||
for size in (16, 24, 32):
|
||||
pixmap = QPixmap(size, size)
|
||||
pixmap.fill(Qt.GlobalColor.transparent)
|
||||
painter = QPainter(pixmap)
|
||||
renderer.render(painter)
|
||||
painter.end()
|
||||
result.addPixmap(pixmap)
|
||||
|
||||
return result
|
||||
@@ -2,8 +2,10 @@
|
||||
Parser für THIRD_PARTY_LICENSES.txt.
|
||||
|
||||
Extrahiert strukturierte Lizenzinformationen und ergänzt sie
|
||||
mit den tatsächlich installierten Paketversionen via importlib.metadata.
|
||||
mit den tatsächlich installierten Paketversionen via importlib.metadata
|
||||
oder (im PyInstaller-Bundle) aus der mitgebündelten versions.json.
|
||||
"""
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import sys
|
||||
@@ -71,8 +73,29 @@ def _normalize_package_name(display_name: str) -> str:
|
||||
return display_name.lower().split("(")[0].strip()
|
||||
|
||||
|
||||
_bundled_versions: dict[str, str] | None = None
|
||||
|
||||
|
||||
def _load_bundled_versions() -> dict[str, str]:
|
||||
"""Lädt den Versions-Snapshot aus der mitgebündelten versions.json (nur im PyInstaller-Bundle)."""
|
||||
global _bundled_versions
|
||||
if _bundled_versions is None:
|
||||
if hasattr(sys, "_MEIPASS"):
|
||||
versions_file = Path(sys._MEIPASS) / "versions.json" # type: ignore[attr-defined]
|
||||
if versions_file.exists():
|
||||
_bundled_versions = json.loads(versions_file.read_text(encoding="utf-8"))
|
||||
else:
|
||||
_bundled_versions = {}
|
||||
else:
|
||||
_bundled_versions = {}
|
||||
return _bundled_versions
|
||||
|
||||
|
||||
def _get_installed_version(package_name: str) -> str:
|
||||
"""Ermittelt die installierte Version eines Pakets."""
|
||||
bundled = _load_bundled_versions()
|
||||
if bundled:
|
||||
return bundled.get(package_name.lower(), "")
|
||||
try:
|
||||
return version(package_name)
|
||||
except PackageNotFoundError:
|
||||
|
||||
@@ -98,6 +98,9 @@ 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()
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
|
||||
|
After Width: | Height: | Size: 275 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"/></svg>
|
||||
|
After Width: | Height: | Size: 223 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
|
||||
|
After Width: | Height: | Size: 258 B |
@@ -0,0 +1 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18"/></svg>
|
||||
|
After Width: | Height: | Size: 288 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><line x1="9" y1="15" x2="15" y2="15"/></svg>
|
||||
|
After Width: | Height: | Size: 369 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>
|
||||
|
After Width: | Height: | Size: 401 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"/><polyline points="13 2 13 9 20 9"/></svg>
|
||||
|
After Width: | Height: | Size: 292 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/><line x1="12" y1="11" x2="12" y2="17"/><line x1="9" y1="14" x2="15" y2="14"/></svg>
|
||||
|
After Width: | Height: | Size: 351 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
|
||||
|
After Width: | Height: | Size: 274 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
|
||||
|
After Width: | Height: | Size: 314 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
|
||||
|
After Width: | Height: | Size: 298 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
|
||||
|
After Width: | Height: | Size: 313 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="8" y1="12" x2="16" y2="12"/></svg>
|
||||
|
After Width: | Height: | Size: 257 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polygon points="10 8 16 12 10 16 10 8"/></svg>
|
||||
|
After Width: | Height: | Size: 260 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg>
|
||||
|
After Width: | Height: | Size: 295 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg>
|
||||
|
After Width: | Height: | Size: 339 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
|
||||
|
After Width: | Height: | Size: 964 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></svg>
|
||||
|
After Width: | Height: | Size: 525 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg>
|
||||
|
After Width: | Height: | Size: 388 B |
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE RCC>
|
||||
<RCC version="1.0">
|
||||
<qresource prefix="/">
|
||||
<file>icons/folder-plus.svg</file>
|
||||
<file>icons/log-out.svg</file>
|
||||
<file>icons/settings.svg</file>
|
||||
<file>icons/folder.svg</file>
|
||||
<file>icons/refresh-cw.svg</file>
|
||||
<file>icons/plus-circle.svg</file>
|
||||
<file>icons/minus-circle.svg</file>
|
||||
<file>icons/play-circle.svg</file>
|
||||
<file>icons/file.svg</file>
|
||||
<file>icons/check-circle.svg</file>
|
||||
<file>icons/info.svg</file>
|
||||
<file>icons/git-branch.svg</file>
|
||||
<file>icons/file-text.svg</file>
|
||||
<file>icons/code.svg</file>
|
||||
<file>icons/chevron-down.svg</file>
|
||||
<file>icons/chevron-up.svg</file>
|
||||
<file>icons/trash-2.svg</file>
|
||||
<file>icons/file-plus.svg</file>
|
||||
<file>icons/columns.svg</file>
|
||||
<file>icons/sliders.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,634 @@
|
||||
# Resource object code (Python 3)
|
||||
# Created by: object code
|
||||
# Created by: The Resource Compiler for Qt version 6.11.1
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PySide6 import QtCore
|
||||
|
||||
qt_resource_data = b"\
|
||||
\x00\x00\x01\x01\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><circle cx=\x22\
|
||||
12\x22 cy=\x2212\x22 r=\x221\
|
||||
0\x22/><line x1=\x228\x22\
|
||||
y1=\x2212\x22 x2=\x2216\x22\
|
||||
y2=\x2212\x22/></svg>\
|
||||
\
|
||||
\x00\x00\x02\x0d\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><line x1=\x224\x22\
|
||||
y1=\x2221\x22 x2=\x224\x22 \
|
||||
y2=\x2214\x22/><line x\
|
||||
1=\x224\x22 y1=\x2210\x22 x2\
|
||||
=\x224\x22 y2=\x223\x22/><li\
|
||||
ne x1=\x2212\x22 y1=\x222\
|
||||
1\x22 x2=\x2212\x22 y2=\x221\
|
||||
2\x22/><line x1=\x2212\
|
||||
\x22 y1=\x228\x22 x2=\x2212\x22\
|
||||
y2=\x223\x22/><line x\
|
||||
1=\x2220\x22 y1=\x2221\x22 x\
|
||||
2=\x2220\x22 y2=\x2216\x22/>\
|
||||
<line x1=\x2220\x22 y1\
|
||||
=\x2212\x22 x2=\x2220\x22 y2\
|
||||
=\x223\x22/><line x1=\x22\
|
||||
1\x22 y1=\x2214\x22 x2=\x227\
|
||||
\x22 y2=\x2214\x22/><line\
|
||||
x1=\x229\x22 y1=\x228\x22 x\
|
||||
2=\x2215\x22 y2=\x228\x22/><\
|
||||
line x1=\x2217\x22 y1=\
|
||||
\x2216\x22 x2=\x2223\x22 y2=\
|
||||
\x2216\x22/></svg>\
|
||||
\x00\x00\x01\x04\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><circle cx=\x22\
|
||||
12\x22 cy=\x2212\x22 r=\x221\
|
||||
0\x22/><polygon poi\
|
||||
nts=\x2210 8 16 12 \
|
||||
10 16 10 8\x22/></s\
|
||||
vg>\
|
||||
\x00\x00\x01 \
|
||||
<\
|
||||
svg width=\x2224\x22 h\
|
||||
eight=\x2224\x22 viewB\
|
||||
ox=\x220 0 24 24\x22 x\
|
||||
mlns=\x22http://www\
|
||||
.w3.org/2000/svg\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M12\
|
||||
3h7a2 2 0 0 1 2\
|
||||
2v14a2 2 0 0 1-\
|
||||
2 2h-7m0-18H5a2 \
|
||||
2 0 0 0-2 2v14a2\
|
||||
2 0 0 0 2 2h7m0\
|
||||
-18v18\x22/></svg>\
|
||||
\x00\x00\x01_\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M22\
|
||||
19a2 2 0 0 1-2 \
|
||||
2H4a2 2 0 0 1-2-\
|
||||
2V5a2 2 0 0 1 2-\
|
||||
2h5l2 3h9a2 2 0 \
|
||||
0 1 2 2z\x22/><line\
|
||||
x1=\x2212\x22 y1=\x2211\x22\
|
||||
x2=\x2212\x22 y2=\x2217\x22\
|
||||
/><line x1=\x229\x22 y\
|
||||
1=\x2214\x22 x2=\x2215\x22 y\
|
||||
2=\x2214\x22/></svg>\
|
||||
\x00\x00\x01$\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M13\
|
||||
2H6a2 2 0 0 0-2\
|
||||
2v16a2 2 0 0 0 \
|
||||
2 2h12a2 2 0 0 0\
|
||||
2-2V9z\x22/><polyl\
|
||||
ine points=\x2213 2\
|
||||
13 9 20 9\x22/></s\
|
||||
vg>\
|
||||
\x00\x00\x01S\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><polyline po\
|
||||
ints=\x2223 4 23 10\
|
||||
17 10\x22/><polyli\
|
||||
ne points=\x221 20 \
|
||||
1 14 7 14\x22/><pat\
|
||||
h d=\x22M3.51 9a9 9\
|
||||
0 0 1 14.85-3.3\
|
||||
6L23 10M1 14l4.6\
|
||||
4 4.36A9 9 0 0 0\
|
||||
20.49 15\x22/></sv\
|
||||
g>\
|
||||
\x00\x00\x01\x12\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M22\
|
||||
19a2 2 0 0 1-2 \
|
||||
2H4a2 2 0 0 1-2-\
|
||||
2V5a2 2 0 0 1 2-\
|
||||
2h5l2 3h9a2 2 0 \
|
||||
0 1 2 2z\x22/></svg\
|
||||
>\
|
||||
\x00\x00\x00\xde\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><polyline po\
|
||||
ints=\x226 9 12 15 \
|
||||
18 9\x22/></svg>\
|
||||
\x00\x00\x03\xc4\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><circle cx=\x22\
|
||||
12\x22 cy=\x2212\x22 r=\x223\
|
||||
\x22/><path d=\x22M19.\
|
||||
4 15a1.65 1.65 0\
|
||||
0 0 .33 1.82l.0\
|
||||
6.06a2 2 0 0 1 0\
|
||||
2.83 2 2 0 0 1-\
|
||||
2.83 0l-.06-.06a\
|
||||
1.65 1.65 0 0 0-\
|
||||
1.82-.33 1.65 1.\
|
||||
65 0 0 0-1 1.51V\
|
||||
21a2 2 0 0 1-2 2\
|
||||
2 2 0 0 1-2-2v-\
|
||||
.09A1.65 1.65 0 \
|
||||
0 0 9 19.4a1.65 \
|
||||
1.65 0 0 0-1.82.\
|
||||
33l-.06.06a2 2 0\
|
||||
0 1-2.83 0 2 2 \
|
||||
0 0 1 0-2.83l.06\
|
||||
-.06a1.65 1.65 0\
|
||||
0 0 .33-1.82 1.\
|
||||
65 1.65 0 0 0-1.\
|
||||
51-1H3a2 2 0 0 1\
|
||||
-2-2 2 2 0 0 1 2\
|
||||
-2h.09A1.65 1.65\
|
||||
0 0 0 4.6 9a1.6\
|
||||
5 1.65 0 0 0-.33\
|
||||
-1.82l-.06-.06a2\
|
||||
2 0 0 1 0-2.83 \
|
||||
2 2 0 0 1 2.83 0\
|
||||
l.06.06a1.65 1.6\
|
||||
5 0 0 0 1.82.33H\
|
||||
9a1.65 1.65 0 0 \
|
||||
0 1-1.51V3a2 2 0\
|
||||
0 1 2-2 2 2 0 0\
|
||||
1 2 2v.09a1.65 \
|
||||
1.65 0 0 0 1 1.5\
|
||||
1 1.65 1.65 0 0 \
|
||||
0 1.82-.33l.06-.\
|
||||
06a2 2 0 0 1 2.8\
|
||||
3 0 2 2 0 0 1 0 \
|
||||
2.83l-.06.06a1.6\
|
||||
5 1.65 0 0 0-.33\
|
||||
1.82V9a1.65 1.6\
|
||||
5 0 0 0 1.51 1H2\
|
||||
1a2 2 0 0 1 2 2 \
|
||||
2 2 0 0 1-2 2h-.\
|
||||
09a1.65 1.65 0 0\
|
||||
0-1.51 1z\x22/></s\
|
||||
vg>\
|
||||
\x00\x00\x01'\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><circle cx=\x22\
|
||||
12\x22 cy=\x2212\x22 r=\x221\
|
||||
0\x22/><line x1=\x2212\
|
||||
\x22 y1=\x228\x22 x2=\x2212\x22\
|
||||
y2=\x2216\x22/><line \
|
||||
x1=\x228\x22 y1=\x2212\x22 x\
|
||||
2=\x2216\x22 y2=\x2212\x22/>\
|
||||
</svg>\
|
||||
\x00\x00\x019\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M9 \
|
||||
21H5a2 2 0 0 1-2\
|
||||
-2V5a2 2 0 0 1 2\
|
||||
-2h4\x22/><polyline\
|
||||
points=\x2216 17 2\
|
||||
1 12 16 7\x22/><lin\
|
||||
e x1=\x2221\x22 y1=\x2212\
|
||||
\x22 x2=\x229\x22 y2=\x2212\x22\
|
||||
/></svg>\
|
||||
\x00\x00\x01\x13\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M22\
|
||||
11.08V12a10 10 \
|
||||
0 1 1-5.93-9.14\x22\
|
||||
/><polyline poin\
|
||||
ts=\x2222 4 12 14.0\
|
||||
1 9 11.01\x22/></sv\
|
||||
g>\
|
||||
\x00\x00\x01*\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><circle cx=\x22\
|
||||
12\x22 cy=\x2212\x22 r=\x221\
|
||||
0\x22/><line x1=\x2212\
|
||||
\x22 y1=\x2216\x22 x2=\x2212\
|
||||
\x22 y2=\x2212\x22/><line\
|
||||
x1=\x2212\x22 y1=\x228\x22 \
|
||||
x2=\x2212.01\x22 y2=\x228\
|
||||
\x22/></svg>\
|
||||
\x00\x00\x00\xdf\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><polyline po\
|
||||
ints=\x2218 15 12 9\
|
||||
6 15\x22/></svg>\
|
||||
\x00\x00\x01\x91\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M14\
|
||||
2H6a2 2 0 0 0-2\
|
||||
2v16a2 2 0 0 0 \
|
||||
2 2h12a2 2 0 0 0\
|
||||
2-2V8z\x22/><polyl\
|
||||
ine points=\x2214 2\
|
||||
14 8 20 8\x22/><li\
|
||||
ne x1=\x2216\x22 y1=\x221\
|
||||
3\x22 x2=\x228\x22 y2=\x2213\
|
||||
\x22/><line x1=\x2216\x22\
|
||||
y1=\x2217\x22 x2=\x228\x22 \
|
||||
y2=\x2217\x22/><polyli\
|
||||
ne points=\x2210 9 \
|
||||
9 9 8 9\x22/></svg>\
|
||||
\
|
||||
\x00\x00\x01q\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><path d=\x22M14\
|
||||
2H6a2 2 0 0 0-2\
|
||||
2v16a2 2 0 0 0 \
|
||||
2 2h12a2 2 0 0 0\
|
||||
2-2V8z\x22/><polyl\
|
||||
ine points=\x2214 2\
|
||||
14 8 20 8\x22/><li\
|
||||
ne x1=\x2212\x22 y1=\x221\
|
||||
8\x22 x2=\x2212\x22 y2=\x221\
|
||||
2\x22/><line x1=\x229\x22\
|
||||
y1=\x2215\x22 x2=\x2215\x22\
|
||||
y2=\x2215\x22/></svg>\
|
||||
\
|
||||
\x00\x00\x01\x02\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><polyline po\
|
||||
ints=\x2216 18 22 1\
|
||||
2 16 6\x22/><polyli\
|
||||
ne points=\x228 6 2\
|
||||
12 8 18\x22/></svg\
|
||||
>\
|
||||
\x00\x00\x01\x84\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><polyline po\
|
||||
ints=\x223 6 5 6 21\
|
||||
6\x22/><path d=\x22M1\
|
||||
9 6v14a2 2 0 0 1\
|
||||
-2 2H7a2 2 0 0 1\
|
||||
-2-2V6m3 0V4a2 2\
|
||||
0 0 1 2-2h4a2 2\
|
||||
0 0 1 2 2v2\x22/><\
|
||||
line x1=\x2210\x22 y1=\
|
||||
\x2211\x22 x2=\x2210\x22 y2=\
|
||||
\x2217\x22/><line x1=\x22\
|
||||
14\x22 y1=\x2211\x22 x2=\x22\
|
||||
14\x22 y2=\x2217\x22/></s\
|
||||
vg>\
|
||||
\x00\x00\x01:\
|
||||
<\
|
||||
svg xmlns=\x22http:\
|
||||
//www.w3.org/200\
|
||||
0/svg\x22 width=\x2224\
|
||||
\x22 height=\x2224\x22 vi\
|
||||
ewBox=\x220 0 24 24\
|
||||
\x22 fill=\x22none\x22 st\
|
||||
roke=\x22currentCol\
|
||||
or\x22 stroke-width\
|
||||
=\x222\x22 stroke-line\
|
||||
cap=\x22round\x22 stro\
|
||||
ke-linejoin=\x22rou\
|
||||
nd\x22><line x1=\x226\x22\
|
||||
y1=\x223\x22 x2=\x226\x22 y\
|
||||
2=\x2215\x22/><circle \
|
||||
cx=\x2218\x22 cy=\x226\x22 r\
|
||||
=\x223\x22/><circle cx\
|
||||
=\x226\x22 cy=\x2218\x22 r=\x22\
|
||||
3\x22/><path d=\x22M18\
|
||||
9a9 9 0 0 1-9 9\
|
||||
\x22/></svg>\
|
||||
"
|
||||
|
||||
qt_resource_name = b"\
|
||||
\x00\x05\
|
||||
\x00o\xa6S\
|
||||
\x00i\
|
||||
\x00c\x00o\x00n\x00s\
|
||||
\x00\x10\
|
||||
\x02\xfe\x1a\xa7\
|
||||
\x00m\
|
||||
\x00i\x00n\x00u\x00s\x00-\x00c\x00i\x00r\x00c\x00l\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x0b\
|
||||
\x0cb\x05\x87\
|
||||
\x00s\
|
||||
\x00l\x00i\x00d\x00e\x00r\x00s\x00.\x00s\x00v\x00g\
|
||||
\x00\x0f\
|
||||
\x0b\xa3Gg\
|
||||
\x00p\
|
||||
\x00l\x00a\x00y\x00-\x00c\x00i\x00r\x00c\x00l\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x0b\
|
||||
\x04\x82\x9dG\
|
||||
\x00c\
|
||||
\x00o\x00l\x00u\x00m\x00n\x00s\x00.\x00s\x00v\x00g\
|
||||
\x00\x0f\
|
||||
\x06\x9fG\xa7\
|
||||
\x00f\
|
||||
\x00o\x00l\x00d\x00e\x00r\x00-\x00p\x00l\x00u\x00s\x00.\x00s\x00v\x00g\
|
||||
\x00\x08\
|
||||
\x00(Wg\
|
||||
\x00f\
|
||||
\x00i\x00l\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x0e\
|
||||
\x04\x1b\xd7\x87\
|
||||
\x00r\
|
||||
\x00e\x00f\x00r\x00e\x00s\x00h\x00-\x00c\x00w\x00.\x00s\x00v\x00g\
|
||||
\x00\x0a\
|
||||
\x0a\xc8\xf6\x87\
|
||||
\x00f\
|
||||
\x00o\x00l\x00d\x00e\x00r\x00.\x00s\x00v\x00g\
|
||||
\x00\x10\
|
||||
\x0e\x17\x06\x87\
|
||||
\x00c\
|
||||
\x00h\x00e\x00v\x00r\x00o\x00n\x00-\x00d\x00o\x00w\x00n\x00.\x00s\x00v\x00g\
|
||||
\x00\x0c\
|
||||
\x0b\xdf,\xc7\
|
||||
\x00s\
|
||||
\x00e\x00t\x00t\x00i\x00n\x00g\x00s\x00.\x00s\x00v\x00g\
|
||||
\x00\x0f\
|
||||
\x02\xe3G'\
|
||||
\x00p\
|
||||
\x00l\x00u\x00s\x00-\x00c\x00i\x00r\x00c\x00l\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x0b\
|
||||
\x06!\xeeG\
|
||||
\x00l\
|
||||
\x00o\x00g\x00-\x00o\x00u\x00t\x00.\x00s\x00v\x00g\
|
||||
\x00\x10\
|
||||
\x0d\xfd\xe1'\
|
||||
\x00c\
|
||||
\x00h\x00e\x00c\x00k\x00-\x00c\x00i\x00r\x00c\x00l\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x08\
|
||||
\x04\xd2T\xc7\
|
||||
\x00i\
|
||||
\x00n\x00f\x00o\x00.\x00s\x00v\x00g\
|
||||
\x00\x0e\
|
||||
\x09Xl\x87\
|
||||
\x00c\
|
||||
\x00h\x00e\x00v\x00r\x00o\x00n\x00-\x00u\x00p\x00.\x00s\x00v\x00g\
|
||||
\x00\x0d\
|
||||
\x06\xf2R'\
|
||||
\x00f\
|
||||
\x00i\x00l\x00e\x00-\x00t\x00e\x00x\x00t\x00.\x00s\x00v\x00g\
|
||||
\x00\x0d\
|
||||
\x09\xc3S\x87\
|
||||
\x00f\
|
||||
\x00i\x00l\x00e\x00-\x00p\x00l\x00u\x00s\x00.\x00s\x00v\x00g\
|
||||
\x00\x08\
|
||||
\x05\xa8W\x87\
|
||||
\x00c\
|
||||
\x00o\x00d\x00e\x00.\x00s\x00v\x00g\
|
||||
\x00\x0b\
|
||||
\x0b\xf2K\xe7\
|
||||
\x00t\
|
||||
\x00r\x00a\x00s\x00h\x00-\x002\x00.\x00s\x00v\x00g\
|
||||
\x00\x0e\
|
||||
\x04|qG\
|
||||
\x00g\
|
||||
\x00i\x00t\x00-\x00b\x00r\x00a\x00n\x00c\x00h\x00.\x00s\x00v\x00g\
|
||||
"
|
||||
|
||||
qt_resource_struct = b"\
|
||||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
|
||||
\x00\x00\x00\x00\x00\x00\x00\x00\
|
||||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x14\x00\x00\x00\x02\
|
||||
\x00\x00\x00\x00\x00\x00\x00\x00\
|
||||
\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x06\xa5\
|
||||
\x00\x00\x01\x9ey\x0c6\xfa\
|
||||
\x00\x00\x01L\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xe4\
|
||||
\x00\x00\x01\x9ey\x0c3\x89\
|
||||
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
|
||||
\x00\x00\x01\x9ey\x0c4\x94\
|
||||
\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x07\xcd\
|
||||
\x00\x00\x01\x9ey\x0c2\xb4\
|
||||
\x00\x00\x02\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x0c\
|
||||
\x00\x00\x01\x9ey\x0c:\x95\
|
||||
\x00\x00\x00v\x00\x00\x00\x00\x00\x01\x00\x00\x04\x1e\
|
||||
\x00\x00\x01\x9ey\x0cB\x90\
|
||||
\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x12c\
|
||||
\x00\x00\x01\x9ey\x0c9c\
|
||||
\x00\x00\x02*\x00\x00\x00\x00\x00\x01\x00\x00\x17~\
|
||||
\x00\x00\x01\x9ey\x0c<\x93\
|
||||
\x00\x00\x01p\x00\x00\x00\x00\x00\x01\x00\x00\x10\x0f\
|
||||
\x00\x00\x01\x9ey\x0c.\xf3\
|
||||
\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x00\x05B\
|
||||
\x00\x00\x01\x9ey\x0c-\x81\
|
||||
\x00\x00\x01\xea\x00\x00\x00\x00\x00\x01\x00\x00\x14t\
|
||||
\x00\x00\x01\x9ey\x0c;i\
|
||||
\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x13\x91\
|
||||
\x00\x00\x01\x9ey\x0c>\xf8\
|
||||
\x00\x00\x02\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x16\x09\
|
||||
\x00\x00\x01\x9ey\x0cA`\
|
||||
\x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x00\x09$\
|
||||
\x00\x00\x01\x9ey\x0c1c\
|
||||
\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x00\x03\x16\
|
||||
\x00\x00\x01\x9ey\x0c5\xc9\
|
||||
\x00\x00\x01.\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x1c\
|
||||
\x00\x00\x01\x9ey\x0c00\
|
||||
\x00\x00\x02@\x00\x00\x00\x00\x00\x01\x00\x00\x18\x84\
|
||||
\x00\x00\x01\x9ey\x0c?\xdf\
|
||||
\x00\x00\x006\x00\x00\x00\x00\x00\x01\x00\x00\x01\x05\
|
||||
\x00\x00\x01\x9ey\x0cC\xc7\
|
||||
\x00\x00\x01\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x11L\
|
||||
\x00\x00\x01\x9ey\x0c8.\
|
||||
\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x0a:\
|
||||
\x00\x00\x01\x9ey\x0c=\xc8\
|
||||
"
|
||||
|
||||
def qInitResources():
|
||||
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||||
|
||||
def qCleanupResources():
|
||||
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||||
|
||||
qInitResources()
|
||||
@@ -1,6 +1,7 @@
|
||||
from PySide6.QtWidgets import QDialog, QTableWidgetItem, QHeaderView, QAbstractItemView
|
||||
from PySide6.QtCore import Qt
|
||||
from pathlib import Path
|
||||
from icons import icon
|
||||
|
||||
from ui.AppSettings_ui import Ui_Dialog
|
||||
from ui.JavaVmConfigDialog import JavaVmConfigDialog
|
||||
@@ -36,11 +37,21 @@ class AppSettingsDlg(QDialog):
|
||||
self.temp_pdf_projects = self.settings.pdf_projects.copy()
|
||||
self.temp_postgresql_dbs = self.settings.postgresql_dbs.copy()
|
||||
|
||||
self._setup_icons()
|
||||
self._connect_signals()
|
||||
self._setup_tables()
|
||||
self._populate_tables()
|
||||
self._populate_performance_tab()
|
||||
|
||||
def _setup_icons(self):
|
||||
"""Setzt Feather Icons für alle Hinzufügen/Entfernen-Buttons."""
|
||||
add = icon("plus-circle")
|
||||
remove = icon("minus-circle")
|
||||
for btn_name in ("addXsl", "addJavaVm", "addSaxon", "addApacheFop", "addDiffPdf", "addPostgreSql", "addProject"):
|
||||
getattr(self.ui, btn_name).setIcon(add)
|
||||
for btn_name in ("removeXsl", "removeJavaVm", "removeSaxon", "removeApacheFop", "removeDiffPdf", "removePostgreSql", "removeProject"):
|
||||
getattr(self.ui, btn_name).setIcon(remove)
|
||||
|
||||
# --- Generische Helfer ---
|
||||
|
||||
def _update_remove_button(self, table, button):
|
||||
|
||||
@@ -25,6 +25,7 @@ from ui.mixins import (
|
||||
TransformationMixin,
|
||||
)
|
||||
from conf import app_settings, Project, ProjectData, TreeNode, XslFile
|
||||
from icons import icon
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@@ -140,9 +141,27 @@ class MainWindow(
|
||||
# Zoom per Mausrad (STRG+Mausrad) für PDF-Viewer aktivieren
|
||||
self._setup_scroll_area_zoom()
|
||||
|
||||
# Icons setzen (überschreibt fromTheme()-Icons aus _ui.py)
|
||||
self._setup_icons()
|
||||
|
||||
# Gespeicherte UI-Zustände wiederherstellen
|
||||
self._restore_ui_state()
|
||||
|
||||
def _setup_icons(self):
|
||||
"""Setzt Feather Icons für alle Menü-Aktionen und Buttons."""
|
||||
self.ui.actionNeu.setIcon(icon("folder-plus"))
|
||||
self.ui.actionBeenden.setIcon(icon("log-out"))
|
||||
self.ui.actionEinstellungen.setIcon(icon("settings"))
|
||||
self.ui.actionVorhandene_Projekte.setIcon(icon("folder"))
|
||||
self.ui.actionAlle_XML_Dateien_neu_transformieren_force.setIcon(icon("refresh-cw"))
|
||||
self.ui.view_ref_pdf.setIcon(icon("file"))
|
||||
self.ui.view_new_pdf.setIcon(icon("file"))
|
||||
self.ui.accept_changes.setIcon(icon("check-circle"))
|
||||
if hasattr(self, "action_xsl_dependencies"):
|
||||
self.action_xsl_dependencies.setIcon(icon("git-branch"))
|
||||
if hasattr(self, "action_info"):
|
||||
self.action_info.setIcon(icon("info"))
|
||||
|
||||
def _restore_ui_state(self):
|
||||
"""Stellt die gespeicherten UI-Zustände wieder her (Fenstergeometrie, Splitter, TreeWidget-Spalten)."""
|
||||
global app_settings
|
||||
@@ -339,6 +358,9 @@ class MainWindow(
|
||||
logger.info(f"Theme erfolgreich gewechselt zu: {theme_name}")
|
||||
app_settings.theme = theme_name
|
||||
app_settings.save()
|
||||
self._setup_icons()
|
||||
if hasattr(self, "pdf_project") and self.pdf_project:
|
||||
self._load_nodes_to_tree()
|
||||
else:
|
||||
logger.error(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden")
|
||||
|
||||
@@ -385,10 +407,7 @@ class MainWindow(
|
||||
self.ui.menuProjekt.addAction(self.action_worker_metrics)
|
||||
|
||||
# Menü-Aktion "Abhängigkeitsgraph" zum Aktion-Menü hinzufügen
|
||||
from PySide6.QtGui import QIcon as _QIcon
|
||||
|
||||
self.action_xsl_dependencies = QAction("XSL-Abhängigkeitsgraph", self)
|
||||
self.action_xsl_dependencies.setIcon(_QIcon(_QIcon.fromTheme("view-list-tree")))
|
||||
self.action_xsl_dependencies.triggered.connect(self._show_xsl_dependency_dialog)
|
||||
self.ui.menuAktion.addSeparator()
|
||||
self.ui.menuAktion.addAction(self.action_xsl_dependencies)
|
||||
@@ -406,7 +425,6 @@ class MainWindow(
|
||||
# Hilfe-Menü programmatisch erstellen
|
||||
self.menu_hilfe = QMenu("Hilfe", self)
|
||||
self.action_info = QAction("Info ...", self)
|
||||
self.action_info.setIcon(_QIcon(_QIcon.fromTheme("help-about")))
|
||||
self.action_info.triggered.connect(self._show_about_dialog)
|
||||
self.menu_hilfe.addAction(self.action_info)
|
||||
self.ui.menubar.addMenu(self.menu_hilfe)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from PySide6.QtWidgets import QDialog, QTableWidgetItem
|
||||
from ui.ProjectXsltParamsDialog_ui import Ui_ProjectXsltParamsDialog
|
||||
from icons import icon
|
||||
|
||||
|
||||
class ProjectXsltParamsDialog(QDialog):
|
||||
@@ -11,6 +12,9 @@ class ProjectXsltParamsDialog(QDialog):
|
||||
self.ui = Ui_ProjectXsltParamsDialog()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
self.ui.addParamButton.setIcon(icon("plus-circle"))
|
||||
self.ui.removeParamButton.setIcon(icon("minus-circle"))
|
||||
|
||||
self.ui.addParamButton.clicked.connect(self._add_parameter)
|
||||
self.ui.removeParamButton.clicked.connect(self._remove_parameter)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
from PySide6.QtCore import QUrl, Qt
|
||||
from PySide6.QtGui import QIcon
|
||||
from icons import icon
|
||||
from PySide6.QtWidgets import (
|
||||
QComboBox,
|
||||
QDialog,
|
||||
@@ -154,6 +154,7 @@ class XslDependencyDialog(QDialog):
|
||||
# Sidebar initial ausblenden
|
||||
self.ui.sidebarWidget.setVisible(False)
|
||||
self.ui.mainSplitter.setSizes([1000, 0])
|
||||
self.ui.settingsButton.setIcon(icon("sliders"))
|
||||
self.ui.settingsButton.clicked.connect(self._toggle_sidebar)
|
||||
|
||||
# Netzwerkgraph-Tab ausblenden wenn WebEngine nicht verfügbar
|
||||
@@ -220,7 +221,7 @@ class XslDependencyDialog(QDialog):
|
||||
"""Befüllt den Dateibaum mit allen XSL-Dateien und Abhängigkeitszahlen."""
|
||||
self.ui.fileTree.clear()
|
||||
|
||||
xsl_icon = QIcon.fromTheme("text-x-generic")
|
||||
xsl_icon = icon("file-text")
|
||||
|
||||
for xsl_file in sorted(self._full_graph.keys(), key=lambda p: self._rel_path(p).lower()):
|
||||
deps_count = len(self._full_graph.get(xsl_file, set()))
|
||||
@@ -260,8 +261,8 @@ class XslDependencyDialog(QDialog):
|
||||
rel_name = self._rel_path(xsl_file)
|
||||
self.ui.rightLabel.setText(f"Abhängigkeiten: {rel_name}")
|
||||
|
||||
import_icon = QIcon.fromTheme("go-down")
|
||||
imported_by_icon = QIcon.fromTheme("go-up")
|
||||
import_icon = icon("chevron-down")
|
||||
imported_by_icon = icon("chevron-up")
|
||||
|
||||
# Sektion: "Importiert" (forward dependencies)
|
||||
deps = self._full_graph.get(xsl_file, set())
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from PySide6.QtWidgets import QDialog, QTableWidgetItem, QMessageBox
|
||||
from PySide6.QtCore import Qt
|
||||
from icons import icon
|
||||
|
||||
|
||||
class XsltParamsEditDialog(QDialog):
|
||||
@@ -14,6 +15,9 @@ class XsltParamsEditDialog(QDialog):
|
||||
self.node = node
|
||||
self.parent_params = parent_params or {}
|
||||
|
||||
self.ui.addParamButton.setIcon(icon("plus-circle"))
|
||||
self.ui.removeParamButton.setIcon(icon("minus-circle"))
|
||||
|
||||
self.ui.addParamButton.clicked.connect(self.add_parameter)
|
||||
self.ui.removeParamButton.clicked.connect(self.remove_parameter)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ from enum import Enum, auto
|
||||
from pathlib import Path
|
||||
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtGui import QAction, QIcon
|
||||
from PySide6.QtGui import QAction
|
||||
from PySide6.QtWidgets import (
|
||||
QMenu,
|
||||
QTreeWidgetItem,
|
||||
@@ -28,6 +28,7 @@ from PySide6.QtWidgets import (
|
||||
)
|
||||
|
||||
from conf import TreeNode, XslFile, XmlFile
|
||||
from icons import icon
|
||||
from ui.TreeNodeEditDialog import TreeNodeEditDialog
|
||||
from ui.XslFileEditDialog import XslFileEditDialog
|
||||
from ui.XmlToXslAssignDialog import XmlToXslAssignDialog
|
||||
@@ -319,7 +320,7 @@ class TreeManagerMixin:
|
||||
if node_type == ItemType.TREE_NODE:
|
||||
# Kontextmenü für TreeNode
|
||||
action_edit = QAction("Bearbeiten", self)
|
||||
action_edit.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentProperties)))
|
||||
action_edit.setIcon(icon("settings"))
|
||||
action_edit.triggered.connect(lambda: self._edit_tree_node(item))
|
||||
font = action_edit.font()
|
||||
font.setBold(True)
|
||||
@@ -330,12 +331,12 @@ class TreeManagerMixin:
|
||||
menu.addSeparator()
|
||||
|
||||
action_add_child = QAction("Unterknoten hinzufügen", self)
|
||||
action_add_child.setIcon(QIcon(QIcon.fromTheme("folder-new")))
|
||||
action_add_child.setIcon(icon("folder-plus"))
|
||||
action_add_child.triggered.connect(lambda: self._add_tree_node_child(item))
|
||||
menu.addAction(action_add_child)
|
||||
|
||||
action_add_xsl = QAction("XSL-Datei hinzufügen", self)
|
||||
action_add_xsl.setIcon(QIcon(QIcon.fromTheme("document-new")))
|
||||
action_add_xsl.setIcon(icon("file-plus"))
|
||||
action_add_xsl.triggered.connect(lambda: self._add_xsl_file_to_node(item))
|
||||
menu.addAction(action_add_xsl)
|
||||
|
||||
@@ -346,13 +347,13 @@ class TreeManagerMixin:
|
||||
has_xml_files = bool(tree_node_obj and self._has_xml_files_recursive(tree_node_obj))
|
||||
|
||||
action_transform = QAction("Alle XML-Dateien transformieren", self)
|
||||
action_transform.setIcon(QIcon(QIcon.fromTheme("system-run")))
|
||||
action_transform.setIcon(icon("play-circle"))
|
||||
action_transform.triggered.connect(lambda: self._transform_tree_node(item))
|
||||
action_transform.setEnabled(has_xml_files)
|
||||
menu.addAction(action_transform)
|
||||
|
||||
action_transform_force = QAction("Alle XML-Dateien neu transformieren (force)", self)
|
||||
action_transform_force.setIcon(QIcon(QIcon.fromTheme("view-refresh")))
|
||||
action_transform_force.setIcon(icon("refresh-cw"))
|
||||
action_transform_force.triggered.connect(lambda: self._transform_tree_node(item, force=True))
|
||||
action_transform_force.setEnabled(has_xml_files)
|
||||
menu.addAction(action_transform_force)
|
||||
@@ -364,7 +365,7 @@ class TreeManagerMixin:
|
||||
has_diff_pdfs = len(diff_pdfs) > 0
|
||||
|
||||
action_accept_all = QAction("Alle Änderungen übernehmen", self)
|
||||
action_accept_all.setIcon(QIcon(QIcon.fromTheme("emblem-default")))
|
||||
action_accept_all.setIcon(icon("check-circle"))
|
||||
action_accept_all.triggered.connect(lambda: self._accept_all_changes_under_node(item))
|
||||
action_accept_all.setEnabled(has_diff_pdfs)
|
||||
menu.addAction(action_accept_all)
|
||||
@@ -372,14 +373,14 @@ class TreeManagerMixin:
|
||||
menu.addSeparator()
|
||||
|
||||
action_delete = QAction("Löschen", self)
|
||||
action_delete.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.EditDelete)))
|
||||
action_delete.setIcon(icon("trash-2"))
|
||||
action_delete.triggered.connect(lambda: self._delete_tree_node(item))
|
||||
menu.addAction(action_delete)
|
||||
|
||||
elif node_type == ItemType.XSL_FILE:
|
||||
# Kontextmenü für XslFile
|
||||
action_edit = QAction("Bearbeiten", self)
|
||||
action_edit.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentProperties)))
|
||||
action_edit.setIcon(icon("settings"))
|
||||
action_edit.triggered.connect(lambda: self._edit_xsl_file(item))
|
||||
font = action_edit.font()
|
||||
font.setBold(True)
|
||||
@@ -390,7 +391,7 @@ class TreeManagerMixin:
|
||||
menu.addSeparator()
|
||||
|
||||
action_add_xml = QAction("XML-Datei hinzufügen", self)
|
||||
action_add_xml.setIcon(QIcon(QIcon.fromTheme("document-new")))
|
||||
action_add_xml.setIcon(icon("file-plus"))
|
||||
action_add_xml.triggered.connect(lambda: self._add_xml_file_to_xsl(item))
|
||||
menu.addAction(action_add_xml)
|
||||
|
||||
@@ -401,13 +402,13 @@ class TreeManagerMixin:
|
||||
has_xml_files = bool(xsl_file_obj and xsl_file_obj.xmls)
|
||||
|
||||
action_transform = QAction("Alle XML-Dateien transformieren", self)
|
||||
action_transform.setIcon(QIcon(QIcon.fromTheme("system-run")))
|
||||
action_transform.setIcon(icon("play-circle"))
|
||||
action_transform.triggered.connect(lambda: self._transform_xsl_file(item))
|
||||
action_transform.setEnabled(has_xml_files)
|
||||
menu.addAction(action_transform)
|
||||
|
||||
action_transform_force = QAction("Alle XML-Dateien neu transformieren (force)", self)
|
||||
action_transform_force.setIcon(QIcon(QIcon.fromTheme("view-refresh")))
|
||||
action_transform_force.setIcon(icon("refresh-cw"))
|
||||
action_transform_force.triggered.connect(lambda: self._transform_xsl_file(item, force=True))
|
||||
action_transform_force.setEnabled(has_xml_files)
|
||||
menu.addAction(action_transform_force)
|
||||
@@ -419,7 +420,7 @@ class TreeManagerMixin:
|
||||
has_diff_pdfs = len(diff_pdfs) > 0
|
||||
|
||||
action_accept_all = QAction("Alle Änderungen übernehmen", self)
|
||||
action_accept_all.setIcon(QIcon(QIcon.fromTheme("emblem-default")))
|
||||
action_accept_all.setIcon(icon("check-circle"))
|
||||
action_accept_all.triggered.connect(lambda: self._accept_all_changes_under_node(item))
|
||||
action_accept_all.setEnabled(has_diff_pdfs)
|
||||
menu.addAction(action_accept_all)
|
||||
@@ -427,21 +428,21 @@ class TreeManagerMixin:
|
||||
menu.addSeparator()
|
||||
|
||||
action_deps = QAction("Abhängigkeiten anzeigen", self)
|
||||
action_deps.setIcon(QIcon(QIcon.fromTheme("view-list-tree")))
|
||||
action_deps.setIcon(icon("git-branch"))
|
||||
action_deps.triggered.connect(lambda: self._show_xsl_dependencies(item))
|
||||
menu.addAction(action_deps)
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
action_delete = QAction("Löschen", self)
|
||||
action_delete.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.EditDelete)))
|
||||
action_delete.setIcon(icon("trash-2"))
|
||||
action_delete.triggered.connect(lambda: self._delete_xsl_file(item))
|
||||
menu.addAction(action_delete)
|
||||
|
||||
elif node_type == ItemType.XML_FILE:
|
||||
# Kontextmenü für XmlFile
|
||||
action_edit = QAction("Bearbeiten", self)
|
||||
action_edit.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentProperties)))
|
||||
action_edit.setIcon(icon("settings"))
|
||||
action_edit.triggered.connect(lambda: self._edit_xml_file(item))
|
||||
font = action_edit.font()
|
||||
font.setBold(True)
|
||||
@@ -453,26 +454,26 @@ class TreeManagerMixin:
|
||||
|
||||
# Transformations-Aktionen
|
||||
action_transform = QAction("Transformieren", self)
|
||||
action_transform.setIcon(QIcon(QIcon.fromTheme("system-run")))
|
||||
action_transform.setIcon(icon("play-circle"))
|
||||
action_transform.triggered.connect(lambda: self._transform_xml_file(item))
|
||||
menu.addAction(action_transform)
|
||||
|
||||
action_transform_force = QAction("Neu transformieren (force)", self)
|
||||
action_transform_force.setIcon(QIcon(QIcon.fromTheme("view-refresh")))
|
||||
action_transform_force.setIcon(icon("refresh-cw"))
|
||||
action_transform_force.triggered.connect(lambda: self._transform_xml_file(item, force=True))
|
||||
menu.addAction(action_transform_force)
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
action_delete = QAction("Löschen", self)
|
||||
action_delete.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.EditDelete)))
|
||||
action_delete.setIcon(icon("trash-2"))
|
||||
action_delete.triggered.connect(lambda: self._delete_xml_file(item))
|
||||
menu.addAction(action_delete)
|
||||
|
||||
else:
|
||||
# Unbekannter Typ oder leerer Bereich - Menü für Root-Elemente
|
||||
action_add_tree_node = QAction("Unterknoten hinzufügen", self)
|
||||
action_add_tree_node.setIcon(QIcon(QIcon.fromTheme("folder-new")))
|
||||
action_add_tree_node.setIcon(icon("folder-plus"))
|
||||
action_add_tree_node.triggered.connect(lambda: self._add_root_tree_node())
|
||||
menu.addAction(action_add_tree_node)
|
||||
|
||||
@@ -656,17 +657,9 @@ class TreeManagerMixin:
|
||||
|
||||
# Setze Icon basierend auf Node-Typ
|
||||
if isinstance(node, TreeNode):
|
||||
# TreeNode: Ordner-Icon
|
||||
folder_icon = QIcon.fromTheme(QIcon.ThemeIcon.FolderOpen)
|
||||
if folder_icon.isNull():
|
||||
folder_icon = QIcon.fromTheme("folder")
|
||||
item.setIcon(0, folder_icon)
|
||||
item.setIcon(0, icon("folder"))
|
||||
elif isinstance(node, XslFile):
|
||||
# XslFile: Code/Script-Icon für XSL-Dateien
|
||||
xsl_icon = QIcon.fromTheme("text-x-script")
|
||||
if xsl_icon.isNull():
|
||||
xsl_icon = QIcon.fromTheme("text-x-generic")
|
||||
item.setIcon(0, xsl_icon)
|
||||
item.setIcon(0, icon("file-text"))
|
||||
|
||||
if isinstance(node, TreeNode):
|
||||
# Speichere zusätzlich die Node-ID in UserRole+1 für Kompatibilität
|
||||
@@ -729,12 +722,7 @@ class TreeManagerMixin:
|
||||
xml_item.setData(0, Qt.ItemDataRole.UserRole + 2, xsl_id_str)
|
||||
|
||||
# Setze XML-Icon
|
||||
xml_icon = QIcon.fromTheme("text-xml")
|
||||
if xml_icon.isNull():
|
||||
xml_icon = QIcon.fromTheme("application-xml")
|
||||
if xml_icon.isNull():
|
||||
xml_icon = QIcon.fromTheme("text-x-generic")
|
||||
xml_item.setIcon(0, xml_icon)
|
||||
xml_item.setIcon(0, icon("code"))
|
||||
|
||||
# Prüfe ob XML-Datei existiert und deaktiviere Knoten falls nicht
|
||||
# Wenn XSL-Datei fehlt, deaktiviere auch alle untergeordneten XML-Knoten
|
||||
@@ -812,13 +800,7 @@ class TreeManagerMixin:
|
||||
|
||||
# Icon-Label
|
||||
icon_label = QLabel()
|
||||
# Icon für Diff-View mit Fallbacks
|
||||
icon = QIcon.fromTheme("view-split-left-right")
|
||||
if icon.isNull():
|
||||
icon = QIcon.fromTheme("vcs-diff")
|
||||
if icon.isNull():
|
||||
icon = QIcon.fromTheme("system-search") # Letzter Fallback
|
||||
icon_label.setPixmap(icon.pixmap(16, 16))
|
||||
icon_label.setPixmap(icon("columns").pixmap(16, 16))
|
||||
icon_label.setToolTip("Diff-PDF vorhanden (wird automatisch geladen bei Selektion)")
|
||||
|
||||
layout.addWidget(icon_label)
|
||||
|
||||