PythonApplicationTemplate/app/core/settings_manager.py
2025-07-11 14:33:17 +02:00

76 lines
3.2 KiB
Python

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)