From 7f1f37a809236520dd7630363dce905ef183cc99 Mon Sep 17 00:00:00 2001 From: christian Date: Thu, 8 Oct 2026 09:58:59 -0400 Subject: [PATCH] Make a tap on the page number key go to page 1 outright. The converted key's "startup" page resolves to the current page on surfaces set to "use last page", so a tap did nothing. The tap page is now nav_tap_page in config.json (1). Co-Authored-By: Claude Opus 5.5 --- README.md | 2 +- config.json | 1 + make_page.py | 13 ++++++++----- status-page.companionconfig | Bin 5125 -> 5122 bytes tests/test_status_panel.py | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bb91855..ef4a030 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Row 0 holds the group buttons. Each one shows the first problem in its group, pl The **page number key** on every page follows the ALL button. It's green when everything is fine, flashes red when something is wrong, and turns purple if the watchdog stops. UP and DOWN stay normal. Which keys follow ALL is `"nav_keys"` in `config.json` (`["pagenum"]`; add `"pageup"` / `"pagedown"` to colour those too). The coloured key is Companion's own key converted to a regular button (`nav_templates.json`). -- **Tap the page number:** go to the start page (page 1), as before. It now acts when you let go, not when you press. +- **Tap the page number:** go to page 1 (`"nav_tap_page"` in `config.json`). It acts when you let go, not when you press. - **Hold the page number for 1 second:** jump to the status page (page 19). The hold time is `"nav_hold_ms"` in `config.json`. - `python3 nav_keys.py` applies them to every page. Run it again after adding pages. diff --git a/config.json b/config.json index 98fbddd..0477f1e 100644 --- a/config.json +++ b/config.json @@ -4,6 +4,7 @@ "page_name": "19\\nStatus", "nav_keys": ["pagenum"], "nav_hold_ms": 1000, + "nav_tap_page": 1, "variables": { "state": "sp_state", "heartbeat": "sp_hb", "command": "sp_cmd" }, "service_windows": [ diff --git a/make_page.py b/make_page.py index afb1a3b..f24ab03 100644 --- a/make_page.py +++ b/make_page.py @@ -136,12 +136,13 @@ NAV_LOCATIONS = {"pageup": ("0", "0"), "pagenum": ("1", "0"), "pagedown": ("2", NAV_MARKER = "STATUS nav key" -def nav_key(kind, names, status_page=None, hold_ms=1000): +def nav_key(kind, names, status_page=None, hold_ms=1000, tap_page=1): """Companion's own UP / page number / DOWN key, coloured like the ALL button. - For the page number key, status_page adds: tap = Companion's usual "go to the - start page" (moved to release, so a hold does not flash through it first), - hold for hold_ms = go to the status page. + For the page number key, status_page adds: tap = go to tap_page (on release, + so a hold does not flash through it first), hold for hold_ms = go to the + status page. The tap names the page outright: the converted key's "startup" + means the current page on surfaces set to "use last page". """ templates = json.load(open(os.path.join(HERE, "nav_templates.json"))) key = json.loads(json.dumps(templates[kind])) @@ -163,6 +164,7 @@ def nav_key(kind, names, status_page=None, hold_ms=1000): if kind == "pagenum" and status_page: step = key["steps"]["0"] tap = step["action_sets"]["down"] + tap[0]["options"]["page"] = prop(tap_page) hold = [{"type": "action", "id": stable_id("nav", "hold"), "definitionId": "set_page", "connectionId": "internal", "options": {"surfaceId": prop("self"), "page": prop(status_page)}, "children": {}}] @@ -177,7 +179,8 @@ def build(cfg): controls = {} coloured = cfg.get("nav_keys", list(NAV_LOCATIONS)) # which nav keys follow the ALL button for kind, (r, c) in NAV_LOCATIONS.items(): - controls.setdefault(r, {})[c] = (nav_key(kind, cfg["variables"], cfg["page"], cfg.get("nav_hold_ms", 1000)) + controls.setdefault(r, {})[c] = (nav_key(kind, cfg["variables"], cfg["page"], cfg.get("nav_hold_ms", 1000), + cfg.get("nav_tap_page", 1)) if kind in coloured else {"type": kind}) for tile in cfg["tiles"]: if "pos" not in tile: diff --git a/status-page.companionconfig b/status-page.companionconfig index fd30f6d680884605a162086e0e6d8ff259b95bec..17ca89297f105cd2968c83f46662d8d8a2df8061 100644 GIT binary patch delta 2635 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 diff --git a/tests/test_status_panel.py b/tests/test_status_panel.py index 0aecce4..37f2d97 100644 --- a/tests/test_status_panel.py +++ b/tests/test_status_panel.py @@ -564,7 +564,7 @@ class TestPage(unittest.TestCase): step = key["steps"]["0"] self.assertEqual(step["action_sets"]["down"], []) tap, hold = step["action_sets"]["up"][0], step["action_sets"]["1000"][0] - self.assertEqual((tap["definitionId"], tap["options"]["page"]["value"]), (action, "startup")) + self.assertEqual((tap["definitionId"], tap["options"]["page"]["value"]), (action, 1)) # page 1 outright, not "startup" self.assertEqual((hold["definitionId"], hold["options"]["page"]["value"]), ("set_page", 19)) self.assertEqual(step["options"]["runWhileHeld"], [1000]) box = [l for l in key["style"]["layers"] if l["type"] == "box"][0]