From 6edbeba5d93569cd4f8f00670399c86909047bab Mon Sep 17 00:00:00 2001 From: Christian Kolset Date: Wed, 3 Jun 2026 12:53:35 -0600 Subject: Persist settings per-computer; add Reset to Defaults in General tab - New core/app_settings.py: load/save settings.json to platform config dir (Windows: %APPDATA%, Linux: ~/.config, macOS: ~/Library/Application Support) - MainWindow loads saved settings on startup, saves on every Apply & Close - Settings survive profile switches and app restarts independently of profiles - Settings > General: Reset to Defaults button with QMessageBox confirmation Co-Authored-By: Claude Sonnet 4.6 --- core/app_settings.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 core/app_settings.py (limited to 'core') diff --git a/core/app_settings.py b/core/app_settings.py new file mode 100644 index 0000000..e8bc7ae --- /dev/null +++ b/core/app_settings.py @@ -0,0 +1,53 @@ +""" +core/app_settings.py + +Platform-aware persistence for application settings. + +Stored independently of profiles so they survive profile switches and +reflect per-computer preferences (theme, font, paths, etc.). + +Locations: + Windows : %APPDATA%/labUI/settings.json + macOS : ~/Library/Application Support/labUI/settings.json + Linux : $XDG_CONFIG_HOME/labUI/settings.json (default ~/.config/labUI/) +""" + +import json +import os +import sys +from pathlib import Path + + +def _settings_path() -> Path: + if sys.platform == "win32": + base = Path(os.environ.get("APPDATA", Path.home())) + elif sys.platform == "darwin": + base = Path.home() / "Library" / "Application Support" + else: + base = Path(os.environ.get("XDG_CONFIG_HOME", Path.home() / ".config")) + return base / "labUI" / "settings.json" + + +SETTINGS_PATH = _settings_path() + + +def load_settings(defaults: dict) -> dict: + """Return defaults merged with any saved settings. Never raises.""" + cfg = dict(defaults) + try: + if SETTINGS_PATH.exists(): + with open(SETTINGS_PATH) as f: + cfg.update(json.load(f)) + except Exception: + pass + return cfg + + +def save_settings(cfg: dict) -> None: + """Persist cfg to disk. Never raises.""" + try: + SETTINGS_PATH.parent.mkdir(parents=True, exist_ok=True) + with open(SETTINGS_PATH, "w") as f: + json.dump(cfg, f, indent=2) + except Exception: + pass -- cgit v1.2.3