From 7c8f5895cdf3f32298b1d518ca1dce4df46da9e3 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Tue, 26 May 2026 16:13:07 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20home=20pages=20=E2=80=94=20evict=20S?= =?UTF-8?q?HUTDOWN=20from=20full=20page=5Forder=20to=20fit=20missing=20pag?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous fix appended missing pages only when there was room (cur_len < PAGE_ORDER_LEN). On e-ink builds with GPS+SENSORS the default order fills all 11 slots; old saves that included SHUTDOWN instead of TOOLS/QUICK_MSG had no room to append the missing entries. Now, if the array is full and a required page is absent, SHUTDOWN is evicted first (it is appended at runtime by buildVisibleOrder's fallback and does not need to be in the explicit list). This frees a slot for the missing page. Co-Authored-By: Claude Sonnet 4.6 --- .../companion_radio/ui-new/SettingsScreen.h | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/examples/companion_radio/ui-new/SettingsScreen.h b/examples/companion_radio/ui-new/SettingsScreen.h index d592a2f8..5900520e 100644 --- a/examples/companion_radio/ui-new/SettingsScreen.h +++ b/examples/companion_radio/ui-new/SettingsScreen.h @@ -305,8 +305,26 @@ class SettingsScreen : public UIScreen { #endif NodePrefs::HPB_SETTINGS, NodePrefs::HPB_TOOLS, NodePrefs::HPB_QUICK_MSG, }; - for (int i = 0; i < (int)(sizeof(REQUIRED)/sizeof(REQUIRED[0])); i++) { - uint8_t bit = REQUIRED[i]; + // If the array is full but a required page is missing, evict SHUTDOWN + // (it is handled by buildVisibleOrder's fallback and need not be explicit). + if (cur_len == NodePrefs::PAGE_ORDER_LEN) { + bool any_missing = false; + for (int ri = 0; ri < (int)(sizeof(REQUIRED)/sizeof(REQUIRED[0])); ri++) { + if (!(present & (uint16_t)(1u << REQUIRED[ri]))) { any_missing = true; break; } + } + if (any_missing) { + for (int i = 0; i < cur_len; i++) { + if (p->page_order[i] == NodePrefs::HPB_SHUTDOWN + 1) { + for (int j = i; j < cur_len - 1; j++) p->page_order[j] = p->page_order[j + 1]; + p->page_order[--cur_len] = 0; + present &= ~(uint16_t)(1u << NodePrefs::HPB_SHUTDOWN); + break; + } + } + } + } + for (int ri = 0; ri < (int)(sizeof(REQUIRED)/sizeof(REQUIRED[0])); ri++) { + uint8_t bit = REQUIRED[ri]; if (!(present & (uint16_t)(1u << bit)) && cur_len < NodePrefs::PAGE_ORDER_LEN) p->page_order[cur_len++] = bit + 1; }