from PyQt6.QtCore import QSettings from app.core.observer_manager import NotificationType from os import path import app.utils.paths as paths import json class SettingsManager: """ Gestion des paramètres utilisateurs avec sauvegarde persistante via QSettings. Notifie les changements via ObserverManager. """ def __init__(self, observer_manager, theme_manager): self.observer_manager = observer_manager self.theme_manager = theme_manager # Load default settings from JSON file defaults_path = path.join(paths.get_data_dir(), "others", "defaults_settings.json") with open(defaults_path, 'r', encoding='utf-8') as f: self.default_settings = json.load(f) config_path = path.join(paths.get_current_dir(), "config.json") with open(config_path, 'r', encoding='utf-8') as f: self.config = json.load(f) self.settings = QSettings(path.join(paths.get_user_data_dir(self.get_config("app_name")), self.get_config("app_name") + ".ini"), QSettings.Format.IniFormat) self.theme_manager.set_theme(self.get_theme()) # Config def get_config(self, key: str): return self.config.get(key, None) # Theme def get_theme(self) -> str: return self.settings.value("theme", self.default_settings.get("theme")) def set_theme(self, mode: str) -> None: if mode != self.get_theme(): self.settings.setValue("theme", mode) self.theme_manager.set_theme(mode) self.observer_manager.notify(NotificationType.THEME) # Language def get_language(self) -> str: return self.settings.value("lang", self.default_settings.get("lang")) def set_language(self, lang_code: str) -> None: if lang_code != self.get_language(): self.settings.setValue("lang", lang_code) self.observer_manager.notify(NotificationType.LANGUAGE) # Window size and fullscreen def get_window_size(self) -> dict: return self.settings.value("window_size", self.default_settings.get("window_size")) def set_window_size(self, width: int, height: int) -> None: current_size = self.get_window_size() if current_size["width"] != width or current_size["height"] != height: new_size = {"width": width, "height": height} self.settings.setValue("window_size", new_size) def get_fullscreen(self) -> bool: return self.settings.value("fullscreen", self.default_settings.get("fullscreen")) def set_fullscreen(self, fullscreen: bool, width: int, height: int): self.settings.setValue("fullscreen", fullscreen) self.settings.setValue("fullscreen_size", {"width": width, "height": height}) def get_fullscreen_size(self) -> dict: return self.settings.value("fullscreen_size", self.default_settings.get("fullscreen_size")) def set_fullscreen_size(self, width: int, height: int) -> None: current_size = self.get_fullscreen_size() if current_size["width"] != width or current_size["height"] != height: new_size = {"width": width, "height": height} self.settings.setValue("fullscreen_size", new_size)