From 3d53ead9016ce7e18acf744b2dd13b8decfb4bd2 Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 18 Jul 2025 23:08:03 -0500 Subject: [PATCH] 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();