UI updates

This commit is contained in:
Ayzen
2026-04-01 20:21:16 +03:00
parent 4abc95c372
commit 669205d8f8
43 changed files with 2055 additions and 973 deletions
@@ -0,0 +1,52 @@
"""Persistent session-state helpers for GUI-only runtime preferences."""
from __future__ import annotations
from dataclasses import dataclass
import json
from pathlib import Path
@dataclass(slots=True)
class GuiSessionState:
"""Small persisted GUI session state."""
last_profile_path: str = ""
class GuiSessionStateStore:
"""Atomic JSON store for GUI session-state file."""
def __init__(self, path: Path) -> None:
"""Create store targeting `path`."""
self._path = path
self._path.parent.mkdir(parents=True, exist_ok=True)
@property
def path(self) -> Path:
"""Return backing session-state file path."""
return self._path
def load(self) -> GuiSessionState:
"""Load session-state from disk or return empty defaults when missing."""
if not self._path.exists():
return GuiSessionState()
payload = json.loads(self._path.read_text(encoding="utf-8"))
if not isinstance(payload, dict):
raise ValueError(f"GUI session-state root must be JSON object: {self._path}")
raw_path = payload.get("last_profile_path", "")
if not isinstance(raw_path, str):
raise ValueError("GUI session-state `last_profile_path` must be a string")
return GuiSessionState(last_profile_path=raw_path)
def write(self, state: GuiSessionState) -> Path:
"""Atomically write session-state JSON file."""
temp_path = self._path.with_suffix(self._path.suffix + ".tmp")
temp_path.write_text(
json.dumps({"last_profile_path": state.last_profile_path}, indent=2),
encoding="utf-8",
)
temp_path.replace(self._path)
return self._path