diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 129ba82de..81ab9258b 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -3537,8 +3537,11 @@ void Screen::setFrames(FrameFocus focus) normalFrames[numframes++] = drawLoRaFocused; indicatorIcons.push_back(icon_radio); - normalFrames[numframes++] = drawMemoryScreen; - indicatorIcons.push_back(icon_memory); + if (!dismissedFrames.memory) { + fsi.positions.memory = numframes; + normalFrames[numframes++] = drawMemoryScreen; + indicatorIcons.push_back(icon_memory); + } // then all the nodes // We only show a few nodes in our scrolling list - because meshes with many nodes would have too many screens @@ -3557,13 +3560,13 @@ void Screen::setFrames(FrameFocus focus) // fsi.positions.settings = numframes; // normalFrames[numframes++] = &Screen::drawDebugInfoSettingsTrampoline; - fsi.positions.wifi = numframes; -#if HAS_WIFI && !defined(ARCH_PORTDUINO) - if (isWifiAvailable()) { + #if HAS_WIFI && !defined(ARCH_PORTDUINO) + if (!dismissedFrames.wifi && isWifiAvailable()) { + fsi.positions.wifi = numframes; normalFrames[numframes++] = &Screen::drawDebugInfoWiFiTrampoline; indicatorIcons.push_back(icon_wifi); } -#endif + #endif fsi.frameCount = numframes; // Total framecount is used to apply FOCUS_PRESERVE this->frameCount = numframes; // ✅ Save frame count for use in custom overlay @@ -3627,26 +3630,36 @@ void Screen::dismissCurrentFrame() uint8_t currentFrame = ui->getUiState()->currentFrame; bool dismissed = false; - // Only dismiss if the text message frame is currently valid and visible - if (framesetInfo.positions.textMessage != 255 && currentFrame == framesetInfo.positions.textMessage && - devicestate.has_rx_text_message) { + if (currentFrame == framesetInfo.positions.textMessage && devicestate.has_rx_text_message) { LOG_INFO("Dismiss Text Message"); devicestate.has_rx_text_message = false; - memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); // ✅ clear message + memset(&devicestate.rx_text_message, 0, sizeof(devicestate.rx_text_message)); + dismissedFrames.textMessage = true; dismissed = true; } - else if (currentFrame == framesetInfo.positions.waypoint && devicestate.has_rx_waypoint) { LOG_DEBUG("Dismiss Waypoint"); devicestate.has_rx_waypoint = false; + dismissedFrames.waypoint = true; + dismissed = true; + } + else if (currentFrame == framesetInfo.positions.wifi) { + LOG_DEBUG("Dismiss WiFi Screen"); + dismissedFrames.wifi = true; + dismissed = true; + } + else if (currentFrame == framesetInfo.positions.memory) { + LOG_INFO("Dismiss Memory"); + dismissedFrames.memory = true; dismissed = true; } - // If we did make changes to dismiss, we now need to regenerate the frameset - if (dismissed) - setFrames(); + 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 8d101108f..2c8eff244 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -601,19 +601,27 @@ class Screen : public concurrency::OSThread // - Used to dismiss the currently shown frame (txt; waypoint) by CardKB combo struct FramesetInfo { struct FramePositions { - uint8_t fault = 0; - uint8_t textMessage = 0; - uint8_t waypoint = 0; - uint8_t focusedModule = 0; - uint8_t log = 0; - uint8_t settings = 0; - uint8_t wifi = 0; - uint8_t deviceFocused = 0; + uint8_t fault = 255; + uint8_t textMessage = 255; + uint8_t waypoint = 255; + uint8_t focusedModule = 255; + uint8_t log = 255; + uint8_t settings = 255; + uint8_t wifi = 255; + uint8_t deviceFocused = 255; + uint8_t memory = 255; } positions; uint8_t frameCount = 0; } framesetInfo; + struct DismissedFrames { + bool textMessage = false; + bool waypoint = false; + bool wifi = false; + bool memory = false; + } dismissedFrames; + // Which frame we want to be displayed, after we regen the frameset by calling setFrames enum FrameFocus : uint8_t { FOCUS_DEFAULT, // No specific frame