From d4b475d87787ec274a00d7ec45964f57691fc147 Mon Sep 17 00:00:00 2001 From: philmoz Date: Thu, 10 Apr 2025 10:05:54 +1000 Subject: [PATCH] feat(color): add additional properties to the Lua LVGL arc object (#6062) --- radio/src/gui/colorlcd/libui/etx_lv_theme.cpp | 30 ++- radio/src/gui/colorlcd/libui/etx_lv_theme.h | 4 + radio/src/gui/colorlcd/widgets/timer.cpp | 2 +- radio/src/lua/lua_lvgl_widget.cpp | 230 +++++++++++------- radio/src/lua/lua_lvgl_widget.h | 40 ++- 5 files changed, 210 insertions(+), 96 deletions(-) diff --git a/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp b/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp index 429d90f08..7f2c1abfc 100644 --- a/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp +++ b/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp @@ -395,7 +395,7 @@ void etx_bg_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, if (colorFlags & RGB_FLAG) { etx_remove_bg_color(obj, selector); lv_obj_set_style_bg_color(obj, - makeLvColor(colorToRGB(colorFlags)), selector); + makeLvColor(colorFlags), selector); } else { lv_obj_remove_local_style_prop(obj, LV_STYLE_BG_COLOR, selector); etx_bg_color(obj, (LcdColorIndex)COLOR_VAL(colorFlags), selector); @@ -423,7 +423,7 @@ void etx_txt_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, if (colorFlags & RGB_FLAG) { etx_remove_txt_color(obj, selector); lv_obj_set_style_text_color(obj, - makeLvColor(colorToRGB(colorFlags)), selector); + makeLvColor(colorFlags), selector); } else { lv_obj_remove_local_style_prop(obj, LV_STYLE_TEXT_COLOR, selector); etx_txt_color(obj, (LcdColorIndex)COLOR_VAL(colorFlags), selector); @@ -460,6 +460,19 @@ void etx_arc_color(lv_obj_t* obj, LcdColorIndex colorIdx, etx_obj_add_style(obj, styles->arc_color[colorIdx], selector); } +void etx_arc_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, + lv_style_selector_t selector) +{ + if (colorFlags & RGB_FLAG) { + etx_remove_arc_color(obj, selector); + lv_obj_set_style_arc_color(obj, + makeLvColor(colorFlags), selector); + } else { + lv_obj_remove_local_style_prop(obj, LV_STYLE_ARC_COLOR, selector); + etx_arc_color(obj, (LcdColorIndex)COLOR_VAL(colorFlags), selector); + } +} + void etx_remove_line_color(lv_obj_t* obj, lv_style_selector_t selector) { // Remove styles @@ -475,6 +488,19 @@ void etx_line_color(lv_obj_t* obj, LcdColorIndex colorIdx, etx_obj_add_style(obj, styles->line_color[colorIdx], selector); } +void etx_line_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, + lv_style_selector_t selector) +{ + if (colorFlags & RGB_FLAG) { + etx_remove_line_color(obj, selector); + lv_obj_set_style_line_color(obj, + makeLvColor(colorFlags), selector); + } else { + lv_obj_remove_local_style_prop(obj, LV_STYLE_LINE_COLOR, selector); + etx_line_color(obj, (LcdColorIndex)COLOR_VAL(colorFlags), selector); + } +} + void etx_remove_img_color(lv_obj_t* obj, lv_style_selector_t selector) { // Remove styles diff --git a/radio/src/gui/colorlcd/libui/etx_lv_theme.h b/radio/src/gui/colorlcd/libui/etx_lv_theme.h index 67a60c603..af580c77d 100644 --- a/radio/src/gui/colorlcd/libui/etx_lv_theme.h +++ b/radio/src/gui/colorlcd/libui/etx_lv_theme.h @@ -186,10 +186,14 @@ void etx_border_color(lv_obj_t* obj, LcdColorIndex colorIdx, void etx_remove_arc_color(lv_obj_t* obj, lv_style_selector_t selector = LV_PART_MAIN); void etx_arc_color(lv_obj_t* obj, LcdColorIndex colorIdx, lv_style_selector_t selector = LV_PART_MAIN); +void etx_arc_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, + lv_style_selector_t selector = LV_PART_MAIN); void etx_remove_line_color(lv_obj_t* obj, lv_style_selector_t selector = LV_PART_MAIN); void etx_line_color(lv_obj_t* obj, LcdColorIndex colorIdx, lv_style_selector_t selector = LV_PART_MAIN); +void etx_line_color_from_flags(lv_obj_t* obj, LcdFlags colorFlags, + lv_style_selector_t selector = LV_PART_MAIN); void etx_remove_img_color(lv_obj_t* obj, lv_style_selector_t selector = LV_PART_MAIN); void etx_img_color(lv_obj_t* obj, LcdColorIndex colorIdx, diff --git a/radio/src/gui/colorlcd/widgets/timer.cpp b/radio/src/gui/colorlcd/widgets/timer.cpp index 71b3432fd..7b4ae0325 100644 --- a/radio/src/gui/colorlcd/widgets/timer.cpp +++ b/radio/src/gui/colorlcd/widgets/timer.cpp @@ -92,7 +92,7 @@ class TimerWidget : public Widget lv_obj_set_style_arc_width(timerArc, TMR_ARC_W, LV_PART_MAIN); lv_obj_set_style_arc_opa(timerArc, LV_OPA_COVER, LV_PART_INDICATOR); lv_obj_set_style_arc_width(timerArc, TMR_ARC_W, LV_PART_INDICATOR); - etx_obj_add_style(timerArc, styles->arc_color[COLOR_THEME_SECONDARY1_INDEX], LV_PART_INDICATOR); + etx_arc_color(timerArc, COLOR_THEME_SECONDARY1_INDEX, LV_PART_INDICATOR); lv_obj_add_flag(timerArc, LV_OBJ_FLAG_HIDDEN); update(); diff --git a/radio/src/lua/lua_lvgl_widget.cpp b/radio/src/lua/lua_lvgl_widget.cpp index 9c187b055..148db81ce 100644 --- a/radio/src/lua/lua_lvgl_widget.cpp +++ b/radio/src/lua/lua_lvgl_widget.cpp @@ -43,6 +43,37 @@ void LvglParamFuncOrValue::parse(lua_State *L, ParamType typ) } } +bool LvglParamFuncOrValue::changedColor(LcdFlags newFlags) +{ + flags = newFlags; + if (flags != currVal) { + currVal = flags; + return true; + } + return false; +} + +bool LvglParamFuncOrValue::changedText(const char* s) +{ + txt = s; + uint32_t h = hash(txt, strlen(txt)); + if (h != currVal) { + currVal = h; + return true; + } + return false; +} + +bool LvglParamFuncOrValue::changedValue(uint32_t v) +{ + value = v; + if (v != currVal) { + currVal = v; + return true; + } + return false; +} + //----------------------------------------------------------------------------- static int pcallcont (lua_State *L, int status, lua_KContext extra) { @@ -424,18 +455,6 @@ void LvglWidgetObjectBase::update(lua_State *L) refresh(); } -bool LvglWidgetObjectBase::colorChanged(LcdFlags newColor) -{ - color.flags = newColor; - LcdFlags c = color.flags; - if (!(c & RGB_FLAG)) - c = COLOR(COLOR_VAL(c)) | RGB_FLAG; // Convert index to RGB - if (currentColor != c) { - currentColor = c; - return true; - } - return false; -} //----------------------------------------------------------------------------- void LvglSimpleWidgetObject::setPos(coord_t x, coord_t y) @@ -506,25 +525,15 @@ void LvglWidgetLabel::clearRefs(lua_State *L) void LvglWidgetLabel::setText(const char *s) { - uint32_t h = hash(s, strlen(s)); - if (h != textHash) { - txt.txt = s; - textHash = h; - if (lvobj) lv_label_set_text(lvobj, s); + if (lvobj && txt.changedText(s)) { + lv_label_set_text(lvobj, txt.txt); } } void LvglWidgetLabel::setColor(LcdFlags newColor) { - if (lvobj && colorChanged(newColor)) { - if (color.flags & RGB_FLAG) { - etx_remove_txt_color(lvobj); - lv_obj_set_style_text_color(lvobj, makeLvColor(color.flags), LV_PART_MAIN); - } else { - lv_obj_remove_local_style_prop(lvobj, LV_STYLE_TEXT_COLOR, LV_PART_MAIN); - etx_txt_color(lvobj, (LcdColorIndex)COLOR_VAL(color.flags)); - } - } + if (lvobj && color.changedColor(newColor)) + etx_txt_color_from_flags(lvobj, color.flags); } void LvglWidgetLabel::setFont(LcdFlags newFont) @@ -581,14 +590,8 @@ void LvglWidgetLineBase::parseParam(lua_State *L, const char *key) void LvglWidgetLineBase::setColor(LcdFlags newColor) { - if (lvobj && colorChanged(newColor)) { - if (color.flags & RGB_FLAG) { - etx_remove_line_color(lvobj); - lv_obj_set_style_line_color(lvobj, makeLvColor(color.flags), LV_PART_MAIN); - } else { - lv_obj_remove_local_style_prop(lvobj, LV_STYLE_LINE_COLOR, LV_PART_MAIN); - etx_line_color(lvobj, (LcdColorIndex)COLOR_VAL(color.flags)); - } + if (lvobj && color.changedColor(newColor)) { + etx_line_color_from_flags(lvobj, color.flags); } } @@ -748,14 +751,8 @@ void LvglWidgetLine::clearRefs(lua_State *L) void LvglWidgetLine::setColor(LcdFlags newColor) { - if (lvobj && colorChanged(newColor)) { - if (color.flags & RGB_FLAG) { - etx_remove_line_color(lvobj); - lv_obj_set_style_line_color(lvobj, makeLvColor(color.flags), LV_PART_MAIN); - } else { - lv_obj_remove_local_style_prop(lvobj, LV_STYLE_LINE_COLOR, LV_PART_MAIN); - etx_line_color(lvobj, (LcdColorIndex)COLOR_VAL(color.flags)); - } + if (lvobj && color.changedColor(newColor)) { + etx_line_color_from_flags(lvobj, color.flags); } } @@ -814,7 +811,7 @@ void LvglWidgetLine::refresh() lv_obj_del(lvobj); lvobj = nullptr; } - currentColor = -1; + color.currVal = -1; build(nullptr); } @@ -890,7 +887,7 @@ void LvglWidgetTriangle::clearRefs(lua_State *L) void LvglWidgetTriangle::setColor(LcdFlags newColor) { - if (lvobj && colorChanged(newColor)) { + if (lvobj && color.changedColor(newColor)) { if (color.flags & RGB_FLAG) { etx_remove_img_color(lvobj); lv_obj_set_style_img_recolor(lvobj, makeLvColor(color.flags), LV_PART_MAIN); @@ -1102,7 +1099,7 @@ void LvglWidgetTriangle::refresh() lv_obj_del(lvobj); lvobj = nullptr; } - currentColor = -1; + color.forceUpdate(); build(nullptr); } @@ -1214,7 +1211,7 @@ void LvglWidgetBorderedObject::parseParam(lua_State *L, const char *key) void LvglWidgetBorderedObject::setColor(LcdFlags newColor) { - if (colorChanged(newColor)) { + if (color.changedColor(newColor)) { if (filled) { etx_bg_color_from_flags(window->getLvObj(), color.flags); } else { @@ -1333,10 +1330,20 @@ void LvglWidgetCircle::build(lua_State *L) void LvglWidgetArc::parseParam(lua_State *L, const char *key) { - if (!strcmp(key, "startAngle")) { + if (!strcmp(key, "rounded")) { + rounded = lua_toboolean(L, -1); + } else if (!strcmp(key, "startAngle")) { startAngle.parse(L); } else if (!strcmp(key, "endAngle")) { endAngle.parse(L); + } else if (!strcmp(key, "bgColor")) { + bgColor.parse(L); + } else if (!strcmp(key, "bgOpacity")) { + bgOpacity.parse(L); + } else if (!strcmp(key, "bgStartAngle")) { + bgStartAngle.parse(L); + } else if (!strcmp(key, "bgEndAngle")) { + bgEndAngle.parse(L); } else { LvglWidgetRoundObject::parseParam(L, key); } @@ -1344,31 +1351,58 @@ void LvglWidgetArc::parseParam(lua_State *L, const char *key) void LvglWidgetArc::setColor(LcdFlags newColor) { - if (colorChanged(newColor)) { - if (color.flags & RGB_FLAG) { - etx_remove_arc_color(window->getLvObj()); - lv_obj_set_style_arc_color(window->getLvObj(), makeLvColor(color.flags), LV_PART_INDICATOR); - } else { - lv_obj_remove_local_style_prop(window->getLvObj(), LV_STYLE_ARC_COLOR, LV_PART_MAIN); - etx_arc_color(window->getLvObj(), (LcdColorIndex)COLOR_VAL(color.flags), LV_PART_INDICATOR); - } + if (color.changedColor(newColor)) { + etx_arc_color_from_flags(window->getLvObj(), color.flags, LV_PART_INDICATOR); + } +} + +void LvglWidgetArc::setBgColor(LcdFlags newColor) +{ + if (bgColor.changedColor(newColor)) { + etx_arc_color_from_flags(window->getLvObj(), bgColor.flags, LV_PART_MAIN); } } void LvglWidgetArc::setOpacity(uint8_t newOpa) { - opacity.value = newOpa; - lv_obj_set_style_arc_opa(window->getLvObj(), opacity.value, LV_PART_INDICATOR); + if (opacity.changedValue(newOpa)) { + lv_obj_set_style_arc_opa(window->getLvObj(), opacity.value, LV_PART_INDICATOR); + } +} + +void LvglWidgetArc::setBgOpacity(uint8_t newOpa) +{ + if (bgOpacity.changedValue(newOpa)) { + lv_obj_set_style_arc_opa(window->getLvObj(), bgOpacity.value, LV_PART_MAIN); + } } void LvglWidgetArc::setStartAngle(coord_t angle) { - lv_arc_set_start_angle(window->getLvObj(), angle); + if (startAngle.changedValue(angle)) { + lv_arc_set_start_angle(window->getLvObj(), startAngle.coord); + } +} + +void LvglWidgetArc::setBgStartAngle(coord_t angle) +{ + if (bgStartAngle.changedValue(angle)) { + lv_arc_set_bg_start_angle(window->getLvObj(), bgStartAngle.coord); + } } void LvglWidgetArc::setEndAngle(coord_t angle) { - lv_arc_set_end_angle(window->getLvObj(), angle); + if (endAngle.changedValue(angle)) { + lv_arc_set_end_angle(window->getLvObj(), endAngle.coord); + } +} + +void LvglWidgetArc::setBgEndAngle(coord_t angle) +{ + if (bgEndAngle.changedValue(angle)) { + lv_arc_set_bg_end_angle(window->getLvObj(), bgEndAngle.coord); + } } bool LvglWidgetArc::callRefs(lua_State *L) @@ -1379,6 +1413,12 @@ bool LvglWidgetArc::callRefs(lua_State *L) if (!pcallUpdate1Int(L, endAngle.function, [=](int val) { setEndAngle(val); })) return false; + if (!pcallUpdate1Int(L, bgStartAngle.function, + [=](int val) { setBgStartAngle(val); })) + return false; + if (!pcallUpdate1Int(L, bgEndAngle.function, + [=](int val) { setBgEndAngle(val); })) + return false; return LvglWidgetRoundObject::callRefs(L); } @@ -1386,6 +1426,10 @@ void LvglWidgetArc::clearRefs(lua_State *L) { clearRef(L, startAngle.function); clearRef(L, endAngle.function); + clearRef(L, bgColor.function); + clearRef(L, bgOpacity.function); + clearRef(L, bgStartAngle.function); + clearRef(L, bgEndAngle.function); LvglWidgetRoundObject::clearRefs(L); } @@ -1399,16 +1443,20 @@ void LvglWidgetArc::build(lua_State *L) new Window(lvglManager->getCurrentParent(), {x, y, w, h}, lv_arc_create); lv_obj_add_flag(window->getLvObj(), LV_OBJ_FLAG_EVENT_BUBBLE); lv_obj_clear_flag(window->getLvObj(), LV_OBJ_FLAG_CLICKABLE); - setColor(color.flags); - lv_arc_set_bg_angles(window->getLvObj(), 0, 360); lv_arc_set_range(window->getLvObj(), 0, 360); - lv_arc_set_angles(window->getLvObj(), 0, 360); + lv_obj_remove_style(window->getLvObj(), NULL, LV_PART_KNOB); + lv_obj_set_style_arc_width(window->getLvObj(), thickness, LV_PART_MAIN); + lv_obj_set_style_arc_rounded(window->getLvObj(), rounded, LV_PART_MAIN); + lv_obj_set_style_arc_width(window->getLvObj(), thickness, LV_PART_INDICATOR); + lv_obj_set_style_arc_rounded(window->getLvObj(), rounded, LV_PART_INDICATOR); + setBgStartAngle(bgStartAngle.coord); + setBgEndAngle(bgEndAngle.coord); setStartAngle(startAngle.coord); setEndAngle(endAngle.coord); - lv_obj_remove_style(window->getLvObj(), NULL, LV_PART_KNOB); - lv_obj_set_style_arc_opa(window->getLvObj(), LV_OPA_TRANSP, LV_PART_MAIN); - lv_obj_set_style_arc_width(window->getLvObj(), thickness, LV_PART_INDICATOR); + setColor(color.flags); + setBgColor(bgColor.flags); setOpacity(opacity.value); + setBgOpacity(bgOpacity.value); } //----------------------------------------------------------------------------- @@ -1453,13 +1501,13 @@ void LvglWidgetQRCode::build(lua_State *L) void LvglWidgetTextButtonBase::parseParam(lua_State *L, const char *key) { if (!strcmp(key, "text")) { - txt = luaL_checkstring(L, -1); + txt.parse(L, LvglParamFuncOrValue::PTXT); } else if (!strcmp(key, "font")) { font = luaL_checkunsigned(L, -1); } else if (!strcmp(key, "cornerRadius")) { rounded = luaL_checkunsigned(L, -1); } else if (!strcmp(key, "textColor")) { - textColor = luaL_checkunsigned(L, -1); + textColor.parse(L); } else if (!strcmp(key, "press")) { pressFunction = luaL_ref(L, LUA_REGISTRYINDEX); } else { @@ -1467,18 +1515,35 @@ void LvglWidgetTextButtonBase::parseParam(lua_State *L, const char *key) } } +bool LvglWidgetTextButtonBase::callRefs(lua_State *L) +{ + int t = lua_gettop(L); + if (txt.function != LUA_REFNIL) { + if (pcallFunc(L, txt.function, 1)) { + const char *s = luaL_checkstring(L, -1); + setText(s); + lua_settop(L, t); + } else { + return false; + } + } + if (!pcallUpdate1Int(L, textColor.function, + [=](int color) { setTextColor(color); })) + return false; + return LvglWidgetObject::callRefs(L); +} + void LvglWidgetTextButtonBase::clearRefs(lua_State *L) { + clearRef(L, txt.function); + clearRef(L, textColor.function); clearRef(L, pressFunction); LvglWidgetObject::clearRefs(L); } void LvglWidgetTextButtonBase::setText(const char *s) { - uint32_t h = hash(s, strlen(s)); - if (h != textHash) { - txt = s; - textHash = h; + if (txt.changedText(s)) { ((TextButton *)window)->setText(s); } } @@ -1492,14 +1557,15 @@ void LvglWidgetTextButtonBase::setSize(coord_t w, coord_t h) void LvglWidgetTextButtonBase::setColor(LcdFlags newColor) { - color.flags = newColor; - if (color.flags != currentColor) { - currentColor = color.flags; + if (color.changedColor(newColor)) { etx_bg_color_from_flags(window->getLvObj(), color.flags); } - if (textColor != currentTextColor) { - currentTextColor = textColor; - etx_txt_color_from_flags(window->getLvObj(), textColor); +} + +void LvglWidgetTextButtonBase::setTextColor(LcdFlags newColor) +{ + if (textColor.changedColor(newColor)) { + etx_txt_color_from_flags(window->getLvObj(), textColor.flags); } } @@ -1549,7 +1615,7 @@ void LvglWidgetTextButton::build(lua_State *L) { if (h == LV_SIZE_CONTENT) h = 0; auto btn = - new TextButton(lvglManager->getCurrentParent(), {x, y, w, h}, txt, [=]() { + new TextButton(lvglManager->getCurrentParent(), {x, y, w, h}, txt.txt, [=]() { return pcallGetOptIntVal(L, pressFunction, 0); }); if (longPressFunction != LUA_REFNIL) { @@ -1561,6 +1627,7 @@ void LvglWidgetTextButton::build(lua_State *L) setFont(font); setChecked(checked); setColor(color.flags); + setTextColor(textColor.flags); setRounded(); } @@ -1593,7 +1660,7 @@ void LvglWidgetMomentaryButton::build(lua_State *L) { if (h == LV_SIZE_CONTENT) h = 0; window = - new MomentaryButton(lvglManager->getCurrentParent(), {x, y, w, h}, txt, + new MomentaryButton(lvglManager->getCurrentParent(), {x, y, w, h}, txt.txt, [=]() { pcallSimpleFunc(L, pressFunction); }, @@ -1602,6 +1669,7 @@ void LvglWidgetMomentaryButton::build(lua_State *L) }); setFont(font); setColor(color.flags); + setTextColor(textColor.flags); setRounded(); } @@ -1756,9 +1824,7 @@ void LvglWidgetSliderBase::parseParam(lua_State *L, const char *key) void LvglWidgetSliderBase::setColor(LcdFlags newColor) { - color.flags = newColor; - if (color.flags != currentColor) { - currentColor = color.flags; + if (color.changedColor(newColor)) { ((SliderBase*)window)->setColor(color.flags); } } diff --git a/radio/src/lua/lua_lvgl_widget.h b/radio/src/lua/lua_lvgl_widget.h index 74580f5a0..4aabc04f3 100644 --- a/radio/src/lua/lua_lvgl_widget.h +++ b/radio/src/lua/lua_lvgl_widget.h @@ -45,7 +45,13 @@ struct LvglParamFuncOrValue uint32_t value; }; + uint32_t currVal = -1; + void parse(lua_State *L, ParamType typ = PVALUE); + void forceUpdate() { currVal = -1; } + bool changedColor(LcdFlags newFlags); + bool changedText(const char* s); + bool changedValue(uint32_t v); }; //----------------------------------------------------------------------------- @@ -91,7 +97,6 @@ class LvglWidgetObjectBase bool clearRequest = false; LuaScriptManager *lvglManager = nullptr; coord_t x = 0, y = 0, w = LV_SIZE_CONTENT, h = LV_SIZE_CONTENT; - LcdFlags currentColor = -1; int getVisibleFunction = LUA_REFNIL; int getSizeFunction = LUA_REFNIL; int getPosFunction = LUA_REFNIL; @@ -105,8 +110,6 @@ class LvglWidgetObjectBase void getParams(lua_State *L, int index); - bool colorChanged(LcdFlags newColor); - void clearRef(lua_State *L, int& ref); void pcallSimpleFunc(lua_State *L, int funcRef); @@ -156,8 +159,6 @@ class LvglWidgetLabel : public LvglSimpleWidgetObject void clearRefs(lua_State *L) override; protected: - uint32_t textHash = -1; - LvglParamFuncOrValue font = { .function = LUA_REFNIL, .flags = FONT(STD)}; LvglParamFuncOrValue align = { .function = LUA_REFNIL, .flags = LEFT}; LvglParamFuncOrValue txt = { .function = LUA_REFNIL, .txt = ""}; @@ -414,16 +415,25 @@ class LvglWidgetArc : public LvglWidgetRoundObject LvglWidgetArc() : LvglWidgetRoundObject() {} void setColor(LcdFlags newColor) override; + void setBgColor(LcdFlags newColor); void setOpacity(uint8_t newOpa) override; + void setBgOpacity(uint8_t newOpa); void setStartAngle(coord_t angle); void setEndAngle(coord_t angle); + void setBgStartAngle(coord_t angle); + void setBgEndAngle(coord_t angle); bool callRefs(lua_State *L) override; void clearRefs(lua_State *L) override; protected: + bool rounded = false; LvglParamFuncOrValue startAngle = { .function = LUA_REFNIL, .coord = 0}; - LvglParamFuncOrValue endAngle = { .function = LUA_REFNIL, .coord = 0}; + LvglParamFuncOrValue endAngle = { .function = LUA_REFNIL, .coord = 360}; + LvglParamFuncOrValue bgColor = { .function = LUA_REFNIL, .flags = (LcdFlags)-1}; + LvglParamFuncOrValue bgOpacity = { .function = LUA_REFNIL, .value = LV_OPA_TRANSP}; + LvglParamFuncOrValue bgStartAngle = { .function = LUA_REFNIL, .coord = 0}; + LvglParamFuncOrValue bgEndAngle = { .function = LUA_REFNIL, .coord = 360}; void build(lua_State *L) override; void parseParam(lua_State *L, const char *key) override; @@ -431,6 +441,10 @@ class LvglWidgetArc : public LvglWidgetRoundObject { setStartAngle(startAngle.coord); setEndAngle(endAngle.coord); + setBgStartAngle(bgStartAngle.coord); + setBgEndAngle(bgEndAngle.coord); + setBgColor(bgColor.flags); + setBgOpacity(bgOpacity.value); LvglWidgetRoundObject::refresh(); } }; @@ -478,21 +492,25 @@ class LvglWidgetTextButtonBase : public LvglWidgetObject void setText(const char *s); void setSize(coord_t w, coord_t h) override; void setColor(LcdFlags newColor) override; + void setTextColor(LcdFlags newColor); void setRounded(); + bool callRefs(lua_State *L) override; void clearRefs(lua_State *L) override; protected: - uint32_t textHash = -1; - - const char *txt = ""; + LvglParamFuncOrValue txt = { .function = LUA_REFNIL, .txt = ""}; LcdFlags font = FONT(STD); coord_t rounded = -1; - LcdFlags textColor = -1; - LcdFlags currentTextColor = -1; + LvglParamFuncOrValue textColor = { .function = LUA_REFNIL, .flags = (LcdFlags)-1}; int pressFunction = LUA_REFNIL; void parseParam(lua_State *L, const char *key) override; + void refresh() override + { + setTextColor(textColor.flags); + LvglWidgetObject::refresh(); + } }; //-----------------------------------------------------------------------------