Switch to concise menu to manage show/hide

This commit is contained in:
Jason P 2025-07-20 18:25:57 -05:00
parent 51c1bcf94c
commit 1881a8529f
4 changed files with 146 additions and 129 deletions

View File

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

View File

@ -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

View File

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

View File

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