sc-death-log/config.py
2025-05-25 17:51:29 +00:00

84 lines
2.9 KiB
Python

import tkinter as tk
import os
from pathlib import Path
import sqlite3
APP_NAME = "SC KF"
class PersistentConfig:
def __init__(self, db_path: Path):
self.table_name = "properties"
self.db = sqlite3.connect(
str(db_path), isolation_level=None, check_same_thread=False, autocommit=True
)
self.db.execute("pragma journal_mode=wal;")
self.db.execute(
f"create table if not exists {self.table_name} (key text primary key, value_str text, value_int int) strict;"
)
def set_int(self, key: str, value: int) -> None:
self.db.execute(
f"insert into {self.table_name} (key, value_int) values (:key, :value) on conflict (key) do update set value_int = :value;",
{"key": key, "value": value},
)
def get_int(self, key: str, default=None) -> int | None:
res = self.db.execute(
f"select value_int from {self.table_name} where key = ?;", (key,)
)
return next(iter(res), (default,))[0]
def set_str(self, key: str, value: str) -> None:
self.db.execute(
f"insert into {self.table_name} (key, value_str) values (:key, :value) on conflict (key) do update set value_str = :value;",
{"key": key, "value": value},
)
def get_str(self, key: str, default=None) -> str | None:
res = self.db.execute(
f"select value_str from {self.table_name} where key = ?;", (key,)
)
return next(iter(res), (default,))[0]
def set_bool(self, key: str, value: bool) -> None:
self.set_int(key, int(value))
def get_bool(self, key: str, default=None) -> bool | None:
return bool(self.get_int(key, default))
def get_tk_boolean(self, name: str, default: bool) -> tk.BooleanVar:
value = self.get_bool(name, default)
var = tk.BooleanVar(name=name, value=value)
var.trace_add("write", lambda a, b, c: self.set_bool(name, var.get()))
return var
def get_tk_str(self, name: str, default: str | None) -> tk.StringVar:
value = self.get_str(name, default)
var = tk.StringVar(name=name, value=value)
var.trace_add("write", lambda a, b, c: self.set_str(name, var.get()))
return var
def get_tk_int(self, name: str, default: int | None) -> tk.IntVar:
value = self.get_int(name, default)
var = tk.IntVar(name=name, value=value)
var.trace_add("write", lambda a, b, c: self.set_int(name, var.get()))
return var
def get_app_data_dir() -> Path:
if os.name == "nt":
directory = Path.home() / "AppData/Roaming/SCKF"
elif os.name == "posix":
directory = Path.home() / ".config/SCKF"
else:
raise RuntimeError(f"Unsupported os: {os.name}")
directory.mkdir(exist_ok=True, parents=True)
return directory
db = PersistentConfig(get_app_data_dir() / "config.sqlite")