Skip to content

Commit b56c14e

Browse files
philmozpfeerick
authored andcommitted
feat(color): allow LVGL Lua objects to remain fixed in place within scrolling containers (#7175)
1 parent 10b4bb8 commit b56c14e

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

radio/src/lua/lua_lvgl_widget.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,8 @@ void LvglWidgetObjectBase::parseParam(lua_State *L, const char *key)
649649
getSizeFunction = ::getRef(L, LUA_REGISTRYINDEX);
650650
} else if (!strcmp(key, "pos")) {
651651
getPosFunction = ::getRef(L, LUA_REGISTRYINDEX);
652+
} else if (!strcmp(key, "floating")) {
653+
floating = getLuaBool(L);
652654
}
653655
}
654656

@@ -741,6 +743,7 @@ void LvglWidgetObjectBase::refresh()
741743
setSize(w, h);
742744
setColor(color.flags);
743745
setOpacity(opacity.value);
746+
setFloating(floating);
744747
}
745748

746749
void LvglWidgetObjectBase::create(lua_State *L, int index)
@@ -772,6 +775,17 @@ void LvglSimpleWidgetObject::setSize(coord_t w, coord_t h)
772775
if (lvobj) lv_obj_set_size(lvobj, w, h);
773776
}
774777

778+
void LvglSimpleWidgetObject::setFloating(bool isFloating)
779+
{
780+
floating = isFloating;
781+
if (lvobj) {
782+
if (floating)
783+
lv_obj_add_flag(lvobj, LV_OBJ_FLAG_FLOATING);
784+
else
785+
lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_FLOATING);
786+
}
787+
}
788+
775789
void LvglSimpleWidgetObject::show()
776790
{
777791
if (!isVisible()) lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_HIDDEN);
@@ -862,6 +876,7 @@ void LvglWidgetLabel::build(lua_State *L)
862876
setOpacity(opacity.value);
863877
setFont(font.flags);
864878
setAlign(align.flags);
879+
setFloating(floating);
865880
}
866881

867882
//-----------------------------------------------------------------------------
@@ -917,6 +932,7 @@ void LvglWidgetLineBase::refresh()
917932
{
918933
setColor(color.flags);
919934
setOpacity(opacity.value);
935+
setFloating(floating);
920936
setLine();
921937
lv_obj_set_style_line_rounded(lvobj, rounded, LV_PART_MAIN);
922938
if (dashGap > 0 && dashWidth > 0) {
@@ -1107,6 +1123,7 @@ void LvglWidgetLine::build(lua_State *L)
11071123
setLine();
11081124
setColor(color.flags);
11091125
setOpacity(opacity.value);
1126+
setFloating(floating);
11101127
}
11111128
}
11121129

@@ -1394,8 +1411,9 @@ void LvglWidgetTriangle::build(lua_State *L)
13941411
setPos(x, y);
13951412
LvglSimpleWidgetObject::setSize(w,h);
13961413

1397-
// Set color
1414+
// Set properties
13981415
setColor(color.flags);
1416+
setFloating(floating);
13991417
}
14001418
}
14011419

@@ -1463,6 +1481,17 @@ void LvglWidgetObject::setSize(coord_t w, coord_t h)
14631481
if (window) window->setSize(w, h);
14641482
}
14651483

1484+
void LvglWidgetObject::setFloating(bool isFloating)
1485+
{
1486+
floating = isFloating;
1487+
if (window) {
1488+
if (floating)
1489+
lv_obj_add_flag(window->getLvObj(), LV_OBJ_FLAG_FLOATING);
1490+
else
1491+
lv_obj_clear_flag(window->getLvObj(), LV_OBJ_FLAG_FLOATING);
1492+
}
1493+
}
1494+
14661495
bool LvglWidgetObject::setFlex()
14671496
{
14681497
if (customPad) {
@@ -1597,6 +1626,7 @@ void LvglWidgetBox::build(lua_State *L)
15971626
setPosAndSize();
15981627
setColor(color.flags);
15991628
setOpacity(opacity.value);
1629+
setFloating(floating);
16001630
}
16011631

16021632
//-----------------------------------------------------------------------------
@@ -1939,6 +1969,7 @@ void LvglWidgetArc::build(lua_State *L)
19391969
setBgColor(bgColor.flags);
19401970
setOpacity(opacity.value);
19411971
setBgOpacity(bgOpacity.value);
1972+
setFloating(floating);
19421973
}
19431974

19441975
//-----------------------------------------------------------------------------
@@ -1986,6 +2017,7 @@ void LvglWidgetImage::build(lua_State *L)
19862017
{
19872018
window = new StaticImage(lvglManager->getCurrentParent(), {x, y, w, h},
19882019
filename.chars(), fillFrame);
2020+
setFloating(floating);
19892021
}
19902022

19912023
//-----------------------------------------------------------------------------
@@ -2004,6 +2036,7 @@ void LvglWidgetQRCode::parseParam(lua_State *L, const char *key)
20042036
void LvglWidgetQRCode::build(lua_State *L)
20052037
{
20062038
window = new QRCode(lvglManager->getCurrentParent(), x, y, w, data, colorToRGB(color.flags), colorToRGB(bgColor));
2039+
setFloating(floating);
20072040
}
20082041

20092042
//-----------------------------------------------------------------------------

radio/src/lua/lua_lvgl_widget.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ class LvglWidgetObjectBase
264264
virtual void setOpacity(uint8_t newOpa) {}
265265
virtual void setPos(coord_t x, coord_t y) {}
266266
virtual void setSize(coord_t w, coord_t h) {}
267+
virtual void setFloating(bool isFloating) {}
267268

268269
void create(lua_State *L, int index);
269270
void update(lua_State *L);
@@ -286,6 +287,7 @@ class LvglWidgetObjectBase
286287
int getPosFunction = LUA_REFNIL;
287288
LvglParamFuncOrValue color = { .function = LUA_REFNIL, .flags = COLOR2FLAGS(COLOR_THEME_SECONDARY1_INDEX)};
288289
LvglParamFuncOrValue opacity = { .function = LUA_REFNIL, .value = LV_OPA_COVER};
290+
bool floating = false;
289291

290292
virtual void build(lua_State *L);
291293
virtual void refresh();
@@ -322,6 +324,7 @@ class LvglSimpleWidgetObject : public LvglWidgetObjectBase
322324

323325
void setPos(coord_t x, coord_t y) override;
324326
void setSize(coord_t w, coord_t h) override;
327+
void setFloating(bool isFloating) override;
325328

326329
Window *getWindow() const override { return nullptr; }
327330

@@ -482,6 +485,7 @@ class LvglWidgetObject : public LvglWidgetObjectBase
482485

483486
void setPos(coord_t x, coord_t y) override;
484487
void setSize(coord_t w, coord_t h) override;
488+
void setFloating(bool isFloating) override;
485489

486490
bool callRefs(lua_State *L) override;
487491
void clearRefs(lua_State *L) override;

0 commit comments

Comments
 (0)