133 Zeilen
5.0 KiB
Python
133 Zeilen
5.0 KiB
Python
"""
|
|
Theme Manager - Verwaltet das Erscheinungsbild der Anwendung (nur Light Mode)
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
import logging
|
|
from typing import Dict, Any, Optional
|
|
from PyQt5.QtWidgets import QApplication
|
|
from PyQt5.QtGui import QPalette, QColor
|
|
from PyQt5.QtCore import Qt, QSettings
|
|
|
|
logger = logging.getLogger("theme_manager")
|
|
|
|
class ThemeManager:
|
|
"""
|
|
Verwaltet das Erscheinungsbild der Anwendung.
|
|
"""
|
|
|
|
# Themennamen
|
|
LIGHT_THEME = "light"
|
|
|
|
def __init__(self, app: QApplication):
|
|
"""
|
|
Initialisiert den ThemeManager.
|
|
|
|
Args:
|
|
app: Die QApplication-Instanz
|
|
"""
|
|
self.app = app
|
|
self.settings = QSettings("Chimaira", "SocialMediaAccountGenerator")
|
|
self.current_theme = self.LIGHT_THEME
|
|
|
|
# Basisverzeichnis ermitteln
|
|
self.base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
# Stelle sicher, dass die Verzeichnisse existieren
|
|
os.makedirs(os.path.join(self.base_dir, "resources", "themes"), exist_ok=True)
|
|
os.makedirs(os.path.join(self.base_dir, "resources", "icons"), exist_ok=True)
|
|
|
|
# Lade QSS-Dateien für Themes
|
|
self.theme_stylesheets = {
|
|
self.LIGHT_THEME: self._load_stylesheet("light.qss")
|
|
}
|
|
|
|
# Wende das Light Theme an
|
|
self.apply_theme(self.LIGHT_THEME)
|
|
|
|
logger.info(f"ThemeManager initialisiert mit Theme: {self.current_theme}")
|
|
|
|
def _load_stylesheet(self, filename: str) -> str:
|
|
"""Lädt ein QSS-Stylesheet aus einer Datei."""
|
|
try:
|
|
stylesheet_path = os.path.join(self.base_dir, "resources", "themes", filename)
|
|
if os.path.exists(stylesheet_path):
|
|
with open(stylesheet_path, 'r', encoding='utf-8') as f:
|
|
return f.read()
|
|
else:
|
|
logger.warning(f"Stylesheet-Datei nicht gefunden: {stylesheet_path}")
|
|
# Erzeuge eine leere Stylesheet-Datei, wenn sie nicht existiert
|
|
with open(stylesheet_path, 'w', encoding='utf-8') as f:
|
|
f.write("/* Auto-generated empty stylesheet */\n")
|
|
return ""
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Laden des Stylesheets {filename}: {e}")
|
|
return ""
|
|
|
|
def apply_theme(self, theme_name: str) -> bool:
|
|
"""
|
|
Wendet das Light Theme auf die Anwendung an.
|
|
|
|
Args:
|
|
theme_name: Wird ignoriert, immer Light Theme verwendet
|
|
|
|
Returns:
|
|
bool: True, wenn das Theme erfolgreich angewendet wurde, sonst False
|
|
"""
|
|
try:
|
|
# Palette für das Light Theme erstellen
|
|
palette = QPalette()
|
|
|
|
# Light Theme Palette
|
|
palette.setColor(QPalette.Window, QColor(240, 240, 240))
|
|
palette.setColor(QPalette.WindowText, Qt.black)
|
|
palette.setColor(QPalette.Base, Qt.white)
|
|
palette.setColor(QPalette.AlternateBase, QColor(245, 245, 245))
|
|
palette.setColor(QPalette.ToolTipBase, Qt.white)
|
|
palette.setColor(QPalette.ToolTipText, Qt.black)
|
|
palette.setColor(QPalette.Text, Qt.black)
|
|
palette.setColor(QPalette.Button, QColor(240, 240, 240))
|
|
palette.setColor(QPalette.ButtonText, Qt.black)
|
|
palette.setColor(QPalette.BrightText, Qt.red)
|
|
palette.setColor(QPalette.Link, QColor(0, 0, 255))
|
|
palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
|
|
palette.setColor(QPalette.HighlightedText, Qt.white)
|
|
|
|
# Palette auf die Anwendung anwenden
|
|
self.app.setPalette(palette)
|
|
|
|
# Stylesheet anwenden
|
|
self.app.setStyleSheet(self.theme_stylesheets.get(self.LIGHT_THEME, ""))
|
|
|
|
# Aktuelles Theme speichern
|
|
self.current_theme = self.LIGHT_THEME
|
|
self.settings.setValue("theme", self.LIGHT_THEME)
|
|
|
|
logger.info(f"Theme '{self.LIGHT_THEME}' erfolgreich angewendet")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Anwenden des Themes '{self.LIGHT_THEME}': {e}")
|
|
return False
|
|
|
|
def get_current_theme(self) -> str:
|
|
"""Gibt den Namen des aktuellen Themes zurück."""
|
|
return self.LIGHT_THEME
|
|
|
|
def get_icon_path(self, icon_name: str) -> str:
|
|
"""
|
|
Gibt den Pfad zum Icon zurück.
|
|
|
|
Args:
|
|
icon_name: Name des Icons (ohne Dateierweiterung)
|
|
|
|
Returns:
|
|
str: Pfad zum Icon
|
|
"""
|
|
# Social Media Icons bleiben unverändert (immer farbig)
|
|
if icon_name in ["instagram", "facebook", "twitter", "tiktok", "vk"]:
|
|
return os.path.join(self.base_dir, "resources", "icons", f"{icon_name}.svg")
|
|
|
|
# Für andere Icons, die möglicherweise Theme-spezifisch sind
|
|
return os.path.join(self.base_dir, "resources", "icons", f"{icon_name}.svg") |