Initial commit
Dieser Commit ist enthalten in:
133
utils/theme_manager.py
Normale Datei
133
utils/theme_manager.py
Normale Datei
@ -0,0 +1,133 @@
|
||||
"""
|
||||
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")
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren