From dd931bc31b21b4f936843bca879686252d59670a Mon Sep 17 00:00:00 2001 From: philmoz Date: Mon, 9 Feb 2026 10:36:43 +1100 Subject: [PATCH] feat(lua): add 'edited' callback to 'numberEdit' control for LVGL Lua scripts (#7077) --- radio/src/gui/colorlcd/libui/numberedit.cpp | 1 + radio/src/gui/colorlcd/libui/numberedit.h | 6 ++++++ radio/src/lua/lua_lvgl_widget.cpp | 12 +++++++++++- radio/src/lua/lua_lvgl_widget.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/libui/numberedit.cpp b/radio/src/gui/colorlcd/libui/numberedit.cpp index ee1d869e1..8f79f5b74 100644 --- a/radio/src/gui/colorlcd/libui/numberedit.cpp +++ b/radio/src/gui/colorlcd/libui/numberedit.cpp @@ -243,6 +243,7 @@ void NumberEdit::openEdit() lv_obj_get_width(lvobj), lv_obj_get_height(lvobj)}); edit->setChangeHandler([=]() { update(); + if (onEdited) onEdited(currentValue); if (edit->hasFocus()) lv_group_focus_obj(lvobj); edit->hide(); diff --git a/radio/src/gui/colorlcd/libui/numberedit.h b/radio/src/gui/colorlcd/libui/numberedit.h index 1f63d50e2..14d0312e5 100644 --- a/radio/src/gui/colorlcd/libui/numberedit.h +++ b/radio/src/gui/colorlcd/libui/numberedit.h @@ -89,6 +89,11 @@ class NumberEdit : public TextButton _getValue = std::move(handler); } + void setOnEditedHandler(std::function handler) + { + onEdited = std::move(handler); + } + int32_t getValue() const { return _getValue != nullptr ? _getValue() : 0; } protected: @@ -97,6 +102,7 @@ class NumberEdit : public TextButton NumberArea* edit = nullptr; std::function _getValue; std::function _setValue; + std::function onEdited; int vdefault = 0; int vmin; int vmax; diff --git a/radio/src/lua/lua_lvgl_widget.cpp b/radio/src/lua/lua_lvgl_widget.cpp index d0ce15b07..5fddc67df 100644 --- a/radio/src/lua/lua_lvgl_widget.cpp +++ b/radio/src/lua/lua_lvgl_widget.cpp @@ -165,6 +165,7 @@ bool LvglMinMaxParams::parseMinMaxParam(lua_State *L, const char *key) } if (!strcmp(key, "max")) { max = luaL_checkinteger(L, -1); + return true; } return false; } @@ -2159,10 +2160,13 @@ void LvglWidgetTextEdit::build(lua_State *L) void LvglWidgetNumberEdit::parseParam(lua_State *L, const char *key) { if (parseMinMaxParam(L, key)) return; + if (parseGetSetParam(L, key)) return; if (!strcmp(key, "display")) { dispFunction = luaL_ref(L, LUA_REGISTRYINDEX); - } else if (!parseGetSetParam(L, key)) { + } else if (!strcmp(key, "edited")) { + editedFunction = luaL_ref(L, LUA_REGISTRYINDEX); + } else { LvglWidgetObject::parseParam(L, key); } } @@ -2170,6 +2174,7 @@ void LvglWidgetNumberEdit::parseParam(lua_State *L, const char *key) void LvglWidgetNumberEdit::clearRefs(lua_State *L) { clearRef(L, dispFunction); + clearRef(L, editedFunction); clearGetSetRefs(L); LvglWidgetObject::clearRefs(L); } @@ -2202,6 +2207,11 @@ void LvglWidgetNumberEdit::build(lua_State *L) return s; }); } + if (editedFunction != LUA_REFNIL) { + ((NumberEdit*)window)->setOnEditedHandler([=]( int val) { + pcallSetIntVal(L, editedFunction, val); + }); + } } //----------------------------------------------------------------------------- diff --git a/radio/src/lua/lua_lvgl_widget.h b/radio/src/lua/lua_lvgl_widget.h index aa23875b2..111e79834 100644 --- a/radio/src/lua/lua_lvgl_widget.h +++ b/radio/src/lua/lua_lvgl_widget.h @@ -802,6 +802,7 @@ class LvglWidgetNumberEdit : public LvglWidgetObject, public LvglGetSetParams, p protected: int dispFunction = LUA_REFNIL; + int editedFunction = LUA_REFNIL; void build(lua_State *L) override; void parseParam(lua_State *L, const char *key) override;