"""Shared configuration constants for the application.""" from __future__ import annotations import contextlib from pathlib import Path from typing import Any, Callable try: # Python 3.11 and above import tomllib # type: ignore[attr-defined] except ModuleNotFoundError: # pragma: no cover - fallback for <3.11 with contextlib.suppress(ModuleNotFoundError): import tomli as tomllib # type: ignore[assignment] if "tomllib" not in globals(): tomllib = None # type: ignore[assignment] PREVIEW_MAX_SIZE = (900, 660) BASE_DIR = Path(__file__).resolve().parents[2] IMAGES_DIR = BASE_DIR / "images" CONFIG_FILE = BASE_DIR / "config.toml" _DEFAULTS_BASE = { "hue_min": 250.0, "hue_max": 310.0, "sat_min": 15.0, "val_min": 15.0, "val_max": 100.0, "alpha": 120, } _DEFAULT_TYPES: dict[str, Callable[[Any], Any]] = { "hue_min": float, "hue_max": float, "sat_min": float, "val_min": float, "val_max": float, "alpha": int, } def _load_default_overrides() -> dict[str, Any]: """Load default slider overrides from config.toml if available.""" if tomllib is None or not CONFIG_FILE.exists(): return {} decode_error = getattr(tomllib, "TOMLDecodeError", ValueError) # type: ignore[attr-defined] try: with CONFIG_FILE.open("rb") as handle: data = tomllib.load(handle) except (OSError, AttributeError, decode_error, TypeError): # type: ignore[arg-type] return {} settings = data.get("defaults") if not isinstance(settings, dict): return {} overrides: dict[str, Any] = {} for key, caster in _DEFAULT_TYPES.items(): if key not in settings: continue try: overrides[key] = caster(settings[key]) except (TypeError, ValueError): continue return overrides DEFAULTS = {**_DEFAULTS_BASE, **_load_default_overrides()}