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..29461ba8 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; } @@ -224,10 +223,6 @@ void MenuScreen::draw(MenuRenderer* renderer) { if (graphicalContext != NULL) { graphicalContext->setActiveItem(NULL); } - - if (frameLifecycle != NULL) { - frameLifecycle->endFrame(); - } } void MenuScreen::syncIndicators(uint8_t index, MenuRenderer* renderer) { @@ -245,6 +240,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()