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();