From 609110a2575d2c304dd780f7201299848a73dfd4 Mon Sep 17 00:00:00 2001 From: philmoz Date: Wed, 7 May 2025 11:45:38 +1000 Subject: [PATCH] feat(color): add 'menu' popup control to Lua API (#6212) --- radio/src/lua/api_colorlcd_lvgl.cpp | 1 + radio/src/lua/lua_lvgl_widget.cpp | 35 +++++++++++++++++++++++++++++ radio/src/lua/lua_lvgl_widget.h | 15 +++++++++++++ 3 files changed, 51 insertions(+) diff --git a/radio/src/lua/api_colorlcd_lvgl.cpp b/radio/src/lua/api_colorlcd_lvgl.cpp index f38b0cc09..d6cf9909c 100644 --- a/radio/src/lua/api_colorlcd_lvgl.cpp +++ b/radio/src/lua/api_colorlcd_lvgl.cpp @@ -369,6 +369,7 @@ LROT_BEGIN(lvgllib, NULL, 0) // Dialogs LROT_FUNCENTRY(confirm, [](lua_State* L) { return luaLvglPopup(L, []() { return new LvglWidgetConfirmDialog(); }); }) LROT_FUNCENTRY(message, [](lua_State* L) { return luaLvglPopup(L, []() { return new LvglWidgetMessageDialog(); }); }) + LROT_FUNCENTRY(menu, [](lua_State* L) { return luaLvglPopup(L, []() { return new LvglWidgetMenu(); }); }) // Object manipulation functions LROT_FUNCENTRY(set, luaLvglSet) LROT_FUNCENTRY(show, luaLvglShow) diff --git a/radio/src/lua/lua_lvgl_widget.cpp b/radio/src/lua/lua_lvgl_widget.cpp index d28251e8e..0c7e9f7d3 100644 --- a/radio/src/lua/lua_lvgl_widget.cpp +++ b/radio/src/lua/lua_lvgl_widget.cpp @@ -2174,6 +2174,41 @@ void LvglWidgetChoice::build(lua_State *L) //----------------------------------------------------------------------------- +void LvglWidgetMenu::parseParam(lua_State *L, const char *key) +{ + if (!strcmp(key, "title")) { + title = luaL_checkstring(L, -1); + } else if (!strcmp(key, "values")) { + luaL_checktype(L, -1, LUA_TTABLE); + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + values.push_back(lua_tostring(L, -1)); + } + } else { + LvglWidgetPicker::parseParam(L, key); + } +} + +void LvglWidgetMenu::build(lua_State *L) +{ + auto menu = new Menu(); + if (!title.empty()) menu->setTitle(title); + + for (int i = 0; i < values.size(); i += 1) { + menu->addLine(values[i], [=]() { + pcallSetIntVal(L, setFunction, i + 1); + }); + } + + int selected = pcallGetIntVal(L, getFunction) - 1; + if (selected >= 0) { + menu->select(selected); + } + + window = menu; +} + +//----------------------------------------------------------------------------- + void LvglWidgetFontPicker::build(lua_State *L) { if (h == LV_SIZE_CONTENT) h = 0; diff --git a/radio/src/lua/lua_lvgl_widget.h b/radio/src/lua/lua_lvgl_widget.h index e3025d57f..8fd49bd55 100644 --- a/radio/src/lua/lua_lvgl_widget.h +++ b/radio/src/lua/lua_lvgl_widget.h @@ -774,6 +774,21 @@ class LvglWidgetChoice : public LvglWidgetPicker //----------------------------------------------------------------------------- +class LvglWidgetMenu : public LvglWidgetPicker +{ + public: + LvglWidgetMenu() : LvglWidgetPicker() {} + + protected: + std::string title; + std::vector values; + + void build(lua_State *L) override; + void parseParam(lua_State *L, const char *key) override; +}; + +//----------------------------------------------------------------------------- + class LvglWidgetFontPicker : public LvglWidgetPicker { public: