Replace the watch app's menu UI with a single scrollable report page, add the config page
build / build (push) Successful in 18s

Report screen (ui_report_window.c, new): replaces the MenuLayer +
per-item drill-down windows (ui_menu_window.c/h, ui_card_window.c/h,
removed) with one continuously scrollable page mirroring the
interpreter's own text/HTML report - day significance, each transit's
narrative, the full Celtic Cross spread, and guidance last. Bigger/
bolder fonts throughout. Card images are a fixed 72px wide: a full-
display-width version was tried first but reliably crashes the real
PNG decoder ("PNG memory allocation failed") on actual hardware,
independent of the app's own heap or lazy-loading - 72px is the
hardware-verified ceiling.

Config page (pkjs/index.js): a self-contained `data:` URI settings form
for birth data/language/notification, submitting via AppMessage to the
existing app_message.c receiver. package.json needed
"capabilities": ["configurable"] for the Pebble mobile app to expose a
Settings entry for the sideloaded app at all - app_message.c's own
receiving logic was already correct. Added config_log() (config.c) to
confirm on-device, via APP_LOG, exactly which values a shown reading is
based on - both right after a config submission and at every app
launch.
This commit is contained in:
ml
2026-07-14 19:03:25 +02:00
parent 1a654da3e9
commit b94e76931a
21 changed files with 659 additions and 350 deletions
+8 -5
View File
@@ -5,7 +5,7 @@
#include "config.h"
#include "i18n_tables.h"
#include "reading_state.h"
#include "ui_menu_window.h"
#include "ui_report_window.h"
#include "ui_text_window.h"
static WatchConfig s_config;
@@ -24,11 +24,12 @@ static void on_config_updated(const WatchConfig *cfg) {
if (!s_config.configured) return;
config_log(&s_config); /* the values this newly-recomputed reading is based on */
reading_state_recompute(&s_config.birth);
if (was_configured) {
menu_window_reload();
report_window_reload();
} else {
menu_window_push();
report_window_push();
}
}
@@ -37,14 +38,16 @@ int main(void) {
watch_i18n_load(s_config.lang);
app_message_init(on_config_updated);
config_log(&s_config); /* the values this session's reading (if any) is based on */
if (s_config.configured) {
reading_state_recompute(&s_config.birth);
menu_window_push();
report_window_push();
} else {
show_setup_required();
}
app_event_loop();
menu_window_deinit();
report_window_deinit();
}