feat(color): allow LVGL Lua objects to remain fixed in place within scrolling containers (#7175)

This commit is contained in:
philmoz
2026-03-18 12:21:52 +10:00
committed by GitHub
parent 0731d5f685
commit 5f8a38bb18
2 changed files with 38 additions and 1 deletions
+34 -1
View File
@@ -654,6 +654,8 @@ void LvglWidgetObjectBase::parseParam(lua_State *L, const char *key)
getSizeFunction = ::getRef(L, LUA_REGISTRYINDEX); getSizeFunction = ::getRef(L, LUA_REGISTRYINDEX);
} else if (!strcmp(key, "pos")) { } else if (!strcmp(key, "pos")) {
getPosFunction = ::getRef(L, LUA_REGISTRYINDEX); getPosFunction = ::getRef(L, LUA_REGISTRYINDEX);
} else if (!strcmp(key, "floating")) {
floating = getLuaBool(L);
} }
} }
@@ -746,6 +748,7 @@ void LvglWidgetObjectBase::refresh()
setSize(w, h); setSize(w, h);
setColor(color.flags); setColor(color.flags);
setOpacity(opacity.value); setOpacity(opacity.value);
setFloating(floating);
} }
void LvglWidgetObjectBase::create(lua_State *L, int index) void LvglWidgetObjectBase::create(lua_State *L, int index)
@@ -777,6 +780,17 @@ void LvglSimpleWidgetObject::setSize(coord_t w, coord_t h)
if (lvobj) lv_obj_set_size(lvobj, w, h); if (lvobj) lv_obj_set_size(lvobj, w, h);
} }
void LvglSimpleWidgetObject::setFloating(bool isFloating)
{
floating = isFloating;
if (lvobj) {
if (floating)
lv_obj_add_flag(lvobj, LV_OBJ_FLAG_FLOATING);
else
lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_FLOATING);
}
}
void LvglSimpleWidgetObject::show() void LvglSimpleWidgetObject::show()
{ {
if (!isVisible()) lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_HIDDEN); if (!isVisible()) lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_HIDDEN);
@@ -867,6 +881,7 @@ void LvglWidgetLabel::build(lua_State *L)
setOpacity(opacity.value); setOpacity(opacity.value);
setFont(font.flags); setFont(font.flags);
setAlign(align.flags); setAlign(align.flags);
setFloating(floating);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -922,6 +937,7 @@ void LvglWidgetLineBase::refresh()
{ {
setColor(color.flags); setColor(color.flags);
setOpacity(opacity.value); setOpacity(opacity.value);
setFloating(floating);
setLine(); setLine();
lv_obj_set_style_line_rounded(lvobj, rounded, LV_PART_MAIN); lv_obj_set_style_line_rounded(lvobj, rounded, LV_PART_MAIN);
if (dashGap > 0 && dashWidth > 0) { if (dashGap > 0 && dashWidth > 0) {
@@ -1112,6 +1128,7 @@ void LvglWidgetLine::build(lua_State *L)
setLine(); setLine();
setColor(color.flags); setColor(color.flags);
setOpacity(opacity.value); setOpacity(opacity.value);
setFloating(floating);
} }
} }
@@ -1399,8 +1416,9 @@ void LvglWidgetTriangle::build(lua_State *L)
setPos(x, y); setPos(x, y);
LvglSimpleWidgetObject::setSize(w,h); LvglSimpleWidgetObject::setSize(w,h);
// Set color // Set properties
setColor(color.flags); setColor(color.flags);
setFloating(floating);
} }
} }
@@ -1468,6 +1486,17 @@ void LvglWidgetObject::setSize(coord_t w, coord_t h)
if (window) window->setSize(w, h); if (window) window->setSize(w, h);
} }
void LvglWidgetObject::setFloating(bool isFloating)
{
floating = isFloating;
if (window) {
if (floating)
lv_obj_add_flag(window->getLvObj(), LV_OBJ_FLAG_FLOATING);
else
lv_obj_clear_flag(window->getLvObj(), LV_OBJ_FLAG_FLOATING);
}
}
bool LvglWidgetObject::setFlex() bool LvglWidgetObject::setFlex()
{ {
if (customPad) { if (customPad) {
@@ -1602,6 +1631,7 @@ void LvglWidgetBox::build(lua_State *L)
setPosAndSize(); setPosAndSize();
setColor(color.flags); setColor(color.flags);
setOpacity(opacity.value); setOpacity(opacity.value);
setFloating(floating);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1944,6 +1974,7 @@ void LvglWidgetArc::build(lua_State *L)
setBgColor(bgColor.flags); setBgColor(bgColor.flags);
setOpacity(opacity.value); setOpacity(opacity.value);
setBgOpacity(bgOpacity.value); setBgOpacity(bgOpacity.value);
setFloating(floating);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1991,6 +2022,7 @@ void LvglWidgetImage::build(lua_State *L)
{ {
window = new StaticImage(lvglManager->getCurrentParent(), {x, y, w, h}, window = new StaticImage(lvglManager->getCurrentParent(), {x, y, w, h},
filename.chars(), fillFrame); filename.chars(), fillFrame);
setFloating(floating);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -2009,6 +2041,7 @@ void LvglWidgetQRCode::parseParam(lua_State *L, const char *key)
void LvglWidgetQRCode::build(lua_State *L) void LvglWidgetQRCode::build(lua_State *L)
{ {
window = new QRCode(lvglManager->getCurrentParent(), x, y, w, data, colorToRGB(color.flags), colorToRGB(bgColor)); window = new QRCode(lvglManager->getCurrentParent(), x, y, w, data, colorToRGB(color.flags), colorToRGB(bgColor));
setFloating(floating);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
+4
View File
@@ -264,6 +264,7 @@ class LvglWidgetObjectBase
virtual void setOpacity(uint8_t newOpa) {} virtual void setOpacity(uint8_t newOpa) {}
virtual void setPos(coord_t x, coord_t y) {} virtual void setPos(coord_t x, coord_t y) {}
virtual void setSize(coord_t w, coord_t h) {} virtual void setSize(coord_t w, coord_t h) {}
virtual void setFloating(bool isFloating) {}
void create(lua_State *L, int index); void create(lua_State *L, int index);
void update(lua_State *L); void update(lua_State *L);
@@ -286,6 +287,7 @@ class LvglWidgetObjectBase
int getPosFunction = LUA_REFNIL; int getPosFunction = LUA_REFNIL;
LvglParamFuncOrValue color = { .function = LUA_REFNIL, .flags = COLOR2FLAGS(COLOR_THEME_SECONDARY1_INDEX)}; LvglParamFuncOrValue color = { .function = LUA_REFNIL, .flags = COLOR2FLAGS(COLOR_THEME_SECONDARY1_INDEX)};
LvglParamFuncOrValue opacity = { .function = LUA_REFNIL, .value = LV_OPA_COVER}; LvglParamFuncOrValue opacity = { .function = LUA_REFNIL, .value = LV_OPA_COVER};
bool floating = false;
virtual void build(lua_State *L); virtual void build(lua_State *L);
virtual void refresh(); virtual void refresh();
@@ -322,6 +324,7 @@ class LvglSimpleWidgetObject : public LvglWidgetObjectBase
void setPos(coord_t x, coord_t y) override; void setPos(coord_t x, coord_t y) override;
void setSize(coord_t w, coord_t h) override; void setSize(coord_t w, coord_t h) override;
void setFloating(bool isFloating) override;
Window *getWindow() const override { return nullptr; } Window *getWindow() const override { return nullptr; }
@@ -482,6 +485,7 @@ class LvglWidgetObject : public LvglWidgetObjectBase
void setPos(coord_t x, coord_t y) override; void setPos(coord_t x, coord_t y) override;
void setSize(coord_t w, coord_t h) override; void setSize(coord_t w, coord_t h) override;
void setFloating(bool isFloating) override;
bool callRefs(lua_State *L) override; bool callRefs(lua_State *L) override;
void clearRefs(lua_State *L) override; void clearRefs(lua_State *L) override;