diff --git a/radio/src/gui/colorlcd/menu_screen.cpp b/radio/src/gui/colorlcd/menu_screen.cpp index f10375222b6..b0cda8ce348 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 tabIdx): TabsGroup(ICON_THEME) { - updateTabs(); + updateTabs(tabIdx); setCloseHandler([]{ ViewMain::instance()->updateTopbarVisibility(); @@ -36,7 +36,7 @@ ScreenMenu::ScreenMenu(): }); } -void ScreenMenu::updateTabs() +void ScreenMenu::updateTabs(int8_t tabIdx) { removeAllTabs(); @@ -59,7 +59,16 @@ void ScreenMenu::updateTabs() } // set the active tab to the currently shown screen on the MainView - auto view = ViewMain::instance()->getCurrentMainView(); - if (view + 1 < getTabs()) - setCurrentTab(view + 1); + auto viewMain = ViewMain::instance(); + auto tab = viewMain->getCurrentMainView() + 1; + + if (tabIdx >= 0) { + tab = tabIdx; + } + + auto tabs = getTabs(); + if (tab >= tabs - 1) { + tab = tabs - 2; + } + setCurrentTab(tab); } diff --git a/radio/src/gui/colorlcd/menu_screen.h b/radio/src/gui/colorlcd/menu_screen.h index c4c102ff30f..254f47ad4bd 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 tabIdx = -1); + void updateTabs(int8_t tabIdx); }; #endif // _MENU_SCREEN_H_ diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index e7819a7bce6..a70cd2a41b6 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 + 1); 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/screen_user_interface.cpp b/radio/src/gui/colorlcd/screen_user_interface.cpp index ed2f6a8a4a1..bce9a4962b3 100644 --- a/radio/src/gui/colorlcd/screen_user_interface.cpp +++ b/radio/src/gui/colorlcd/screen_user_interface.cpp @@ -22,6 +22,7 @@ #include "screen_user_interface.h" #include "theme_manager.h" #include "file_preview.h" +#include "menu_screen.h" struct ThemeDetails : public Window { ThemeDetails(Window* parent, ThemeFile* theme) : Window(parent, rect_t{}) @@ -89,6 +90,7 @@ ScreenUserInterfacePage::ScreenUserInterfacePage(ScreenMenu* menu): menu(menu) { } + void ScreenUserInterfacePage::build(FormWindow* form) { FlexGridLayout grid(line_col_dsc, line_row_dsc); @@ -101,7 +103,8 @@ void ScreenUserInterfacePage::build(FormWindow* form) auto menu = this->menu; auto setupTopbarWidgets = new TextButton(line, rect_t{}, STR_SETUP_WIDGETS); setupTopbarWidgets->setPressHandler([menu]() -> uint8_t { - new SetupTopBarWidgetsPage(menu); + menu->deleteLater(); + new SetupTopBarWidgetsPage(); return 0; }); diff --git a/radio/src/gui/colorlcd/topbar.cpp b/radio/src/gui/colorlcd/topbar.cpp index d821842a1a9..3566397f636 100644 --- a/radio/src/gui/colorlcd/topbar.cpp +++ b/radio/src/gui/colorlcd/topbar.cpp @@ -34,7 +34,7 @@ Topbar * TopbarFactory::create(Window * parent) return new TopbarImpl(parent); } -SetupTopBarWidgetsPage::SetupTopBarWidgetsPage(ScreenMenu* menu): +SetupTopBarWidgetsPage::SetupTopBarWidgetsPage(): FormWindow(ViewMain::instance(), rect_t{}, FORM_FORWARD_FOCUS), menu(menu) { @@ -45,7 +45,6 @@ SetupTopBarWidgetsPage::SetupTopBarWidgetsPage(ScreenMenu* menu): // save current view & switch to 1st one viewMain->setCurrentMainView(0); - viewMain->bringToTop(); // adopt the dimensions of the main view setRect(viewMain->getRect()); @@ -79,12 +78,13 @@ void SetupTopBarWidgetsPage::onCancel() void SetupTopBarWidgetsPage::deleteLater(bool detach, bool trash) { - // restore screen setting tab on top - menu->bringToTop(); Layer::pop(this); // and continue async deletion... FormWindow::deleteLater(detach, trash); + // restore screen setting tab on top + new ScreenMenu(0); + storageDirty(EE_MODEL); } diff --git a/radio/src/gui/colorlcd/topbar.h b/radio/src/gui/colorlcd/topbar.h index 9b1e5248847..e0fdcf780e3 100644 --- a/radio/src/gui/colorlcd/topbar.h +++ b/radio/src/gui/colorlcd/topbar.h @@ -45,7 +45,7 @@ class TopbarFactory class SetupTopBarWidgetsPage : public FormWindow { public: - explicit SetupTopBarWidgetsPage(ScreenMenu* menu); + explicit SetupTopBarWidgetsPage(); #if defined(DEBUG_WINDOWS) std::string getName() const override { return "SetupTopBarWidgetsPage"; } diff --git a/radio/src/gui/colorlcd/widgets_setup.cpp b/radio/src/gui/colorlcd/widgets_setup.cpp index 89e03163b82..ab77f25dbd5 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 + 1); 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; };