Files
AccountForger-neuerUpload/utils/theme_manager.py
Claude Project Manager 04585e95b6 Initial commit
2025-08-01 23:50:28 +02:00

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")