From 93c5b7fccd45e07969e34b2f60b1acc0f6a00e11 Mon Sep 17 00:00:00 2001 From: philmoz Date: Wed, 16 Apr 2025 11:40:13 +1000 Subject: [PATCH] feat(lua): allow the filename for an image object to be set via a function (#6091) --- radio/src/lua/lua_lvgl_widget.cpp | 27 +++++++++++++++++++++++++-- radio/src/lua/lua_lvgl_widget.h | 5 ++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/radio/src/lua/lua_lvgl_widget.cpp b/radio/src/lua/lua_lvgl_widget.cpp index 148db81ce..88571fcf9 100644 --- a/radio/src/lua/lua_lvgl_widget.cpp +++ b/radio/src/lua/lua_lvgl_widget.cpp @@ -1464,7 +1464,7 @@ void LvglWidgetArc::build(lua_State *L) void LvglWidgetImage::parseParam(lua_State *L, const char *key) { if (!strcmp(key, "file")) { - filename = luaL_checkstring(L, -1); + filename.parse(L, LvglParamFuncOrValue::PTXT); } else if (!strcmp(key, "fill")) { fillFrame = lua_toboolean(L, -1); } else { @@ -1472,10 +1472,33 @@ void LvglWidgetImage::parseParam(lua_State *L, const char *key) } } +bool LvglWidgetImage::callRefs(lua_State *L) +{ + int t = lua_gettop(L); + if (filename.function != LUA_REFNIL) { + if (pcallFunc(L, filename.function, 1)) { + const char *s = luaL_checkstring(L, -1); + if (filename.changedText(s)) { + ((StaticImage*)window)->setSource(filename.txt); + } + lua_settop(L, t); + } else { + return false; + } + } + return LvglWidgetObject::callRefs(L); +} + +void LvglWidgetImage::clearRefs(lua_State *L) +{ + clearRef(L, filename.function); + LvglWidgetObject::clearRefs(L); +} + void LvglWidgetImage::build(lua_State *L) { window = new StaticImage(lvglManager->getCurrentParent(), {x, y, w, h}, - filename.c_str(), fillFrame); + filename.txt, fillFrame); } //----------------------------------------------------------------------------- diff --git a/radio/src/lua/lua_lvgl_widget.h b/radio/src/lua/lua_lvgl_widget.h index 4aabc04f3..8a070ee21 100644 --- a/radio/src/lua/lua_lvgl_widget.h +++ b/radio/src/lua/lua_lvgl_widget.h @@ -456,8 +456,11 @@ class LvglWidgetImage : public LvglWidgetObject public: LvglWidgetImage() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {} + bool callRefs(lua_State *L) override; + void clearRefs(lua_State *L) override; + protected: - std::string filename; + LvglParamFuncOrValue filename = { .function = LUA_REFNIL, .txt = ""}; bool fillFrame = false; void build(lua_State *L) override;