From 3ee1b05ea810194fa4ba8fa42676f8607c856019 Mon Sep 17 00:00:00 2001 From: forntoh Date: Tue, 26 May 2026 19:04:10 +0200 Subject: [PATCH 1/2] feat: centralize graphical frame lifecycle --- src/LcdMenu.cpp | 18 ++++++++++++++++++ src/MenuScreen.cpp | 5 +---- test/LcdMenu.cpp | 35 ++++++++++++++++++++--------------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/LcdMenu.cpp b/src/LcdMenu.cpp index d26d9522..6f9166df 100644 --- a/src/LcdMenu.cpp +++ b/src/LcdMenu.cpp @@ -20,6 +20,10 @@ void LcdMenu::setScreen(MenuScreen* screen) { this->screen = screen; renderer.display->clear(); this->screen->reset(&renderer); + FrameLifecycleRenderer* frame = frameLifecycle(renderer); + if (frame != NULL) { + frame->endFrame(); + } } bool LcdMenu::process(const unsigned char c) { @@ -28,6 +32,12 @@ bool LcdMenu::process(const unsigned char c) { } renderer.restartTimer(); bool handled = screen->process(this, c); + if (handled) { + FrameLifecycleRenderer* frame = frameLifecycle(renderer); + if (frame != NULL) { + frame->endFrame(); + } + } return handled; }; @@ -50,6 +60,10 @@ void LcdMenu::show() { enabled = true; renderer.display->clear(); screen->draw(&renderer); + FrameLifecycleRenderer* frame = frameLifecycle(renderer); + if (frame != NULL) { + frame->endFrame(); + } } uint8_t LcdMenu::getCursor() { @@ -72,6 +86,10 @@ void LcdMenu::refresh() { return; } screen->draw(&renderer); + FrameLifecycleRenderer* frame = frameLifecycle(renderer); + if (frame != NULL) { + frame->endFrame(); + } } void LcdMenu::poll(uint16_t pollInterval) { diff --git a/src/MenuScreen.cpp b/src/MenuScreen.cpp index 21fc9be8..700b5507 100644 --- a/src/MenuScreen.cpp +++ b/src/MenuScreen.cpp @@ -191,7 +191,6 @@ void MenuScreen::draw(MenuRenderer* renderer) { if (frameLifecycle != NULL) { frameLifecycle->beginFrame(); - frameLifecycle->endFrame(); } return; } @@ -225,9 +224,6 @@ void MenuScreen::draw(MenuRenderer* renderer) { graphicalContext->setActiveItem(NULL); } - if (frameLifecycle != NULL) { - frameLifecycle->endFrame(); - } } void MenuScreen::syncIndicators(uint8_t index, MenuRenderer* renderer) { @@ -245,6 +241,7 @@ bool MenuScreen::process(LcdMenu* menu, const unsigned char command) { if (graphicalContext != NULL) { graphicalContext->setActiveItem(NULL); + graphicalContext->setViewportContext(view, items.size()); } if (!items.empty()) { diff --git a/test/LcdMenu.cpp b/test/LcdMenu.cpp index 809ac96f..14a5ed4f 100644 --- a/test/LcdMenu.cpp +++ b/test/LcdMenu.cpp @@ -296,29 +296,18 @@ unittest(refresh_flushes_renderer_frame) { assertEqual((uint8_t)1, renderer.endFrameCalls); } -unittest(process_flushes_renderer_when_back_navigates_and_redraws) { +unittest(process_flushes_renderer_when_command_handled) { TrackingRenderer renderer; LcdMenu menu(renderer); - MenuItem* parentItem = ITEM_BASIC("Parent"); - MenuItem* childItem = ITEM_BASIC("Child"); - std::vector parentItems = {parentItem}; - std::vector childItems = {childItem}; - MenuScreen parent(parentItems); - MenuScreen child(childItems); - child.setParent(&parent); - menu.setScreen(&child); + menu.setScreen(mainScreen); + menu.setCursor(ITEM_TOGGLE_INDEX); MenuItem::endEdit(); - renderer.beginFrameCalls = 0; renderer.endFrameCalls = 0; - assertTrue(menu.process(BACK)); - assertEqual((uint8_t)1, renderer.beginFrameCalls); + assertTrue(menu.process(ENTER)); assertEqual((uint8_t)1, renderer.endFrameCalls); - - delete parentItem; - delete childItem; } unittest(poll_flushes_renderer_when_polled_item_redraws) { @@ -354,4 +343,20 @@ unittest(set_screen_skips_initial_label) { delete item; } +unittest(set_screen_flushes_renderer_frame) { + MenuItem* item = ITEM_BASIC("Run"); + std::vector items = {item}; + MenuScreen screen(items); + TrackingRenderer renderer; + LcdMenu menu(renderer); + + renderer.beginFrameCalls = 0; + renderer.endFrameCalls = 0; + menu.setScreen(&screen); + + assertEqual((uint8_t)1, renderer.beginFrameCalls); + assertEqual((uint8_t)1, renderer.endFrameCalls); + delete item; +} + unittest_main() From f85d2b786acf192e847520c97dcb394a95c3f4a2 Mon Sep 17 00:00:00 2001 From: forntoh Date: Tue, 26 May 2026 19:07:42 +0200 Subject: [PATCH 2/2] style: format menu screen lifecycle change --- src/MenuScreen.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MenuScreen.cpp b/src/MenuScreen.cpp index 700b5507..29461ba8 100644 --- a/src/MenuScreen.cpp +++ b/src/MenuScreen.cpp @@ -223,7 +223,6 @@ void MenuScreen::draw(MenuRenderer* renderer) { if (graphicalContext != NULL) { graphicalContext->setActiveItem(NULL); } - } void MenuScreen::syncIndicators(uint8_t index, MenuRenderer* renderer) {