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