(Init): Added shit

This commit is contained in:
2026-05-29 00:41:12 +00:00
commit 72005fd71d
52 changed files with 12875 additions and 0 deletions

149
nirimod/state.py Normal file
View File

@@ -0,0 +1,149 @@
from __future__ import annotations
from dataclasses import dataclass
from pathlib import Path
from typing import TYPE_CHECKING
from nirimod.kdl_parser import (
NIRI_CONFIG,
KdlNode,
load_niri_config_multi,
parse_kdl,
save_niri_config,
save_niri_config_multi,
write_kdl,
)
from nirimod.undo import UndoEntry, UndoManager
if TYPE_CHECKING:
pass
@dataclass
class RuntimeInfo:
niri_running: bool = False
has_touchpad: bool = False
class AppState:
def __init__(self) -> None:
self._nodes: list[KdlNode] = []
self._saved_kdl: str = ""
self._undo: UndoManager = UndoManager()
self._runtime: RuntimeInfo = RuntimeInfo()
self._dirty: bool = False
self._include_slots: list[tuple[KdlNode, Path]] = []
self._source_files: set[Path] = set()
def load(self) -> None:
from nirimod import niri_ipc
self._runtime = RuntimeInfo(
niri_running=niri_ipc.is_niri_running(),
has_touchpad=niri_ipc.has_touchpad(),
)
self._nodes, self._include_slots = load_niri_config_multi()
self._source_files = {NIRI_CONFIG}
for _, path in self._include_slots:
if path.exists():
self._source_files.add(path)
self._saved_kdl = write_kdl(self._nodes) if self._nodes else ""
self._dirty = False
@property
def nodes(self) -> list[KdlNode]:
return self._nodes
@nodes.setter
def nodes(self, value: list[KdlNode]) -> None:
self._nodes = value
@property
def saved_kdl(self) -> str:
return self._saved_kdl
@property
def source_files(self) -> set[Path]:
return self._source_files
@property
def include_slots(self) -> list[tuple[KdlNode, Path]]:
return self._include_slots
@property
def is_multi_file(self) -> bool:
return bool(self._include_slots)
@property
def niri_running(self) -> bool:
return self._runtime.niri_running
@property
def has_touchpad(self) -> bool:
return self._runtime.has_touchpad
@property
def is_dirty(self) -> bool:
return self._dirty
def mark_dirty(self) -> None:
self._dirty = True
def mark_clean(self) -> None:
self._dirty = False
@property
def undo(self) -> UndoManager:
return self._undo
def push_undo(self, description: str, before: str, after: str) -> None:
self._undo.push(UndoEntry(description, before, after))
def apply_undo(self) -> UndoEntry | None:
entry = self._undo.pop_undo()
if entry is None:
return None
self._nodes = parse_kdl(entry.snapshot_before)
self._dirty = entry.snapshot_before != self._saved_kdl
return entry
def apply_redo(self) -> UndoEntry | None:
entry = self._undo.pop_redo()
if entry is None:
return None
self._nodes = parse_kdl(entry.snapshot_after)
self._dirty = entry.snapshot_after != self._saved_kdl
return entry
def discard(self) -> None:
self._nodes = parse_kdl(self._saved_kdl) if self._saved_kdl else []
self._undo.clear()
self._dirty = False
def commit_save(self, new_kdl: str) -> None:
self._saved_kdl = new_kdl
self._undo.clear()
self._dirty = False
def reload_from_disk(self) -> None:
self._nodes, self._include_slots = load_niri_config_multi()
self._source_files = {NIRI_CONFIG}
for _, path in self._include_slots:
if path.exists():
self._source_files.add(path)
def write_current_kdl(self) -> str:
return write_kdl(self._nodes)
def write_to_path(self, path: Path | None = None) -> None:
if path is not None:
# Explicit path (e.g. validation temp file) — single file write
save_niri_config(self._nodes, path=path)
elif self._include_slots:
save_niri_config_multi(self._nodes, self._include_slots)
else:
save_niri_config(self._nodes)