From b1a2392c158cbadbe10c40ac3dae3fcb1b4c5f22 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 12 Oct 2022 19:04:25 +0200 Subject: [PATCH] fix(color): screen / widget setup This fixes the issue introduced in #2509 which would cause the main view to be hidden while configuring widgets. --- radio/src/gui/colorlcd/menu_screen.cpp | 19 +++++++++++++++---- radio/src/gui/colorlcd/menu_screen.h | 10 +++++----- radio/src/gui/colorlcd/screen_setup.cpp | 14 ++++---------- radio/src/gui/colorlcd/widgets_setup.cpp | 8 +++----- radio/src/gui/colorlcd/widgets_setup.h | 3 +-- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/colorlcd/menu_screen.cpp b/radio/src/gui/colorlcd/menu_screen.cpp index f10375222b6..2e0d2ff979a 100644 --- a/radio/src/gui/colorlcd/menu_screen.cpp +++ b/radio/src/gui/colorlcd/menu_screen.cpp @@ -25,10 +25,10 @@ #include "view_main.h" #include "storage/storage.h" -ScreenMenu::ScreenMenu(): +ScreenMenu::ScreenMenu(int8_t screenIdx): TabsGroup(ICON_THEME) { - updateTabs(); + updateTabs(screenIdx); setCloseHandler([]{ ViewMain::instance()->updateTopbarVisibility(); @@ -36,7 +36,7 @@ ScreenMenu::ScreenMenu(): }); } -void ScreenMenu::updateTabs() +void ScreenMenu::updateTabs(int8_t screenIdx) { removeAllTabs(); @@ -59,7 +59,18 @@ void ScreenMenu::updateTabs() } // set the active tab to the currently shown screen on the MainView - auto view = ViewMain::instance()->getCurrentMainView(); + auto viewMain = ViewMain::instance(); + auto view = viewMain->getCurrentMainView(); + + if (screenIdx >= 0) { + auto views = viewMain->getMainViewsCount(); + if (screenIdx < views) { + view = screenIdx; + } else { + view = views - 1; + } + } + if (view + 1 < getTabs()) setCurrentTab(view + 1); } diff --git a/radio/src/gui/colorlcd/menu_screen.h b/radio/src/gui/colorlcd/menu_screen.h index c4c102ff30f..4743e6bf950 100644 --- a/radio/src/gui/colorlcd/menu_screen.h +++ b/radio/src/gui/colorlcd/menu_screen.h @@ -24,11 +24,11 @@ #include "tabsgroup.h" -class ScreenMenu: public TabsGroup { - - public: - ScreenMenu(); - void updateTabs(); +class ScreenMenu : public TabsGroup +{ + public: + ScreenMenu(int8_t screenIdx = -1); + void updateTabs(int8_t screenIdx); }; #endif // _MENU_SCREEN_H_ diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index e7819a7bce6..86abc1ace32 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -170,7 +170,8 @@ static std::function startWidgetsSetup(ScreenMenu* menu, uint8_t screen_idx) { return [=]() -> uint8_t { - new SetupWidgetsPage(menu, screen_idx); + menu->deleteLater(); + new SetupWidgetsPage(screen_idx); return 0; }; } @@ -190,17 +191,9 @@ static std::function removeScreen(ScreenMenu* menu, // ... and reload loadCustomScreens(); - menu->updateTabs(); // Let's try to stay on the same page - // (first tab is "User interface") - auto pageIdx = screen_idx + 1; - - // Subtract one more as the last one is "New main screen" - if (pageIdx > menu->getTabs() - 2) { - pageIdx = menu->getTabs() - 2; - } - menu->setCurrentTab(pageIdx); + menu->updateTabs(screen_idx); return 0; }; } @@ -283,6 +276,7 @@ void ScreenSetupPage::build(FormWindow * form) lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); lv_obj_set_style_pad_all(obj, 8, LV_PART_MAIN); lv_obj_set_style_radius(obj, 8, LV_PART_MAIN); + lv_group_focus_obj(obj); form->updateSize(); } diff --git a/radio/src/gui/colorlcd/widgets_setup.cpp b/radio/src/gui/colorlcd/widgets_setup.cpp index 89e03163b82..97fc2262881 100644 --- a/radio/src/gui/colorlcd/widgets_setup.cpp +++ b/radio/src/gui/colorlcd/widgets_setup.cpp @@ -74,9 +74,8 @@ void SetupWidgetsPageSlot::paint(BitmapBuffer* dc) } } -SetupWidgetsPage::SetupWidgetsPage(ScreenMenu* menu, uint8_t customScreenIdx) : +SetupWidgetsPage::SetupWidgetsPage(uint8_t customScreenIdx) : FormWindow(ViewMain::instance(), {0, 0, 0, 0}, FORM_FORWARD_FOCUS), - menu(menu), customScreenIdx(customScreenIdx) { Layer::push(this); @@ -88,13 +87,12 @@ SetupWidgetsPage::SetupWidgetsPage(ScreenMenu* menu, uint8_t customScreenIdx) : auto viewMain = ViewMain::instance(); savedView = viewMain->getCurrentMainView(); viewMain->setCurrentMainView(customScreenIdx); - viewMain->bringToTop(); } for (unsigned i = 0; i < screen->getZonesCount(); i++) { auto rect = screen->getZone(i); auto widget_container = customScreens[customScreenIdx]; - auto widget = new SetupWidgetsPageSlot(this, rect, widget_container, i); + new SetupWidgetsPageSlot(this, rect, widget_container, i); } #if defined(HARDWARE_TOUCH) @@ -123,7 +121,6 @@ void SetupWidgetsPage::onCancel() void SetupWidgetsPage::deleteLater(bool detach, bool trash) { // restore screen setting tab on top - menu->bringToTop(); Layer::pop(this); // and continue async deletion... @@ -133,6 +130,7 @@ void SetupWidgetsPage::deleteLater(bool detach, bool trash) viewMain->setCurrentMainView(savedView); } FormWindow::deleteLater(detach, trash); + new ScreenMenu(customScreenIdx); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/colorlcd/widgets_setup.h b/radio/src/gui/colorlcd/widgets_setup.h index bd2804041e3..91f12dadf56 100644 --- a/radio/src/gui/colorlcd/widgets_setup.h +++ b/radio/src/gui/colorlcd/widgets_setup.h @@ -30,7 +30,7 @@ class WidgetsContainer; class SetupWidgetsPage : public FormWindow { public: - SetupWidgetsPage(ScreenMenu* menu, uint8_t customScreenIdx); + SetupWidgetsPage(uint8_t customScreenIdx); #if defined(DEBUG_WINDOWS) std::string getName() const override @@ -44,7 +44,6 @@ class SetupWidgetsPage : public FormWindow void deleteLater(bool detach = true, bool trash = true) override; protected: - ScreenMenu* menu; uint8_t customScreenIdx; unsigned savedView = 0; };