From 58e37da20ed56eef1863f259e17a819105ac33f2 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 10 Nov 2026 10:06:13 +0100 Subject: feat(deckit): settings page for deck-it, the tablet dashboard A page under Desktop for deck-it's ~/.config/deck-it/config.toml and its login line. deck-it now merges that file over its shipped config key by key, so the page writes only what differs and takes its placeholders from `deck-it defaults` rather than copying them. - Start at login edits hypr-theme's autostart.lua at once, as the Autostart page does, through Autostart.js: it re-enables a commented deck-it line or adds `deck-it wifi --wait`; off comments them out. - Every config key, with launchers picked from the installed apps (desktop ids, reorderable) and module switches built from the defaults. - A status line polls `deck-it status` every 2s while the page is open; Restart runs `deck-it stop` and the login command, then reports "Restarted" once the server runs with a tablet tunnelled, or what it saw after 30s. Shared helpers it needed: Toml.js reads plain decimals (the display scale), Store keeps a list of numbers numeric (the workspaces), and ChoiceSetting takes a store as Setting and BoolSetting already do. Co-Authored-By: Claude Opus 5.5 --- desktop/modules/sbbuilder/Store.qml | 4 +++- desktop/modules/sbbuilder/Toml.js | 4 ++-- desktop/modules/sbbuilder/test_toml.js | 4 ++++ 3 files changed, 9 insertions(+), 3 deletions(-) (limited to 'desktop/modules/sbbuilder') diff --git a/desktop/modules/sbbuilder/Store.qml b/desktop/modules/sbbuilder/Store.qml index 7036f36..e6e9b09 100644 --- a/desktop/modules/sbbuilder/Store.qml +++ b/desktop/modules/sbbuilder/Store.qml @@ -74,7 +74,9 @@ QtObject { if (section === "manifests" && t === "") return st.markInvalid(section + "/" + key, true); if (t === null || t === "") return st.put(section, key, null); const d = st.fallback(section, key); - st.put(section, key, Array.isArray(d) ? t.split(/\s+/).filter(x => x !== "") + const words = t.split(/\s+/).filter(x => x !== ""); + // A list of numbers stays one, deck-it's workspaces for one. + st.put(section, key, Array.isArray(d) ? (typeof d[0] === "number" ? words.map(Number) : words) : typeof d === "number" ? Number(t) : typeof d === "boolean" ? t === "true" : t); } diff --git a/desktop/modules/sbbuilder/Toml.js b/desktop/modules/sbbuilder/Toml.js index dddb6f7..eb29c88 100644 --- a/desktop/modules/sbbuilder/Toml.js +++ b/desktop/modules/sbbuilder/Toml.js @@ -17,7 +17,7 @@ // set again is activated. Top-level keys are section "". // // ponytail: the TOML these files use, one key per line: strings, integers, -// booleans, one-line arrays. A value with anything but a comment after it +// plain decimals, booleans, one-line arrays. A value with anything but a comment after it // (multi-line strings and arrays included) is refused: entries() skips it and // set() throws rather than write a duplicate key; such a file is edited by // hand. Also not recognised: CRLF line endings, `[ spaced ]` and `[[array]]` @@ -67,7 +67,7 @@ function val(s, i) { } return { v: out, i: i + 1 }; } - const m = /^(true|false|[+-]?[0-9][0-9_]*)(?=[\s#,\]]|$)/.exec(s.slice(i)); + const m = /^(true|false|[+-]?[0-9][0-9_]*(?:\.[0-9][0-9_]*)?)(?=[\s#,\]]|$)/.exec(s.slice(i)); if (!m) return null; const v = m[1] === "true" ? true : m[1] === "false" ? false : Number(m[1].replace(/_/g, "")); return { v: v, i: i + m[1].length }; diff --git a/desktop/modules/sbbuilder/test_toml.js b/desktop/modules/sbbuilder/test_toml.js index c86741d..7e62b4e 100644 --- a/desktop/modules/sbbuilder/test_toml.js +++ b/desktop/modules/sbbuilder/test_toml.js @@ -102,4 +102,8 @@ assert.deepStrictEqual(T.sections(file), ["manifests", "refresh"]); assert.deepStrictEqual(T.sections("a = 1\n[manifests]\n"), ["manifests"]); assert.deepStrictEqual(T.sections("a = 1\n"), []); +// Decimals: read, and rewritten in place (deck-it's display scale). +assert.strictEqual(T.get("[display]\nscale = 1.5 # hi\n", "display", "scale"), 1.5); +assert.strictEqual(T.set("[display]\nscale = 1.5 # hi\n", "display", "scale", 2), "[display]\nscale = 2 # hi\n"); + console.log("test_toml: ok"); -- cgit v1.2.3