84 lines
2.9 KiB
Python
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")
|