from __future__ import annotations import logging from PySide6.QtCore import QSettings class ApplicationSettings: """Typed access to persistent BEdit application settings.""" LOG_LEVEL_KEY = "logging/level" DEFAULT_LOG_LEVEL = logging.INFO SNAP_TO_GRID_SIZE_KEY = "graph/snap_to_grid_size" DEFAULT_SNAP_TO_GRID_SIZE = 4 LIBRARY_PATHS_KEY = "libraries/paths" def __init__(self, settings: QSettings | None = None) -> None: self._settings = settings if settings is not None else QSettings() @property def log_level(self) -> int: return self._settings.value( self.LOG_LEVEL_KEY, self.DEFAULT_LOG_LEVEL, type=int, ) @log_level.setter def log_level(self, level: int) -> None: self._settings.setValue(self.LOG_LEVEL_KEY, level) @property def snap_to_grid_size(self) -> int: return max(1, self._settings.value(self.SNAP_TO_GRID_SIZE_KEY, self.DEFAULT_SNAP_TO_GRID_SIZE, type=int)) @snap_to_grid_size.setter def snap_to_grid_size(self, size: int) -> None: if size < 1: raise ValueError("snap-to-grid size must be positive") self._settings.setValue(self.SNAP_TO_GRID_SIZE_KEY, size) @property def library_paths(self) -> list[str]: value = self._settings.value(self.LIBRARY_PATHS_KEY, []) if isinstance(value, str): return [value] return [str(path) for path in value] if isinstance(value, (list, tuple)) else [] @library_paths.setter def library_paths(self, paths: list[str]) -> None: self._settings.setValue(self.LIBRARY_PATHS_KEY, list(dict.fromkeys(paths))) class SimulationApplicationSettings: """Typed access to persistent BEsim application settings.""" LOG_LEVEL_KEY = "logging/level" DEFAULT_LOG_LEVEL = logging.INFO def __init__(self, settings: QSettings | None = None) -> None: self._settings = settings if settings is not None else QSettings() @property def log_level(self) -> int: return self._settings.value( self.LOG_LEVEL_KEY, self.DEFAULT_LOG_LEVEL, type=int, ) @log_level.setter def log_level(self, level: int) -> None: self._settings.setValue(self.LOG_LEVEL_KEY, level)