From 42516f541e2bd4405247f761fc20c204edb6a531 Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 18 Jul 2025 19:07:32 -0500 Subject: [PATCH 01/17] Rename System Frame (from Memory) and add Dismiss Frame --- src/graphics/Screen.cpp | 16 ++++++++-------- src/graphics/Screen.h | 4 ++-- src/graphics/draw/DebugRenderer.cpp | 2 +- src/graphics/draw/DebugRenderer.h | 4 ++-- src/graphics/draw/MenuHandler.cpp | 29 ++++++++++++++++++++++++++++- src/graphics/draw/MenuHandler.h | 4 +++- src/graphics/images.h | 4 ++-- 7 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index b9c9e2fbf..3ed234afd 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -933,10 +933,10 @@ void Screen::setFrames(FrameFocus focus) normalFrames[numframes++] = graphics::DebugRenderer::drawLoRaFocused; indicatorIcons.push_back(icon_radio); } - if (!dismissedFrames.memory) { - fsi.positions.memory = numframes; - normalFrames[numframes++] = graphics::DebugRenderer::drawMemoryUsage; - indicatorIcons.push_back(icon_memory); + if (!dismissedFrames.system) { + fsi.positions.system = numframes; + normalFrames[numframes++] = graphics::DebugRenderer::drawSystemScreen; + indicatorIcons.push_back(icon_system); } #if !defined(DISPLAY_CLOCK_FRAME) fsi.positions.clock = numframes; @@ -1047,7 +1047,7 @@ void Screen::setFrames(FrameFocus focus) ui->switchToFrame(fsi.positions.clock); break; case FOCUS_SYSTEM: - ui->switchToFrame(fsi.positions.memory); + ui->switchToFrame(fsi.positions.system); break; case FOCUS_PRESERVE: @@ -1096,9 +1096,9 @@ void Screen::dismissCurrentFrame() LOG_DEBUG("Dismiss WiFi Screen"); dismissedFrames.wifi = true; dismissed = true; - } else if (currentFrame == framesetInfo.positions.memory) { + } else if (currentFrame == framesetInfo.positions.system) { LOG_INFO("Dismiss Memory"); - dismissedFrames.memory = true; + dismissedFrames.system = true; dismissed = true; } @@ -1366,7 +1366,7 @@ int Screen::handleInputEvent(const InputEvent *event) } else if (event->inputEvent == INPUT_BROKER_SELECT) { if (this->ui->getUiState()->currentFrame == framesetInfo.positions.home) { menuHandler::homeBaseMenu(); - } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.memory) { + } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.system) { menuHandler::systemBaseMenu(); #if HAS_GPS } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.gps && gps) { diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 265900131..803fc53dd 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -653,7 +653,7 @@ class Screen : public concurrency::OSThread uint8_t settings = 255; uint8_t wifi = 255; uint8_t deviceFocused = 255; - uint8_t memory = 255; + uint8_t system = 255; uint8_t gps = 255; uint8_t home = 255; uint8_t textMessage = 255; @@ -675,7 +675,7 @@ class Screen : public concurrency::OSThread bool textMessage = false; bool waypoint = false; bool wifi = false; - bool memory = false; + bool system = false; } dismissedFrames; /// Try to start drawing ASAP diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 5420d1b4b..81aeb2bc2 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -485,7 +485,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, // **************************** // * System Screen * // **************************** -void drawMemoryUsage(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { display->clear(); display->setFont(FONT_SMALL); diff --git a/src/graphics/draw/DebugRenderer.h b/src/graphics/draw/DebugRenderer.h index f4d484f58..3382e931d 100644 --- a/src/graphics/draw/DebugRenderer.h +++ b/src/graphics/draw/DebugRenderer.h @@ -31,8 +31,8 @@ void drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiState *state // LoRa information display void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y); -// Memory screen display -void drawMemoryUsage(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y); +// System screen display +void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y); } // namespace DebugRenderer } // namespace graphics diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 7ed9c4ea1..c7674d905 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -375,7 +375,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, DismissSystemFrame, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -396,6 +396,9 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = Test; } + optionsArray[options] = "Dismiss Frame"; + optionsEnumArray[options++] = DismissSystemFrame; + BannerOverlayOptions bannerOptions; bannerOptions.message = "System Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -414,6 +417,9 @@ void menuHandler::systemBaseMenu() } else if (selected == Test) { menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); + } else if (selected == DismissSystemFrame) { + menuHandler::menuQueue = menuHandler::DismissSystemFrame; + screen->runNow(); } else if (selected == Back && !test_enabled) { test_count++; if (test_count > 4) { @@ -1067,6 +1073,24 @@ void menuHandler::keyVerificationFinalPrompt() } } +void menuHandler::DismissSystemFrame_menu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Dismiss System Frame?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + screen->dismissCurrentFrame(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + void menuHandler::handleMenuSwitch(OLEDDisplay *display) { if (menuQueue != menu_none) @@ -1157,6 +1181,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case power_menu: powerMenu(); break; + case DismissSystemFrame: + DismissSystemFrame_menu(); + break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); break; diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 1f989be79..404c4abdc 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -36,7 +36,8 @@ class menuHandler system_base_menu, key_verification_init, key_verification_final_prompt, - throttle_message + throttle_message, + DismissSystemFrame }; static screenMenus menuQueue; @@ -71,6 +72,7 @@ class menuHandler static void notificationsMenu(); static void screenOptionsMenu(); static void powerMenu(); + static void DismissSystemFrame_menu(); private: static void saveUIConfig(); diff --git a/src/graphics/images.h b/src/graphics/images.h index beef3a1b2..a43ef6223 100644 --- a/src/graphics/images.h +++ b/src/graphics/images.h @@ -117,8 +117,8 @@ const uint8_t icon_radio[] PROGMEM = { 0xA9 // Row 7: #..#.#.# }; -// 🪙 Memory Icon -const uint8_t icon_memory[] PROGMEM = { +// 🪙 System Icon +const uint8_t icon_system[] PROGMEM = { 0x24, // Row 0: ..#..#.. 0x3C, // Row 1: ..####.. 0xC3, // Row 2: ##....## From 3d53ead9016ce7e18acf744b2dd13b8decfb4bd2 Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 18 Jul 2025 23:08:03 -0500 Subject: [PATCH 02/17] Dismissing more menus now available --- .vscode/settings.json | 5 ++ src/graphics/Screen.cpp | 65 ++++++++++++++++---------- src/graphics/Screen.h | 14 ++++++ src/graphics/draw/MenuHandler.cpp | 77 +++++++++++++++++++++++++++++-- src/graphics/draw/MenuHandler.h | 8 +++- 5 files changed, 139 insertions(+), 30 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 81deca8f9..a54386544 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,10 @@ }, "[powershell]": { "editor.defaultFormatter": "ms-vscode.powershell" + }, + "files.associations": { + "deque": "cpp", + "string": "cpp", + "vector": "cpp" } } diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 3ed234afd..4b83a449d 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -891,44 +891,55 @@ void Screen::setFrames(FrameFocus focus) // Declare this early so it’s available in FOCUS_PRESERVE block bool willInsertTextMessage = shouldDrawMessage(&devicestate.rx_text_message); - fsi.positions.home = numframes; - normalFrames[numframes++] = graphics::UIRenderer::drawDeviceFocused; - indicatorIcons.push_back(icon_home); + if (!dismissedFrames.home) { + fsi.positions.home = numframes; + normalFrames[numframes++] = graphics::UIRenderer::drawDeviceFocused; + indicatorIcons.push_back(icon_home); + } fsi.positions.textMessage = numframes; normalFrames[numframes++] = graphics::MessageRenderer::drawTextMessageFrame; indicatorIcons.push_back(icon_mail); #ifndef USE_EINK - fsi.positions.nodelist = numframes; - normalFrames[numframes++] = graphics::NodeListRenderer::drawDynamicNodeListScreen; - indicatorIcons.push_back(icon_nodes); + if (!dismissedFrames.nodelist) { + fsi.positions.nodelist = numframes; + normalFrames[numframes++] = graphics::NodeListRenderer::drawDynamicNodeListScreen; + indicatorIcons.push_back(icon_nodes); + } #endif // Show detailed node views only on E-Ink builds #ifdef USE_EINK - fsi.positions.nodelist_lastheard = numframes; - normalFrames[numframes++] = graphics::NodeListRenderer::drawLastHeardScreen; - indicatorIcons.push_back(icon_nodes); - - fsi.positions.nodelist_hopsignal = numframes; - normalFrames[numframes++] = graphics::NodeListRenderer::drawHopSignalScreen; - indicatorIcons.push_back(icon_signal); - - fsi.positions.nodelist_distance = numframes; - normalFrames[numframes++] = graphics::NodeListRenderer::drawDistanceScreen; - indicatorIcons.push_back(icon_distance); + if (!dismissedFrames.nodelist_lastheard) { + fsi.positions.nodelist_lastheard = numframes; + normalFrames[numframes++] = graphics::NodeListRenderer::drawLastHeardScreen; + indicatorIcons.push_back(icon_nodes); + } + if (!dismissedFrames.nodelist_hopsignal) { + fsi.positions.nodelist_hopsignal = numframes; + normalFrames[numframes++] = graphics::NodeListRenderer::drawHopSignalScreen; + indicatorIcons.push_back(icon_signal); + } + if (!dismissedFrames.nodelist_distance) { + fsi.positions.nodelist_distance = numframes; + normalFrames[numframes++] = graphics::NodeListRenderer::drawDistanceScreen; + indicatorIcons.push_back(icon_distance); + } #endif #if HAS_GPS - fsi.positions.nodelist_bearings = numframes; - normalFrames[numframes++] = graphics::NodeListRenderer::drawNodeListWithCompasses; - indicatorIcons.push_back(icon_list); - - fsi.positions.gps = numframes; - normalFrames[numframes++] = graphics::UIRenderer::drawCompassAndLocationScreen; - indicatorIcons.push_back(icon_compass); + if (!dismissedFrames.nodelist_bearings) { + fsi.positions.nodelist_bearings = numframes; + normalFrames[numframes++] = graphics::NodeListRenderer::drawNodeListWithCompasses; + indicatorIcons.push_back(icon_list); + } + if (!dismissedFrames.gps) { + fsi.positions.gps = numframes; + normalFrames[numframes++] = graphics::UIRenderer::drawCompassAndLocationScreen; + indicatorIcons.push_back(icon_compass); + } #endif - if (RadioLibInterface::instance) { + if (RadioLibInterface::instance && !dismissedFrames.lora) { fsi.positions.lora = numframes; normalFrames[numframes++] = graphics::DebugRenderer::drawLoRaFocused; indicatorIcons.push_back(icon_radio); @@ -1100,6 +1111,10 @@ void Screen::dismissCurrentFrame() LOG_INFO("Dismiss Memory"); dismissedFrames.system = true; dismissed = true; + } else if (currentFrame == framesetInfo.positions.nodelist_bearings) { + LOG_INFO("Dismiss Bearings"); + dismissedFrames.nodelist_bearings = true; + dismissed = true; } if (dismissed) { diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 803fc53dd..3f4c03812 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -676,6 +676,20 @@ class Screen : public concurrency::OSThread bool waypoint = false; bool wifi = false; bool system = false; + bool home = false; +#ifndef USE_EINK + bool nodelist = false; +#endif +#ifdef USE_EINK + bool nodelist_lastheard = false; + bool nodelist_hopsignal = false; + bool nodelist_distance = false; +#endif +#if HAS_GPS + bool nodelist_bearings = false; + bool gps = false; +#endif + bool lora = false; } dismissedFrames; /// Try to start drawing ASAP diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index c7674d905..a202fd6e2 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -464,7 +464,7 @@ void menuHandler::favoriteBaseMenu() void menuHandler::positionBaseMenu() { - enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, enumEnd }; + enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, DismissFrame, enumEnd }; static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass"}; static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu}; @@ -488,6 +488,9 @@ void menuHandler::positionBaseMenu() screen->runNow(); } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); + } else if (selected == DismissFrame) { + menuQueue = DismissPositionFrame; + screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -495,12 +498,12 @@ void menuHandler::positionBaseMenu() void menuHandler::nodeListMenu() { - enum optionsNumbers { Back, Favorite, Verify, Reset }; - static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB"}; + enum optionsNumbers { Back, Favorite, Verify, Reset, Dismissnodelist_bearings }; + static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB", "Dismiss Frame"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Node Action"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; + bannerOptions.optionsCount = 5; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Favorite) { menuQueue = add_favorite; @@ -511,6 +514,9 @@ void menuHandler::nodeListMenu() } else if (selected == Reset) { menuQueue = reset_node_db_menu; screen->runNow(); + } else if (selected == Dismissnodelist_bearings) { + menuQueue = Dismissnodelist_bearingsFrame; + screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -1091,6 +1097,60 @@ void menuHandler::DismissSystemFrame_menu() screen->showOverlayBanner(bannerOptions); } +void menuHandler::Dismissnodelist_bearings_menu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Dismiss Bearings Frame?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + screen->dismissCurrentFrame(); + } else { + // menuQueue = system_base_menu; + // screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::DismissLoRaFrame_menu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Dismiss LoRa Frame?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + screen->dismissCurrentFrame(); + } else { + // menuQueue = system_base_menu; + // screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::DismissPositionFrame_menu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Dismiss Position Frame?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + screen->dismissCurrentFrame(); + } else { + menuQueue = position_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + void menuHandler::handleMenuSwitch(OLEDDisplay *display) { if (menuQueue != menu_none) @@ -1184,6 +1244,15 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case DismissSystemFrame: DismissSystemFrame_menu(); break; + case DismissLoRaFrame: + DismissLoRaFrame_menu(); + break; + case Dismissnodelist_bearingsFrame: + Dismissnodelist_bearings_menu(); + break; + case DismissPositionFrame: + DismissPositionFrame_menu(); + break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); break; diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 404c4abdc..2ae208a65 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -37,7 +37,10 @@ class menuHandler key_verification_init, key_verification_final_prompt, throttle_message, - DismissSystemFrame + DismissSystemFrame, + DismissLoRaFrame, + Dismissnodelist_bearingsFrame, + DismissPositionFrame }; static screenMenus menuQueue; @@ -73,6 +76,9 @@ class menuHandler static void screenOptionsMenu(); static void powerMenu(); static void DismissSystemFrame_menu(); + static void Dismissnodelist_bearings_menu(); + static void DismissLoRaFrame_menu(); + static void DismissPositionFrame_menu(); private: static void saveUIConfig(); From 964afd0335dcacb5ee1051eb24c9a972ae6ad2af Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 18 Jul 2025 23:32:48 -0500 Subject: [PATCH 03/17] Add dismissing the GPS screen --- src/graphics/Screen.cpp | 4 ++++ src/graphics/draw/MenuHandler.cpp | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 4b83a449d..1d0e12c0b 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1115,6 +1115,10 @@ void Screen::dismissCurrentFrame() LOG_INFO("Dismiss Bearings"); dismissedFrames.nodelist_bearings = true; dismissed = true; + } else if (currentFrame == framesetInfo.positions.gps) { + LOG_INFO("Dismiss Position"); + dismissedFrames.gps = true; + dismissed = true; } if (dismissed) { diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index a202fd6e2..f4da575fe 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -466,9 +466,9 @@ void menuHandler::positionBaseMenu() { enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, DismissFrame, enumEnd }; - static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass"}; - static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu}; - int options = 3; + static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass", "Dismiss Frame"}; + static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu, DismissFrame}; + int options = 4; if (accelerometerThread) { optionsArray[options] = "Compass Calibrate"; From ff8275e0dd1e2666d285271759f39cd44a4deecd Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 07:11:21 -0500 Subject: [PATCH 04/17] Move Dismiss into a Generic Confirmation --- src/graphics/Screen.cpp | 22 ++++++++ src/graphics/draw/MenuHandler.cpp | 94 +++++-------------------------- src/graphics/draw/MenuHandler.h | 10 +--- 3 files changed, 38 insertions(+), 88 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 1d0e12c0b..885bffcee 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1111,6 +1111,7 @@ void Screen::dismissCurrentFrame() LOG_INFO("Dismiss Memory"); dismissedFrames.system = true; dismissed = true; +#if HAS_GPS } else if (currentFrame == framesetInfo.positions.nodelist_bearings) { LOG_INFO("Dismiss Bearings"); dismissedFrames.nodelist_bearings = true; @@ -1119,6 +1120,27 @@ void Screen::dismissCurrentFrame() LOG_INFO("Dismiss Position"); dismissedFrames.gps = true; dismissed = true; +#endif +#ifndef USE_EINK + } else if (currentFrame == framesetInfo.positions.nodelist) { + LOG_INFO("Dismiss NodeList"); + dismissedFrames.nodelist = true; + dismissed = true; +#endif +#ifdef USE_EINK + } else if (currentFrame == framesetInfo.positions.nodelist_lastheard) { + LOG_INFO("Dismiss NodeList (Last Heard - EInk)"); + dismissedFrames.nodelist_lastheard = true; + dismissed = true; + } else if (currentFrame == framesetInfo.positions.nodelist_hopsignal) { + LOG_INFO("Dismiss NodeList (Hop / Signal - EInk)"); + dismissedFrames.nodelist_hopsignal = true; + dismissed = true; + } else if (currentFrame == framesetInfo.positions.nodelinodelist_distancest) { + LOG_INFO("Dismiss NodeList (Distance - EInk)"); + dismissedFrames.nodelist_distance = true; + dismissed = true; +#endif } if (dismissed) { diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index f4da575fe..884f7be1d 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -375,7 +375,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, DismissSystemFrame, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, DismissFrame, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -396,8 +396,8 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = Test; } - optionsArray[options] = "Dismiss Frame"; - optionsEnumArray[options++] = DismissSystemFrame; + // optionsArray[options] = "Dismiss Frame"; + // optionsEnumArray[options++] = DismissCurrentFrame; BannerOverlayOptions bannerOptions; bannerOptions.message = "System Action"; @@ -417,8 +417,8 @@ void menuHandler::systemBaseMenu() } else if (selected == Test) { menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); - } else if (selected == DismissSystemFrame) { - menuHandler::menuQueue = menuHandler::DismissSystemFrame; + } else if (selected == DismissFrame) { + menuHandler::menuQueue = menuHandler::DismissCurrentFrame; screen->runNow(); } else if (selected == Back && !test_enabled) { test_count++; @@ -489,7 +489,7 @@ void menuHandler::positionBaseMenu() } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); } else if (selected == DismissFrame) { - menuQueue = DismissPositionFrame; + menuQueue = DismissCurrentFrame; screen->runNow(); } }; @@ -498,7 +498,7 @@ void menuHandler::positionBaseMenu() void menuHandler::nodeListMenu() { - enum optionsNumbers { Back, Favorite, Verify, Reset, Dismissnodelist_bearings }; + enum optionsNumbers { Back, Favorite, Verify, Reset, DismissFrame }; static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB", "Dismiss Frame"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Node Action"; @@ -514,8 +514,8 @@ void menuHandler::nodeListMenu() } else if (selected == Reset) { menuQueue = reset_node_db_menu; screen->runNow(); - } else if (selected == Dismissnodelist_bearings) { - menuQueue = Dismissnodelist_bearingsFrame; + } else if (selected == DismissFrame) { + menuQueue = DismissCurrentFrame; screen->runNow(); } }; @@ -1079,73 +1079,16 @@ void menuHandler::keyVerificationFinalPrompt() } } -void menuHandler::DismissSystemFrame_menu() +void menuHandler::DismissCurrentFrame_menu() { - static const char *optionsArray[] = {"Back", "Confirm"}; + static const char *optionsArray[] = {"Cancel", "Confirm"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Dismiss System Frame?"; + bannerOptions.message = "Dismiss Current Frame?"; bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 2; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == 1) { screen->dismissCurrentFrame(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::Dismissnodelist_bearings_menu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Dismiss Bearings Frame?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - screen->dismissCurrentFrame(); - } else { - // menuQueue = system_base_menu; - // screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::DismissLoRaFrame_menu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Dismiss LoRa Frame?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - screen->dismissCurrentFrame(); - } else { - // menuQueue = system_base_menu; - // screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::DismissPositionFrame_menu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Dismiss Position Frame?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - screen->dismissCurrentFrame(); - } else { - menuQueue = position_base_menu; - screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -1241,17 +1184,8 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case power_menu: powerMenu(); break; - case DismissSystemFrame: - DismissSystemFrame_menu(); - break; - case DismissLoRaFrame: - DismissLoRaFrame_menu(); - break; - case Dismissnodelist_bearingsFrame: - Dismissnodelist_bearings_menu(); - break; - case DismissPositionFrame: - DismissPositionFrame_menu(); + case DismissCurrentFrame: + DismissCurrentFrame_menu(); break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 2ae208a65..2bf723b18 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -37,10 +37,7 @@ class menuHandler key_verification_init, key_verification_final_prompt, throttle_message, - DismissSystemFrame, - DismissLoRaFrame, - Dismissnodelist_bearingsFrame, - DismissPositionFrame + DismissCurrentFrame }; static screenMenus menuQueue; @@ -75,10 +72,7 @@ class menuHandler static void notificationsMenu(); static void screenOptionsMenu(); static void powerMenu(); - static void DismissSystemFrame_menu(); - static void Dismissnodelist_bearings_menu(); - static void DismissLoRaFrame_menu(); - static void DismissPositionFrame_menu(); + static void DismissCurrentFrame_menu(); private: static void saveUIConfig(); From 7e067f5bf59b02a4516aa8ac768f66f647058740 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 07:36:58 -0500 Subject: [PATCH 05/17] Create LoRa Menu, move Region Picker into submenu, add Dismiss Frame option --- src/graphics/Screen.cpp | 6 +++++- src/graphics/draw/MenuHandler.cpp | 19 +++++++++++++++++++ src/graphics/draw/MenuHandler.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 885bffcee..7a4589ef1 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1107,6 +1107,10 @@ void Screen::dismissCurrentFrame() LOG_DEBUG("Dismiss WiFi Screen"); dismissedFrames.wifi = true; dismissed = true; + } else if (currentFrame == framesetInfo.positions.lora) { + LOG_INFO("Dismiss LoRa"); + dismissedFrames.lora = true; + dismissed = true; } else if (currentFrame == framesetInfo.positions.system) { LOG_INFO("Dismiss Memory"); dismissedFrames.system = true; @@ -1416,7 +1420,7 @@ int Screen::handleInputEvent(const InputEvent *event) } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.clock) { menuHandler::clockMenu(); } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.lora) { - menuHandler::LoraRegionPicker(); + menuHandler::loraMenu(); } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.textMessage) { if (devicestate.rx_text_message.from) { menuHandler::messageResponseMenu(); diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 884f7be1d..b16e12ab1 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -23,6 +23,25 @@ menuHandler::screenMenus menuHandler::menuQueue = menu_none; bool test_enabled = false; uint8_t test_count = 0; +void menuHandler::loraMenu() +{ + static const char *optionsArray[] = {"Back", "Region Picker", "Dismiss Frame"}; + enum optionsNumbers { Back = 0, lora_picker = 1, DismissCurrentFrame = 2 }; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "LoRa Actions"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Back) { + menuHandler::menuQueue = menuHandler::clock_menu; + screen->runNow(); + } else if (selected == DismissCurrentFrame) { + menuHandler::menuQueue = menuHandler::DismissCurrentFrame; + } + }; + screen->showOverlayBanner(bannerOptions); +} + void menuHandler::LoraRegionPicker(uint32_t duration) { static const char *optionsArray[] = {"Back", diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 2bf723b18..b40d0b1cf 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -42,6 +42,7 @@ class menuHandler static screenMenus menuQueue; static void LoraRegionPicker(uint32_t duration = 30000); + static void loraMenu(); static void handleMenuSwitch(OLEDDisplay *display); static void clockMenu(); static void TZPicker(); From e6be655f669a0555baca17eceb27ed8afa46edbc Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 09:24:38 -0500 Subject: [PATCH 06/17] Dismiss Clock Frame --- src/graphics/Screen.cpp | 24 ++++++++++++++++-------- src/graphics/Screen.h | 1 + src/graphics/draw/MenuHandler.cpp | 8 +++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 7a4589ef1..c5e6d4f4d 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -882,10 +882,12 @@ void Screen::setFrames(FrameFocus focus) } #if defined(DISPLAY_CLOCK_FRAME) - fsi.positions.clock = numframes; - normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame - : graphics::ClockRenderer::drawDigitalClockFrame; - indicatorIcons.push_back(digital_icon_clock); + if (!dismissedFrames.clock) { + fsi.positions.clock = numframes; + normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame + : graphics::ClockRenderer::drawDigitalClockFrame; + indicatorIcons.push_back(digital_icon_clock); + } #endif // Declare this early so it’s available in FOCUS_PRESERVE block @@ -950,10 +952,12 @@ void Screen::setFrames(FrameFocus focus) indicatorIcons.push_back(icon_system); } #if !defined(DISPLAY_CLOCK_FRAME) - fsi.positions.clock = numframes; - normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame - : graphics::ClockRenderer::drawDigitalClockFrame; - indicatorIcons.push_back(digital_icon_clock); + if (!dismissedFrames.clock) { + fsi.positions.clock = numframes; + normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame + : graphics::ClockRenderer::drawDigitalClockFrame; + indicatorIcons.push_back(digital_icon_clock); + } #endif #if HAS_WIFI && !defined(ARCH_PORTDUINO) @@ -1115,6 +1119,10 @@ void Screen::dismissCurrentFrame() LOG_INFO("Dismiss Memory"); dismissedFrames.system = true; dismissed = true; + } else if (currentFrame == framesetInfo.positions.clock) { + LOG_INFO("Dismiss Clock"); + dismissedFrames.clock = true; + dismissed = true; #if HAS_GPS } else if (currentFrame == framesetInfo.positions.nodelist_bearings) { LOG_INFO("Dismiss Bearings"); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 3f4c03812..a3a7fd446 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -677,6 +677,7 @@ class Screen : public concurrency::OSThread bool wifi = false; bool system = false; bool home = false; + bool clock = false; #ifndef USE_EINK bool nodelist = false; #endif diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index b16e12ab1..fa012bdb1 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -234,12 +234,12 @@ void menuHandler::TZPicker() void menuHandler::clockMenu() { - static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone"}; - enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3 }; + static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone", "Dismiss Frame"}; + enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3, DismissCurrentFrame = 4 }; BannerOverlayOptions bannerOptions; bannerOptions.message = "Clock Action"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; + bannerOptions.optionsCount = 5; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Clock) { menuHandler::menuQueue = menuHandler::clock_face_picker; @@ -250,6 +250,8 @@ void menuHandler::clockMenu() } else if (selected == Timezone) { menuHandler::menuQueue = menuHandler::TZ_picker; screen->runNow(); + } else if (selected == DismissCurrentFrame) { + menuHandler::menuQueue = menuHandler::DismissCurrentFrame; } }; screen->showOverlayBanner(bannerOptions); From c8717751b3779c8c0452bf3728dabc43c8d00b16 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 09:59:37 -0500 Subject: [PATCH 07/17] Add Restore All Frames option --- src/graphics/Screen.cpp | 24 ++++++++++++++++++++++++ src/graphics/Screen.h | 3 +++ src/graphics/draw/MenuHandler.cpp | 26 +++++++++++++++++++++++++- src/graphics/draw/MenuHandler.h | 4 +++- 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index c5e6d4f4d..6a691967d 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1160,6 +1160,30 @@ void Screen::dismissCurrentFrame() } } +void Screen::restoreAllFrames() +{ + dismissedFrames.textMessage = false; + dismissedFrames.waypoint = false; + dismissedFrames.wifi = false; + dismissedFrames.system = false; + dismissedFrames.home = false; + dismissedFrames.clock = false; +#ifndef USE_EINK + dismissedFrames.nodelist = false; +#endif +#ifdef USE_EINK + dismissedFrames.nodelist_lastheard = false; + dismissedFrames.nodelist_hopsignal = false; + dismissedFrames.nodelist_distance = false; +#endif +#if HAS_GPS + dismissedFrames.nodelist_bearings = false; + dismissedFrames.gps = false; +#endif + dismissedFrames.lora = false; + setFrames(FOCUS_DEFAULT); +} + void Screen::handleStartFirmwareUpdateScreen() { LOG_DEBUG("Show firmware screen"); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index a3a7fd446..4bf2fc4e6 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -593,6 +593,9 @@ class Screen : public concurrency::OSThread // Dismiss the currently focussed frame, if possible (e.g. text message, waypoint) void dismissCurrentFrame(); + // Restore all Frames + void restoreAllFrames(); + #ifdef USE_EINK /// Draw an image to remain on E-Ink display after screen off void setScreensaverFrames(FrameCallback einkScreensaver = NULL); diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index fa012bdb1..d0b67f1ec 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -396,7 +396,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, DismissFrame, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, RestoreAllFrames, Test, DismissFrame, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -409,6 +409,9 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = ScreenOptions; #endif + optionsArray[options] = "Restore All Frames"; + optionsEnumArray[options++] = RestoreAllFrames; + optionsArray[options] = "Reboot/Shutdown"; optionsEnumArray[options++] = PowerMenu; @@ -435,6 +438,9 @@ void menuHandler::systemBaseMenu() } else if (selected == PowerMenu) { menuHandler::menuQueue = menuHandler::power_menu; screen->runNow(); + } else if (selected == RestoreAllFrames) { + menuHandler::menuQueue = menuHandler::RestoreAllFrames; + screen->runNow(); } else if (selected == Test) { menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); @@ -1115,6 +1121,21 @@ void menuHandler::DismissCurrentFrame_menu() screen->showOverlayBanner(bannerOptions); } +void menuHandler::RestoreAllFrames_menu() +{ + static const char *optionsArray[] = {"Cancel", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Restore All Frames?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + screen->restoreAllFrames(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + void menuHandler::handleMenuSwitch(OLEDDisplay *display) { if (menuQueue != menu_none) @@ -1208,6 +1229,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case DismissCurrentFrame: DismissCurrentFrame_menu(); break; + case RestoreAllFrames: + RestoreAllFrames_menu(); + break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); break; diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index b40d0b1cf..3e4779d52 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -37,7 +37,8 @@ class menuHandler key_verification_init, key_verification_final_prompt, throttle_message, - DismissCurrentFrame + DismissCurrentFrame, + RestoreAllFrames }; static screenMenus menuQueue; @@ -74,6 +75,7 @@ class menuHandler static void screenOptionsMenu(); static void powerMenu(); static void DismissCurrentFrame_menu(); + static void RestoreAllFrames_menu(); private: static void saveUIConfig(); From da8e70fc7c8f92e348789d49720859c1e1b3862c Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 10:13:28 -0500 Subject: [PATCH 08/17] Rename "Dismissed" to "Hidden" and relabeled menu options --- src/graphics/Screen.cpp | 118 +++++++++++++----------------- src/graphics/Screen.h | 6 +- src/graphics/draw/MenuHandler.cpp | 44 +++++------ src/graphics/draw/MenuHandler.h | 4 +- 4 files changed, 78 insertions(+), 94 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 6a691967d..e759015be 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -882,7 +882,7 @@ void Screen::setFrames(FrameFocus focus) } #if defined(DISPLAY_CLOCK_FRAME) - if (!dismissedFrames.clock) { + if (!hiddenFrames.clock) { fsi.positions.clock = numframes; normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame : graphics::ClockRenderer::drawDigitalClockFrame; @@ -893,7 +893,7 @@ void Screen::setFrames(FrameFocus focus) // Declare this early so it’s available in FOCUS_PRESERVE block bool willInsertTextMessage = shouldDrawMessage(&devicestate.rx_text_message); - if (!dismissedFrames.home) { + if (!hiddenFrames.home) { fsi.positions.home = numframes; normalFrames[numframes++] = graphics::UIRenderer::drawDeviceFocused; indicatorIcons.push_back(icon_home); @@ -904,7 +904,7 @@ void Screen::setFrames(FrameFocus focus) indicatorIcons.push_back(icon_mail); #ifndef USE_EINK - if (!dismissedFrames.nodelist) { + if (!hiddenFrames.nodelist) { fsi.positions.nodelist = numframes; normalFrames[numframes++] = graphics::NodeListRenderer::drawDynamicNodeListScreen; indicatorIcons.push_back(icon_nodes); @@ -913,46 +913,46 @@ void Screen::setFrames(FrameFocus focus) // Show detailed node views only on E-Ink builds #ifdef USE_EINK - if (!dismissedFrames.nodelist_lastheard) { + if (!hiddenFrames.nodelist_lastheard) { fsi.positions.nodelist_lastheard = numframes; normalFrames[numframes++] = graphics::NodeListRenderer::drawLastHeardScreen; indicatorIcons.push_back(icon_nodes); } - if (!dismissedFrames.nodelist_hopsignal) { + if (!hiddenFrames.nodelist_hopsignal) { fsi.positions.nodelist_hopsignal = numframes; normalFrames[numframes++] = graphics::NodeListRenderer::drawHopSignalScreen; indicatorIcons.push_back(icon_signal); } - if (!dismissedFrames.nodelist_distance) { + if (!hiddenFrames.nodelist_distance) { fsi.positions.nodelist_distance = numframes; normalFrames[numframes++] = graphics::NodeListRenderer::drawDistanceScreen; indicatorIcons.push_back(icon_distance); } #endif #if HAS_GPS - if (!dismissedFrames.nodelist_bearings) { + if (!hiddenFrames.nodelist_bearings) { fsi.positions.nodelist_bearings = numframes; normalFrames[numframes++] = graphics::NodeListRenderer::drawNodeListWithCompasses; indicatorIcons.push_back(icon_list); } - if (!dismissedFrames.gps) { + if (!hiddenFrames.gps) { fsi.positions.gps = numframes; normalFrames[numframes++] = graphics::UIRenderer::drawCompassAndLocationScreen; indicatorIcons.push_back(icon_compass); } #endif - if (RadioLibInterface::instance && !dismissedFrames.lora) { + if (RadioLibInterface::instance && !hiddenFrames.lora) { fsi.positions.lora = numframes; normalFrames[numframes++] = graphics::DebugRenderer::drawLoRaFocused; indicatorIcons.push_back(icon_radio); } - if (!dismissedFrames.system) { + if (!hiddenFrames.system) { fsi.positions.system = numframes; normalFrames[numframes++] = graphics::DebugRenderer::drawSystemScreen; indicatorIcons.push_back(icon_system); } #if !defined(DISPLAY_CLOCK_FRAME) - if (!dismissedFrames.clock) { + if (!hiddenFrames.clock) { fsi.positions.clock = numframes; normalFrames[numframes++] = uiconfig.is_clockface_analog ? graphics::ClockRenderer::drawAnalogClockFrame : graphics::ClockRenderer::drawDigitalClockFrame; @@ -961,7 +961,7 @@ void Screen::setFrames(FrameFocus focus) #endif #if HAS_WIFI && !defined(ARCH_PORTDUINO) - if (!dismissedFrames.wifi && isWifiAvailable()) { + if (!hiddenFrames.wifi && isWifiAvailable()) { fsi.positions.wifi = numframes; normalFrames[numframes++] = graphics::DebugRenderer::drawDebugInfoWiFiTrampoline; indicatorIcons.push_back(icon_wifi); @@ -1093,94 +1093,78 @@ void Screen::setFrameImmediateDraw(FrameCallback *drawFrames) // Dismisses the currently displayed screen frame, if possible // Relevant for text message, waypoint, others in future? // Triggered with a CardKB keycombo -void Screen::dismissCurrentFrame() +void Screen::hideCurrentFrame() { uint8_t currentFrame = ui->getUiState()->currentFrame; - bool dismissed = false; - if (currentFrame == framesetInfo.positions.textMessage && devicestate.has_rx_text_message) { - LOG_INFO("Dismiss Text Message"); + LOG_INFO("Hide Text Message"); devicestate.has_rx_text_message = false; memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); } else if (currentFrame == framesetInfo.positions.waypoint && devicestate.has_rx_waypoint) { - LOG_DEBUG("Dismiss Waypoint"); + LOG_DEBUG("Hide Waypoint"); devicestate.has_rx_waypoint = false; - dismissedFrames.waypoint = true; - dismissed = true; + hiddenFrames.waypoint = true; } else if (currentFrame == framesetInfo.positions.wifi) { - LOG_DEBUG("Dismiss WiFi Screen"); - dismissedFrames.wifi = true; - dismissed = true; + LOG_DEBUG("Hide WiFi Screen"); + hiddenFrames.wifi = true; } else if (currentFrame == framesetInfo.positions.lora) { - LOG_INFO("Dismiss LoRa"); - dismissedFrames.lora = true; - dismissed = true; + LOG_INFO("Hide LoRa"); + hiddenFrames.lora = true; } else if (currentFrame == framesetInfo.positions.system) { - LOG_INFO("Dismiss Memory"); - dismissedFrames.system = true; - dismissed = true; + LOG_INFO("Hide Memory"); + hiddenFrames.system = true; } else if (currentFrame == framesetInfo.positions.clock) { - LOG_INFO("Dismiss Clock"); - dismissedFrames.clock = true; - dismissed = true; + LOG_INFO("Hide Clock"); + hiddenFrames.clock = true; #if HAS_GPS } else if (currentFrame == framesetInfo.positions.nodelist_bearings) { - LOG_INFO("Dismiss Bearings"); - dismissedFrames.nodelist_bearings = true; - dismissed = true; + LOG_INFO("Hide Bearings"); + hiddenFrames.nodelist_bearings = true; } else if (currentFrame == framesetInfo.positions.gps) { - LOG_INFO("Dismiss Position"); - dismissedFrames.gps = true; - dismissed = true; + LOG_INFO("Hide Position"); + hiddenFrames.gps = true; #endif #ifndef USE_EINK } else if (currentFrame == framesetInfo.positions.nodelist) { - LOG_INFO("Dismiss NodeList"); - dismissedFrames.nodelist = true; - dismissed = true; + LOG_INFO("Hide NodeList"); + hiddenFrames.nodelist = true; #endif #ifdef USE_EINK } else if (currentFrame == framesetInfo.positions.nodelist_lastheard) { - LOG_INFO("Dismiss NodeList (Last Heard - EInk)"); - dismissedFrames.nodelist_lastheard = true; - dismissed = true; + LOG_INFO("Hide NodeList (Last Heard - EInk)"); + hiddenFrames.nodelist_lastheard = true; } else if (currentFrame == framesetInfo.positions.nodelist_hopsignal) { - LOG_INFO("Dismiss NodeList (Hop / Signal - EInk)"); - dismissedFrames.nodelist_hopsignal = true; - dismissed = true; + LOG_INFO("Hide NodeList (Hop / Signal - EInk)"); + hiddenFrames.nodelist_hopsignal = true; } else if (currentFrame == framesetInfo.positions.nodelinodelist_distancest) { - LOG_INFO("Dismiss NodeList (Distance - EInk)"); - dismissedFrames.nodelist_distance = true; - dismissed = true; + LOG_INFO("Hide NodeList (Distance - EInk)"); + hiddenFrames.nodelist_distance = true; #endif } - - if (dismissed) { - setFrames(FOCUS_DEFAULT); // You could also use FOCUS_PRESERVE - } + setFrames(FOCUS_DEFAULT); // You could also use FOCUS_PRESERVE } void Screen::restoreAllFrames() { - dismissedFrames.textMessage = false; - dismissedFrames.waypoint = false; - dismissedFrames.wifi = false; - dismissedFrames.system = false; - dismissedFrames.home = false; - dismissedFrames.clock = false; + hiddenFrames.textMessage = false; + hiddenFrames.waypoint = false; + hiddenFrames.wifi = false; + hiddenFrames.system = false; + hiddenFrames.home = false; + hiddenFrames.clock = false; #ifndef USE_EINK - dismissedFrames.nodelist = false; + hiddenFrames.nodelist = false; #endif #ifdef USE_EINK - dismissedFrames.nodelist_lastheard = false; - dismissedFrames.nodelist_hopsignal = false; - dismissedFrames.nodelist_distance = false; + hiddenFrames.nodelist_lastheard = false; + hiddenFrames.nodelist_hopsignal = false; + hiddenFrames.nodelist_distance = false; #endif #if HAS_GPS - dismissedFrames.nodelist_bearings = false; - dismissedFrames.gps = false; + hiddenFrames.nodelist_bearings = false; + hiddenFrames.gps = false; #endif - dismissedFrames.lora = false; + hiddenFrames.lora = false; setFrames(FOCUS_DEFAULT); } @@ -1327,7 +1311,7 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) // Outgoing message (likely sent from phone) devicestate.has_rx_text_message = false; memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); - dismissedFrames.textMessage = true; + hiddenFrames.textMessage = true; hasUnreadMessage = false; // Clear unread state when user replies setFrames(FOCUS_PRESERVE); // Stay on same frame, silently update frame list diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 4bf2fc4e6..bcfb1dff6 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -591,7 +591,7 @@ class Screen : public concurrency::OSThread void setSSLFrames(); // Dismiss the currently focussed frame, if possible (e.g. text message, waypoint) - void dismissCurrentFrame(); + void hideCurrentFrame(); // Restore all Frames void restoreAllFrames(); @@ -674,7 +674,7 @@ class Screen : public concurrency::OSThread uint8_t frameCount = 0; } framesetInfo; - struct DismissedFrames { + struct hiddenFrames { bool textMessage = false; bool waypoint = false; bool wifi = false; @@ -694,7 +694,7 @@ class Screen : public concurrency::OSThread bool gps = false; #endif bool lora = false; - } dismissedFrames; + } hiddenFrames; /// Try to start drawing ASAP void setFastFramerate(); diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index d0b67f1ec..de6a9bc8f 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -25,8 +25,8 @@ uint8_t test_count = 0; void menuHandler::loraMenu() { - static const char *optionsArray[] = {"Back", "Region Picker", "Dismiss Frame"}; - enum optionsNumbers { Back = 0, lora_picker = 1, DismissCurrentFrame = 2 }; + static const char *optionsArray[] = {"Back", "Region Picker", "Hide Frame"}; + enum optionsNumbers { Back = 0, lora_picker = 1, hideCurrentFrame = 2 }; BannerOverlayOptions bannerOptions; bannerOptions.message = "LoRa Actions"; bannerOptions.optionsArrayPtr = optionsArray; @@ -35,8 +35,8 @@ void menuHandler::loraMenu() if (selected == Back) { menuHandler::menuQueue = menuHandler::clock_menu; screen->runNow(); - } else if (selected == DismissCurrentFrame) { - menuHandler::menuQueue = menuHandler::DismissCurrentFrame; + } else if (selected == hideCurrentFrame) { + menuHandler::menuQueue = menuHandler::hideCurrentFrame; } }; screen->showOverlayBanner(bannerOptions); @@ -234,8 +234,8 @@ void menuHandler::TZPicker() void menuHandler::clockMenu() { - static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone", "Dismiss Frame"}; - enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3, DismissCurrentFrame = 4 }; + static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone", "Hide Frame"}; + enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3, hideCurrentFrame = 4 }; BannerOverlayOptions bannerOptions; bannerOptions.message = "Clock Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -250,8 +250,8 @@ void menuHandler::clockMenu() } else if (selected == Timezone) { menuHandler::menuQueue = menuHandler::TZ_picker; screen->runNow(); - } else if (selected == DismissCurrentFrame) { - menuHandler::menuQueue = menuHandler::DismissCurrentFrame; + } else if (selected == hideCurrentFrame) { + menuHandler::menuQueue = menuHandler::hideCurrentFrame; } }; screen->showOverlayBanner(bannerOptions); @@ -281,7 +281,7 @@ void menuHandler::messageResponseMenu() bannerOptions.optionsCount = options; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Dismiss) { - screen->dismissCurrentFrame(); + screen->hideCurrentFrame(); } else if (selected == Preset) { if (devicestate.rx_text_message.to == NODENUM_BROADCAST) { cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, devicestate.rx_text_message.channel); @@ -420,8 +420,8 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = Test; } - // optionsArray[options] = "Dismiss Frame"; - // optionsEnumArray[options++] = DismissCurrentFrame; + // optionsArray[options] = "Hide Frame"; + // optionsEnumArray[options++] = hideCurrentFrame; BannerOverlayOptions bannerOptions; bannerOptions.message = "System Action"; @@ -445,7 +445,7 @@ void menuHandler::systemBaseMenu() menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); } else if (selected == DismissFrame) { - menuHandler::menuQueue = menuHandler::DismissCurrentFrame; + menuHandler::menuQueue = menuHandler::hideCurrentFrame; screen->runNow(); } else if (selected == Back && !test_enabled) { test_count++; @@ -493,7 +493,7 @@ void menuHandler::positionBaseMenu() { enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, DismissFrame, enumEnd }; - static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass", "Dismiss Frame"}; + static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass", "Hide Frame"}; static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu, DismissFrame}; int options = 4; @@ -516,7 +516,7 @@ void menuHandler::positionBaseMenu() } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); } else if (selected == DismissFrame) { - menuQueue = DismissCurrentFrame; + menuQueue = hideCurrentFrame; screen->runNow(); } }; @@ -526,7 +526,7 @@ void menuHandler::positionBaseMenu() void menuHandler::nodeListMenu() { enum optionsNumbers { Back, Favorite, Verify, Reset, DismissFrame }; - static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB", "Dismiss Frame"}; + static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB", "Hide Frame"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Node Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -542,7 +542,7 @@ void menuHandler::nodeListMenu() menuQueue = reset_node_db_menu; screen->runNow(); } else if (selected == DismissFrame) { - menuQueue = DismissCurrentFrame; + menuQueue = hideCurrentFrame; screen->runNow(); } }; @@ -1106,16 +1106,16 @@ void menuHandler::keyVerificationFinalPrompt() } } -void menuHandler::DismissCurrentFrame_menu() +void menuHandler::hideCurrentFrame_menu() { static const char *optionsArray[] = {"Cancel", "Confirm"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Dismiss Current Frame?"; + bannerOptions.message = "Hide Current Frame?"; bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 2; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == 1) { - screen->dismissCurrentFrame(); + screen->hideCurrentFrame(); } }; screen->showOverlayBanner(bannerOptions); @@ -1125,7 +1125,7 @@ void menuHandler::RestoreAllFrames_menu() { static const char *optionsArray[] = {"Cancel", "Confirm"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Restore All Frames?"; + bannerOptions.message = "Show All Frames?"; bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 2; bannerOptions.bannerCallback = [](int selected) -> void { @@ -1226,8 +1226,8 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case power_menu: powerMenu(); break; - case DismissCurrentFrame: - DismissCurrentFrame_menu(); + case hideCurrentFrame: + hideCurrentFrame_menu(); break; case RestoreAllFrames: RestoreAllFrames_menu(); diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 3e4779d52..fb2d1cb4f 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -37,7 +37,7 @@ class menuHandler key_verification_init, key_verification_final_prompt, throttle_message, - DismissCurrentFrame, + hideCurrentFrame, RestoreAllFrames }; static screenMenus menuQueue; @@ -74,7 +74,7 @@ class menuHandler static void notificationsMenu(); static void screenOptionsMenu(); static void powerMenu(); - static void DismissCurrentFrame_menu(); + static void hideCurrentFrame_menu(); static void RestoreAllFrames_menu(); private: From 8bede6dfcfdaee8543972da1285d8671d4deb751 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 10:21:58 -0500 Subject: [PATCH 09/17] Hide Frame should be last option --- src/graphics/draw/MenuHandler.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index de6a9bc8f..6347d7c53 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -493,14 +493,18 @@ void menuHandler::positionBaseMenu() { enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, DismissFrame, enumEnd }; - static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass", "Hide Frame"}; - static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu, DismissFrame}; - int options = 4; + static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass"}; + static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu}; + int options = 3; if (accelerometerThread) { optionsArray[options] = "Compass Calibrate"; optionsEnumArray[options++] = CompassCalibrate; } + + optionsArray[options] = "Hide Frame"; + optionsEnumArray[options++] = DismissFrame; + BannerOverlayOptions bannerOptions; bannerOptions.message = "Position Action"; bannerOptions.optionsArrayPtr = optionsArray; From 4badb1c420a7844ca5786b8a21232dffaab6e57c Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 10:30:59 -0500 Subject: [PATCH 10/17] Fix misspelling in EInk --- src/graphics/Screen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index e759015be..4b21fe4c1 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1136,7 +1136,7 @@ void Screen::hideCurrentFrame() } else if (currentFrame == framesetInfo.positions.nodelist_hopsignal) { LOG_INFO("Hide NodeList (Hop / Signal - EInk)"); hiddenFrames.nodelist_hopsignal = true; - } else if (currentFrame == framesetInfo.positions.nodelinodelist_distancest) { + } else if (currentFrame == framesetInfo.positions.nodelist_distance) { LOG_INFO("Hide NodeList (Distance - EInk)"); hiddenFrames.nodelist_distance = true; #endif From a7ce4f29d7c0daed4542a6f965824e6a4a65fdd7 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 19 Jul 2025 10:38:13 -0500 Subject: [PATCH 11/17] Consistent Language Throughout - Restore All Frames --- src/graphics/draw/MenuHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 6347d7c53..7c2d0e610 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1129,7 +1129,7 @@ void menuHandler::RestoreAllFrames_menu() { static const char *optionsArray[] = {"Cancel", "Confirm"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Show All Frames?"; + bannerOptions.message = "Restore All Frames?"; bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 2; bannerOptions.bannerCallback = [](int selected) -> void { From 1881a8529f422a155ca85222c1d5b90778f70e7e Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 20 Jul 2025 18:25:57 -0500 Subject: [PATCH 12/17] Switch to concise menu to manage show/hide --- src/graphics/Screen.cpp | 108 +++++++++------------ src/graphics/Screen.h | 8 +- src/graphics/draw/MenuHandler.cpp | 153 +++++++++++++++++++----------- src/graphics/draw/MenuHandler.h | 6 +- 4 files changed, 146 insertions(+), 129 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 5a34731e2..085850ba2 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1090,82 +1090,66 @@ void Screen::setFrameImmediateDraw(FrameCallback *drawFrames) setFastFramerate(); } -// Dismisses the currently displayed screen frame, if possible -// Relevant for text message, waypoint, others in future? -// Triggered with a CardKB keycombo -void Screen::hideCurrentFrame() +void Screen::toggleFrameVisibility(const std::string &frameName) { - uint8_t currentFrame = ui->getUiState()->currentFrame; - if (currentFrame == framesetInfo.positions.textMessage && devicestate.has_rx_text_message) { - LOG_INFO("Hide Text Message"); - devicestate.has_rx_text_message = false; - memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); - } else if (currentFrame == framesetInfo.positions.waypoint && devicestate.has_rx_waypoint) { - LOG_DEBUG("Hide Waypoint"); - devicestate.has_rx_waypoint = false; - hiddenFrames.waypoint = true; - } else if (currentFrame == framesetInfo.positions.wifi) { - LOG_DEBUG("Hide WiFi Screen"); - hiddenFrames.wifi = true; - } else if (currentFrame == framesetInfo.positions.lora) { - LOG_INFO("Hide LoRa"); - hiddenFrames.lora = true; - } else if (currentFrame == framesetInfo.positions.system) { - LOG_INFO("Hide Memory"); - hiddenFrames.system = true; - } else if (currentFrame == framesetInfo.positions.clock) { - LOG_INFO("Hide Clock"); - hiddenFrames.clock = true; -#if HAS_GPS - } else if (currentFrame == framesetInfo.positions.nodelist_bearings) { - LOG_INFO("Hide Bearings"); - hiddenFrames.nodelist_bearings = true; - } else if (currentFrame == framesetInfo.positions.gps) { - LOG_INFO("Hide Position"); - hiddenFrames.gps = true; -#endif #ifndef USE_EINK - } else if (currentFrame == framesetInfo.positions.nodelist) { - LOG_INFO("Hide NodeList"); - hiddenFrames.nodelist = true; + if (frameName == "nodelist") { + hiddenFrames.nodelist = !hiddenFrames.nodelist; + } #endif #ifdef USE_EINK - } else if (currentFrame == framesetInfo.positions.nodelist_lastheard) { - LOG_INFO("Hide NodeList (Last Heard - EInk)"); - hiddenFrames.nodelist_lastheard = true; - } else if (currentFrame == framesetInfo.positions.nodelist_hopsignal) { - LOG_INFO("Hide NodeList (Hop / Signal - EInk)"); - hiddenFrames.nodelist_hopsignal = true; - } else if (currentFrame == framesetInfo.positions.nodelist_distance) { - LOG_INFO("Hide NodeList (Distance - EInk)"); - hiddenFrames.nodelist_distance = true; -#endif + if (frameName == "nodelist_lastheard") { + hiddenFrames.nodelist_lastheard = !hiddenFrames.nodelist_lastheard; + } + if (frameName == "nodelist_hopsignal") { + hiddenFrames.nodelist_hopsignal = !hiddenFrames.nodelist_hopsignal; + } + if (frameName == "nodelist_distance") { + hiddenFrames.nodelist_distance = !hiddenFrames.nodelist_distance; + } +#endif +#if HAS_GPS + if (frameName == "nodelist_bearings") { + hiddenFrames.nodelist_bearings = !hiddenFrames.nodelist_bearings; + } + if (frameName == "gps") { + hiddenFrames.gps = !hiddenFrames.gps; + } +#endif + if (frameName == "lora") { + hiddenFrames.lora = !hiddenFrames.lora; + } + if (frameName == "clock") { + hiddenFrames.clock = !hiddenFrames.clock; } - setFrames(FOCUS_DEFAULT); // You could also use FOCUS_PRESERVE } -void Screen::restoreAllFrames() +bool Screen::isFrameHidden(const std::string &frameName) const { - hiddenFrames.textMessage = false; - hiddenFrames.waypoint = false; - hiddenFrames.wifi = false; - hiddenFrames.system = false; - hiddenFrames.home = false; - hiddenFrames.clock = false; #ifndef USE_EINK - hiddenFrames.nodelist = false; + if (frameName == "nodelist") + return hiddenFrames.nodelist; #endif #ifdef USE_EINK - hiddenFrames.nodelist_lastheard = false; - hiddenFrames.nodelist_hopsignal = false; - hiddenFrames.nodelist_distance = false; + if (frameName == "nodelist_lastheard") + return hiddenFrames.nodelist_lastheard; + if (frameName == "nodelist_hopsignal") + return hiddenFrames.nodelist_hopsignal; + if (frameName == "nodelist_distance") + return hiddenFrames.nodelist_distance; #endif #if HAS_GPS - hiddenFrames.nodelist_bearings = false; - hiddenFrames.gps = false; + if (frameName == "nodelist_bearings") + return hiddenFrames.nodelist_bearings; + if (frameName == "gps") + return hiddenFrames.gps; #endif - hiddenFrames.lora = false; - setFrames(FOCUS_DEFAULT); + if (frameName == "lora") + return hiddenFrames.lora; + if (frameName == "clock") + return hiddenFrames.clock; + + return false; } void Screen::handleStartFirmwareUpdateScreen() diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index bcfb1dff6..0c69cd908 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -590,11 +590,9 @@ class Screen : public concurrency::OSThread /// Draws our SSL cert screen during boot (called from WebServer) void setSSLFrames(); - // Dismiss the currently focussed frame, if possible (e.g. text message, waypoint) - void hideCurrentFrame(); - - // Restore all Frames - void restoreAllFrames(); + // Menu-driven Show / Hide Toggle + void toggleFrameVisibility(const std::string &frameName); + bool isFrameHidden(const std::string &frameName) const; #ifdef USE_EINK /// Draw an image to remain on E-Ink display after screen off diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 7c2d0e610..f46e77a24 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -25,8 +25,8 @@ uint8_t test_count = 0; void menuHandler::loraMenu() { - static const char *optionsArray[] = {"Back", "Region Picker", "Hide Frame"}; - enum optionsNumbers { Back = 0, lora_picker = 1, hideCurrentFrame = 2 }; + static const char *optionsArray[] = {"Back", "Region Picker"}; + enum optionsNumbers { Back = 0, lora_picker = 1 }; BannerOverlayOptions bannerOptions; bannerOptions.message = "LoRa Actions"; bannerOptions.optionsArrayPtr = optionsArray; @@ -35,8 +35,8 @@ void menuHandler::loraMenu() if (selected == Back) { menuHandler::menuQueue = menuHandler::clock_menu; screen->runNow(); - } else if (selected == hideCurrentFrame) { - menuHandler::menuQueue = menuHandler::hideCurrentFrame; + } else if (selected == lora_picker) { + menuHandler::menuQueue = menuHandler::lora_picker; } }; screen->showOverlayBanner(bannerOptions); @@ -234,8 +234,8 @@ void menuHandler::TZPicker() void menuHandler::clockMenu() { - static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone", "Hide Frame"}; - enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3, hideCurrentFrame = 4 }; + static const char *optionsArray[] = {"Back", "Clock Face", "Time Format", "Timezone"}; + enum optionsNumbers { Back = 0, Clock = 1, Time = 2, Timezone = 3 }; BannerOverlayOptions bannerOptions; bannerOptions.message = "Clock Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -250,8 +250,6 @@ void menuHandler::clockMenu() } else if (selected == Timezone) { menuHandler::menuQueue = menuHandler::TZ_picker; screen->runNow(); - } else if (selected == hideCurrentFrame) { - menuHandler::menuQueue = menuHandler::hideCurrentFrame; } }; screen->showOverlayBanner(bannerOptions); @@ -280,9 +278,7 @@ void menuHandler::messageResponseMenu() bannerOptions.optionsEnumPtr = optionsEnumArray; bannerOptions.optionsCount = options; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Dismiss) { - screen->hideCurrentFrame(); - } else if (selected == Preset) { + if (selected == Preset) { if (devicestate.rx_text_message.to == NODENUM_BROADCAST) { cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, devicestate.rx_text_message.channel); } else { @@ -396,7 +392,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, RestoreAllFrames, Test, DismissFrame, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, FrameToggles, Test, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -409,8 +405,8 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = ScreenOptions; #endif - optionsArray[options] = "Restore All Frames"; - optionsEnumArray[options++] = RestoreAllFrames; + optionsArray[options] = "Frame Visiblity Toggle"; + optionsEnumArray[options++] = FrameToggles; optionsArray[options] = "Reboot/Shutdown"; optionsEnumArray[options++] = PowerMenu; @@ -420,9 +416,6 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = Test; } - // optionsArray[options] = "Hide Frame"; - // optionsEnumArray[options++] = hideCurrentFrame; - BannerOverlayOptions bannerOptions; bannerOptions.message = "System Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -438,15 +431,12 @@ void menuHandler::systemBaseMenu() } else if (selected == PowerMenu) { menuHandler::menuQueue = menuHandler::power_menu; screen->runNow(); - } else if (selected == RestoreAllFrames) { - menuHandler::menuQueue = menuHandler::RestoreAllFrames; + } else if (selected == FrameToggles) { + menuHandler::menuQueue = menuHandler::FrameToggles; screen->runNow(); } else if (selected == Test) { menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); - } else if (selected == DismissFrame) { - menuHandler::menuQueue = menuHandler::hideCurrentFrame; - screen->runNow(); } else if (selected == Back && !test_enabled) { test_count++; if (test_count > 4) { @@ -491,7 +481,7 @@ void menuHandler::favoriteBaseMenu() void menuHandler::positionBaseMenu() { - enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, DismissFrame, enumEnd }; + enum optionsNumbers { Back, GPSToggle, CompassMenu, CompassCalibrate, enumEnd }; static const char *optionsArray[enumEnd] = {"Back", "GPS Toggle", "Compass"}; static int optionsEnumArray[enumEnd] = {Back, GPSToggle, CompassMenu}; @@ -502,9 +492,6 @@ void menuHandler::positionBaseMenu() optionsEnumArray[options++] = CompassCalibrate; } - optionsArray[options] = "Hide Frame"; - optionsEnumArray[options++] = DismissFrame; - BannerOverlayOptions bannerOptions; bannerOptions.message = "Position Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -519,9 +506,6 @@ void menuHandler::positionBaseMenu() screen->runNow(); } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); - } else if (selected == DismissFrame) { - menuQueue = hideCurrentFrame; - screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -529,8 +513,8 @@ void menuHandler::positionBaseMenu() void menuHandler::nodeListMenu() { - enum optionsNumbers { Back, Favorite, Verify, Reset, DismissFrame }; - static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB", "Hide Frame"}; + enum optionsNumbers { Back, Favorite, Verify, Reset }; + static const char *optionsArray[] = {"Back", "Add Favorite", "Key Verification", "Reset NodeDB"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Node Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -545,9 +529,6 @@ void menuHandler::nodeListMenu() } else if (selected == Reset) { menuQueue = reset_node_db_menu; screen->runNow(); - } else if (selected == DismissFrame) { - menuQueue = hideCurrentFrame; - screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -1110,31 +1091,90 @@ void menuHandler::keyVerificationFinalPrompt() } } -void menuHandler::hideCurrentFrame_menu() +void menuHandler::FrameToggles_menu() { - static const char *optionsArray[] = {"Cancel", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Hide Current Frame?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - screen->hideCurrentFrame(); - } + enum optionsNumbers { + Finish, + nodelist, + nodelist_lastheard, + nodelist_hopsignal, + nodelist_distance, + nodelist_bearings, + gps, + lora, + clock, + enumEnd }; - screen->showOverlayBanner(bannerOptions); -} + static const char *optionsArray[enumEnd] = {"Finish"}; + static int optionsEnumArray[enumEnd] = {Finish}; + int options = 1; + +#ifndef USE_EINK + optionsArray[options] = screen->isFrameHidden("nodelist") ? "Show Node List" : "Hide Node List"; + optionsEnumArray[options++] = nodelist; +#endif +#ifdef USE_EINK + optionsArray[options] = screen->isFrameHidden("nodelist_lastheard") ? "Show NL - Last Heard" : "Hide NL - Last Heard"; + optionsEnumArray[options++] = nodelist_lastheard; + optionsArray[options] = screen->isFrameHidden("nodelist_hopsignal") ? "Show NL - Hops/Signal" : "Hide NL - Hops/Signal"; + optionsEnumArray[options++] = nodelist_hopsignal; + optionsArray[options] = screen->isFrameHidden("nodelist_distance") ? "Show NL - Distance" : "Hide NL - Distance"; + optionsEnumArray[options++] = nodelist_distance; +#endif +#if HAS_GPS + optionsArray[options] = screen->isFrameHidden("nodelist_bearings") ? "Show Bearings" : "Hide Bearings"; + optionsEnumArray[options++] = nodelist_bearings; + + optionsArray[options] = screen->isFrameHidden("gps") ? "Show Position" : "Hide Position"; + optionsEnumArray[options++] = gps; + + optionsArray[options] = screen->isFrameHidden("lora") ? "Show LoRa" : "Hide LoRa"; + optionsEnumArray[options++] = lora; + + optionsArray[options] = screen->isFrameHidden("clock") ? "Show Clock" : "Hide Clock"; + optionsEnumArray[options++] = clock; +#endif -void menuHandler::RestoreAllFrames_menu() -{ - static const char *optionsArray[] = {"Cancel", "Confirm"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Restore All Frames?"; + bannerOptions.message = "Show/Hide Frames"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - screen->restoreAllFrames(); + if (selected == Finish) { + screen->setFrames(Screen::FOCUS_DEFAULT); + } else if (selected == nodelist) { + screen->toggleFrameVisibility("nodelist"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == nodelist_lastheard) { + screen->toggleFrameVisibility("nodelist_lastheard"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == nodelist_hopsignal) { + screen->toggleFrameVisibility("nodelist_hopsignal"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == nodelist_distance) { + screen->toggleFrameVisibility("nodelist_distance"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == nodelist_bearings) { + screen->toggleFrameVisibility("nodelist_bearings"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == gps) { + screen->toggleFrameVisibility("gps"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == lora) { + screen->toggleFrameVisibility("lora"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == clock) { + screen->toggleFrameVisibility("clock"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); @@ -1230,11 +1270,8 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case power_menu: powerMenu(); break; - case hideCurrentFrame: - hideCurrentFrame_menu(); - break; - case RestoreAllFrames: - RestoreAllFrames_menu(); + case FrameToggles: + FrameToggles_menu(); break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index fb2d1cb4f..65c2958aa 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -37,8 +37,7 @@ class menuHandler key_verification_init, key_verification_final_prompt, throttle_message, - hideCurrentFrame, - RestoreAllFrames + FrameToggles }; static screenMenus menuQueue; @@ -74,8 +73,7 @@ class menuHandler static void notificationsMenu(); static void screenOptionsMenu(); static void powerMenu(); - static void hideCurrentFrame_menu(); - static void RestoreAllFrames_menu(); + static void FrameToggles_menu(); private: static void saveUIConfig(); From 228656bc647c2b6f92885545c2917c5ba4ed2e1c Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 20 Jul 2025 18:34:31 -0500 Subject: [PATCH 13/17] Counting is hard sometimes --- src/graphics/draw/MenuHandler.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index f46e77a24..df2779652 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -30,11 +30,10 @@ void menuHandler::loraMenu() BannerOverlayOptions bannerOptions; bannerOptions.message = "LoRa Actions"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 3; + bannerOptions.optionsCount = 2; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Back) { - menuHandler::menuQueue = menuHandler::clock_menu; - screen->runNow(); + // No action } else if (selected == lora_picker) { menuHandler::menuQueue = menuHandler::lora_picker; } @@ -239,7 +238,7 @@ void menuHandler::clockMenu() BannerOverlayOptions bannerOptions; bannerOptions.message = "Clock Action"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 5; + bannerOptions.optionsCount = 4; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Clock) { menuHandler::menuQueue = menuHandler::clock_face_picker; @@ -518,7 +517,7 @@ void menuHandler::nodeListMenu() BannerOverlayOptions bannerOptions; bannerOptions.message = "Node Action"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 5; + bannerOptions.optionsCount = 4; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == Favorite) { menuQueue = add_favorite; From f84217a13be577e246327257dc3e53474fb32477 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 20 Jul 2025 19:45:30 -0500 Subject: [PATCH 14/17] Restore menu options necessary to fundamentally dismiss items --- src/graphics/Screen.cpp | 31 +++++++++++++++++++++++++++++++ src/graphics/Screen.h | 3 +++ src/graphics/draw/MenuHandler.cpp | 4 +++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 085850ba2..3a0996a25 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1152,6 +1152,37 @@ bool Screen::isFrameHidden(const std::string &frameName) const return false; } +// Dismisses the currently displayed screen frame, if possible +// Relevant for text message, waypoint, others in future? +// Triggered with a CardKB keycombo +void Screen::hideCurrentFrame() +{ + uint8_t currentFrame = ui->getUiState()->currentFrame; + bool dismissed = false; + if (currentFrame == framesetInfo.positions.textMessage && devicestate.has_rx_text_message) { + LOG_INFO("Hide Text Message"); + devicestate.has_rx_text_message = false; + memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); + } else if (currentFrame == framesetInfo.positions.waypoint && devicestate.has_rx_waypoint) { + LOG_DEBUG("Hide Waypoint"); + devicestate.has_rx_waypoint = false; + hiddenFrames.waypoint = true; + dismissed = true; + } else if (currentFrame == framesetInfo.positions.wifi) { + LOG_DEBUG("Hide WiFi Screen"); + hiddenFrames.wifi = true; + dismissed = true; + } else if (currentFrame == framesetInfo.positions.lora) { + LOG_INFO("Hide LoRa"); + hiddenFrames.lora = true; + dismissed = true; + } + + if (dismissed) { + setFrames(FOCUS_DEFAULT); // You could also use FOCUS_PRESERVE + } +} + void Screen::handleStartFirmwareUpdateScreen() { LOG_DEBUG("Show firmware screen"); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 0c69cd908..ea4ef7b70 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -590,6 +590,9 @@ class Screen : public concurrency::OSThread /// Draws our SSL cert screen during boot (called from WebServer) void setSSLFrames(); + // Dismiss the currently focussed frame, if possible (e.g. text message, waypoint) + void hideCurrentFrame(); + // Menu-driven Show / Hide Toggle void toggleFrameVisibility(const std::string &frameName); bool isFrameHidden(const std::string &frameName) const; diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index df2779652..09713e50f 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -277,7 +277,9 @@ void menuHandler::messageResponseMenu() bannerOptions.optionsEnumPtr = optionsEnumArray; bannerOptions.optionsCount = options; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Preset) { + if (selected == Dismiss) { + screen->hideCurrentFrame(); + } else if (selected == Preset) { if (devicestate.rx_text_message.to == NODENUM_BROADCAST) { cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, devicestate.rx_text_message.channel); } else { From a97e40dc8e9d07e2f920ca44592d434ed62a7efa Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 20 Jul 2025 20:09:10 -0500 Subject: [PATCH 15/17] Show/Hide Favorites as an option --- src/graphics/Screen.cpp | 41 ++++++++++++++++++------------- src/graphics/Screen.h | 1 + src/graphics/draw/MenuHandler.cpp | 8 ++++++ 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 3a0996a25..ae0a2f836 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1003,27 +1003,29 @@ void Screen::setFrames(FrameFocus focus) if (numMeshNodes > 0) numMeshNodes--; - // Temporary array to hold favorite node frames - std::vector favoriteFrames; + if (!hiddenFrames.show_favorites) { + // Temporary array to hold favorite node frames + std::vector favoriteFrames; - for (size_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { - const meshtastic_NodeInfoLite *n = nodeDB->getMeshNodeByIndex(i); - if (n && n->num != nodeDB->getNodeNum() && n->is_favorite) { - favoriteFrames.push_back(graphics::UIRenderer::drawNodeInfo); + for (size_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { + const meshtastic_NodeInfoLite *n = nodeDB->getMeshNodeByIndex(i); + if (n && n->num != nodeDB->getNodeNum() && n->is_favorite) { + favoriteFrames.push_back(graphics::UIRenderer::drawNodeInfo); + } } - } - // Insert favorite frames *after* collecting them all - if (!favoriteFrames.empty()) { - fsi.positions.firstFavorite = numframes; - for (const auto &f : favoriteFrames) { - normalFrames[numframes++] = f; - indicatorIcons.push_back(icon_node); + // Insert favorite frames *after* collecting them all + if (!favoriteFrames.empty()) { + fsi.positions.firstFavorite = numframes; + for (const auto &f : favoriteFrames) { + normalFrames[numframes++] = f; + indicatorIcons.push_back(icon_node); + } + fsi.positions.lastFavorite = numframes - 1; + } else { + fsi.positions.firstFavorite = 255; + fsi.positions.lastFavorite = 255; } - fsi.positions.lastFavorite = numframes - 1; - } else { - fsi.positions.firstFavorite = 255; - fsi.positions.lastFavorite = 255; } fsi.frameCount = numframes; // Total framecount is used to apply FOCUS_PRESERVE @@ -1122,6 +1124,9 @@ void Screen::toggleFrameVisibility(const std::string &frameName) if (frameName == "clock") { hiddenFrames.clock = !hiddenFrames.clock; } + if (frameName == "show_favorites") { + hiddenFrames.show_favorites = !hiddenFrames.show_favorites; + } } bool Screen::isFrameHidden(const std::string &frameName) const @@ -1148,6 +1153,8 @@ bool Screen::isFrameHidden(const std::string &frameName) const return hiddenFrames.lora; if (frameName == "clock") return hiddenFrames.clock; + if (frameName == "show_favorites") + return hiddenFrames.show_favorites; return false; } diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index ea4ef7b70..2209fd3f4 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -695,6 +695,7 @@ class Screen : public concurrency::OSThread bool gps = false; #endif bool lora = false; + bool show_favorites = false; } hiddenFrames; /// Try to start drawing ASAP diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index d054c2c8c..74e268820 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1103,6 +1103,7 @@ void menuHandler::FrameToggles_menu() gps, lora, clock, + show_favorites, enumEnd }; static const char *optionsArray[enumEnd] = {"Finish"}; @@ -1133,6 +1134,9 @@ void menuHandler::FrameToggles_menu() optionsArray[options] = screen->isFrameHidden("clock") ? "Show Clock" : "Hide Clock"; optionsEnumArray[options++] = clock; + + optionsArray[options] = screen->isFrameHidden("show_favorites") ? "Show Favorites" : "Hide Favorites"; + optionsEnumArray[options++] = show_favorites; #endif BannerOverlayOptions bannerOptions; @@ -1175,6 +1179,10 @@ void menuHandler::FrameToggles_menu() screen->toggleFrameVisibility("clock"); menuHandler::menuQueue = menuHandler::FrameToggles; screen->runNow(); + } else if (selected == show_favorites) { + screen->toggleFrameVisibility("show_favorites"); + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); } }; screen->showOverlayBanner(bannerOptions); From 8eb68598bfb6ddfb58be9e1b4eb3ea57788c7382 Mon Sep 17 00:00:00 2001 From: Jason P Date: Mon, 21 Jul 2025 18:01:38 -0500 Subject: [PATCH 16/17] Don't return to top of the list when toggling values --- src/graphics/draw/MenuHandler.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 74e268820..f71c9a2cd 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1110,6 +1110,9 @@ void menuHandler::FrameToggles_menu() static int optionsEnumArray[enumEnd] = {Finish}; int options = 1; + // Track last selected index (not enum value!) + static int lastSelectedIndex = 0; + #ifndef USE_EINK optionsArray[options] = screen->isFrameHidden("nodelist") ? "Show Node List" : "Hide Node List"; optionsEnumArray[options++] = nodelist; @@ -1144,7 +1147,17 @@ void menuHandler::FrameToggles_menu() bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = options; bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { + bannerOptions.InitialSelected = lastSelectedIndex; // Use index, not enum value + + bannerOptions.bannerCallback = [optionsEnumArray, options](int selected) mutable -> void { + // Find the index of selected in optionsEnumArray + int idx = 0; + for (; idx < options; ++idx) { + if (optionsEnumArray[idx] == selected) + break; + } + lastSelectedIndex = idx; + if (selected == Finish) { screen->setFrames(Screen::FOCUS_DEFAULT); } else if (selected == nodelist) { From 6612b6d387382bdde75efbd721d9e4c184733d62 Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 23 Jul 2025 11:27:38 -0500 Subject: [PATCH 17/17] Don't change VSCode Settings --- .vscode/settings.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a54386544..81deca8f9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,10 +10,5 @@ }, "[powershell]": { "editor.defaultFormatter": "ms-vscode.powershell" - }, - "files.associations": { - "deque": "cpp", - "string": "cpp", - "vector": "cpp" } }