diff --git a/radio/src/gui/colorlcd/libui/fullscreen_dialog.cpp b/radio/src/gui/colorlcd/libui/fullscreen_dialog.cpp index d6decbf2c..928a92a49 100644 --- a/radio/src/gui/colorlcd/libui/fullscreen_dialog.cpp +++ b/radio/src/gui/colorlcd/libui/fullscreen_dialog.cpp @@ -160,8 +160,8 @@ void FullScreenDialog::deleteLater(bool detach, bool trash) if (running) { running = false; } else { - Layer::pop(this); Window::deleteLater(detach, trash); + Layer::pop(this); } } diff --git a/radio/src/gui/colorlcd/libui/layer.cpp b/radio/src/gui/colorlcd/libui/layer.cpp index bda3f800e..fba8468d4 100644 --- a/radio/src/gui/colorlcd/libui/layer.cpp +++ b/radio/src/gui/colorlcd/libui/layer.cpp @@ -23,7 +23,7 @@ std::list Layer::stack; Layer::Layer(Window* w, lv_group_t* g) : window(w), group(g) {} Layer::~Layer() { lv_group_del(group); } -static void _assign_lv_group(lv_group_t* g) +void _assign_lv_group(lv_group_t* g) { lv_group_set_default(g); diff --git a/radio/src/gui/colorlcd/libui/mainwindow.cpp b/radio/src/gui/colorlcd/libui/mainwindow.cpp index 32ff835a5..50e0652eb 100644 --- a/radio/src/gui/colorlcd/libui/mainwindow.cpp +++ b/radio/src/gui/colorlcd/libui/mainwindow.cpp @@ -86,8 +86,8 @@ void MainWindow::shutdown() // clear layer stack first for (Window* w = Layer::back(); w; w = Layer::back()) { - Layer::pop(w); w->deleteLater(); + Layer::pop(w); } children.clear(); diff --git a/radio/src/gui/colorlcd/libui/menu.cpp b/radio/src/gui/colorlcd/libui/menu.cpp index 570fe416d..fbe79cce8 100644 --- a/radio/src/gui/colorlcd/libui/menu.cpp +++ b/radio/src/gui/colorlcd/libui/menu.cpp @@ -70,8 +70,6 @@ class MenuBody : public TableField { // Allow encoder acceleration lv_obj_add_flag(lvobj, LV_OBJ_FLAG_ENCODER_ACCEL); - // Add scroll bar if needed - etx_scrollbar(lvobj); setColumnWidth(0, rect.w); diff --git a/radio/src/gui/colorlcd/libui/modal_window.cpp b/radio/src/gui/colorlcd/libui/modal_window.cpp index 6da96e846..804875c5e 100644 --- a/radio/src/gui/colorlcd/libui/modal_window.cpp +++ b/radio/src/gui/colorlcd/libui/modal_window.cpp @@ -57,8 +57,8 @@ ModalWindow::ModalWindow(bool closeWhenClickOutside) : void ModalWindow::deleteLater(bool detach, bool trash) { if (_deleted) return; - Layer::pop(this); Window::deleteLater(detach, trash); + Layer::pop(this); } void ModalWindow::onClicked() diff --git a/radio/src/gui/colorlcd/libui/page.cpp b/radio/src/gui/colorlcd/libui/page.cpp index f3fb23c6d..5e06c4c2f 100644 --- a/radio/src/gui/colorlcd/libui/page.cpp +++ b/radio/src/gui/colorlcd/libui/page.cpp @@ -102,10 +102,10 @@ Page::Page(EdgeTxIcon icon, PaddingSize padding, bool pauseRefresh) : void Page::deleteLater(bool detach, bool trash) { + NavWindow::deleteLater(detach, trash); + Layer::pop(this); Layer::back()->show(); - - NavWindow::deleteLater(detach, trash); } void Page::openMenu() diff --git a/radio/src/gui/colorlcd/libui/table.cpp b/radio/src/gui/colorlcd/libui/table.cpp index b4f8629f2..c8e28c536 100644 --- a/radio/src/gui/colorlcd/libui/table.cpp +++ b/radio/src/gui/colorlcd/libui/table.cpp @@ -177,7 +177,6 @@ TableField::TableField(Window* parent, const rect_t& rect) : { setWindowFlag(OPAQUE); - etx_scrollbar(lvobj); lv_table_set_col_cnt(lvobj, 1); } @@ -306,31 +305,39 @@ bool TableField::onLongPress() return true; } +extern void _assign_lv_group(lv_group_t* g); + void TableField::setAutoEdit() { + if (autoedit) return; + autoedit = true; - lv_group_t* g = (lv_group_t*)lv_obj_get_group(lvobj); - if (g) { - setFocusHandler([=](bool focus) { - if (focus) { - lv_group_set_focus_cb(g, TableField::force_editing); - } else { - lv_group_set_focus_cb(g, nullptr); - } - }); - lv_group_set_editing(g, true); - } + + oldGroup = lv_group_get_default(); + group = lv_group_create(); + lv_group_add_obj(group, lvobj); + _assign_lv_group(group); + + lv_group_set_editing(group, true); + + setFocusHandler([=](bool focus) { + if (focus) { + lv_group_set_focus_cb(group, TableField::force_editing); + } else { + lv_group_set_focus_cb(group, nullptr); + } + }); } void TableField::deleteLater(bool detach, bool trash) { if (!deleted()) { if (autoedit) { - lv_group_t* g = (lv_group_t*)lv_obj_get_group(lvobj); - if (g) { - lv_group_set_focus_cb(g, nullptr); - lv_group_set_editing(g, false); - } + lv_group_del(group); + if (oldGroup) + _assign_lv_group(oldGroup); + else + lv_group_set_default(nullptr); } Window::deleteLater(detach, trash); } diff --git a/radio/src/gui/colorlcd/libui/table.h b/radio/src/gui/colorlcd/libui/table.h index 1ad0bdc99..3cfb75a74 100644 --- a/radio/src/gui/colorlcd/libui/table.h +++ b/radio/src/gui/colorlcd/libui/table.h @@ -60,6 +60,8 @@ class TableField : public Window protected: bool autoedit = false; std::function longPressHandler = nullptr; + lv_group_t* group = nullptr; + lv_group_t* oldGroup = nullptr; void onEvent(event_t event) override; bool onLongPress() override; diff --git a/radio/src/gui/colorlcd/mainview/topbar.cpp b/radio/src/gui/colorlcd/mainview/topbar.cpp index c5629574e..4129a00fb 100644 --- a/radio/src/gui/colorlcd/mainview/topbar.cpp +++ b/radio/src/gui/colorlcd/mainview/topbar.cpp @@ -66,11 +66,11 @@ void SetupTopBarWidgetsPage::onCancel() { deleteLater(); } void SetupTopBarWidgetsPage::deleteLater(bool detach, bool trash) { - Layer::pop(this); - // and continue async deletion... Window::deleteLater(detach, trash); + Layer::pop(this); + // restore screen setting tab on top (PageGroup::ScreenMenu())->setCurrentTab(1); diff --git a/radio/src/gui/colorlcd/mainview/view_main.cpp b/radio/src/gui/colorlcd/mainview/view_main.cpp index 0a4e6aa08..2decdd7e5 100644 --- a/radio/src/gui/colorlcd/mainview/view_main.cpp +++ b/radio/src/gui/colorlcd/mainview/view_main.cpp @@ -101,9 +101,9 @@ ViewMain::~ViewMain() { _instance = nullptr; } void ViewMain::deleteLater(bool detach, bool trash) { + NavWindow::deleteLater(detach, trash); Layer::pop(this); QuickMenu::shutdownQuickMenu(); - NavWindow::deleteLater(detach, trash); } void ViewMain::addMainView(WidgetsContainer* view, uint32_t viewId) diff --git a/radio/src/gui/colorlcd/mainview/widgets_setup.cpp b/radio/src/gui/colorlcd/mainview/widgets_setup.cpp index 9c602c12c..9facaf34a 100644 --- a/radio/src/gui/colorlcd/mainview/widgets_setup.cpp +++ b/radio/src/gui/colorlcd/mainview/widgets_setup.cpp @@ -160,6 +160,8 @@ void SetupWidgetsPage::onCancel() void SetupWidgetsPage::deleteLater(bool detach, bool trash) { + Window::deleteLater(detach, trash); + // restore screen setting tab on top Layer::pop(this); @@ -170,7 +172,6 @@ void SetupWidgetsPage::deleteLater(bool detach, bool trash) viewMain->setCurrentMainView(savedView); viewMain->showTopBarEdgeTxButton(); } - Window::deleteLater(detach, trash); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp b/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp index 64114bce5..aa47da05c 100644 --- a/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp +++ b/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp @@ -193,10 +193,10 @@ void PageGroupBase::deleteLater(bool detach, bool trash) { if (_deleted) return; + NavWindow::deleteLater(detach, trash); + Layer::pop(this); Layer::back()->show(); - - NavWindow::deleteLater(detach, trash); } void PageGroupBase::onClicked() { Keyboard::hide(false); } diff --git a/radio/src/gui/colorlcd/standalone_lua.cpp b/radio/src/gui/colorlcd/standalone_lua.cpp index ffdb0062a..170776c77 100644 --- a/radio/src/gui/colorlcd/standalone_lua.cpp +++ b/radio/src/gui/colorlcd/standalone_lua.cpp @@ -218,6 +218,8 @@ void StandaloneLuaWindow::deleteLater(bool detach, bool trash) luaScriptManager = nullptr; + Window::deleteLater(detach, trash); + Layer::pop(this); Layer::back()->show(); @@ -236,8 +238,6 @@ void StandaloneLuaWindow::deleteLater(bool detach, bool trash) luaState = prevLuaState; luaEmptyEventBuffer(); - - Window::deleteLater(detach, trash); } void StandaloneLuaWindow::checkEvents()