PythonApplicationTemplate/app/core/settings_manager.py

65 lines
2.6 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)
with open(paths.resource_path("config.json"), '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 maximized
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_maximized(self) -> bool:
return self.settings.value("maximized", self.default_settings.get("maximized")) == "true"
def set_maximized(self, maximized: bool):
self.settings.setValue("maximized", maximized)