feat(lua): add lvgl.page(), add optional parent property to lvgl.build() (#5407)
This commit is contained in:
@@ -105,7 +105,6 @@ set(LVGL_SOURCES
|
||||
extra/widgets/keyboard/lv_keyboard.c
|
||||
extra/widgets/list/lv_list.c
|
||||
extra/widgets/menu/lv_menu.c
|
||||
extra/widgets/meter/lv_meter.c
|
||||
extra/widgets/tabview/lv_tabview.c
|
||||
extra/widgets/tileview/lv_tileview.c
|
||||
extra/widgets/win/lv_win.c
|
||||
|
||||
@@ -606,7 +606,7 @@
|
||||
|
||||
#define LV_USE_MENU 0
|
||||
|
||||
#define LV_USE_METER 1
|
||||
#define LV_USE_METER 0
|
||||
|
||||
#define LV_USE_MSGBOX 0
|
||||
|
||||
|
||||
@@ -44,69 +44,101 @@ static int luaLvglObj(lua_State *L, std::function<LvglWidgetObject*()> create, b
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int luaLvglObjEx(lua_State *L, std::function<LvglWidgetObject*()> create, bool standalone = false)
|
||||
{
|
||||
if (luaLvglManager && (!standalone || !luaLvglManager->isWidget())) {
|
||||
LvglWidgetObject* p = nullptr;
|
||||
Window* prevParent = nullptr;
|
||||
if (lua_gettop(L) == 2) {
|
||||
p = LvglWidgetObject::checkLvgl(L, 1);
|
||||
if (p) {
|
||||
prevParent = luaLvglManager->getTempParent();
|
||||
luaLvglManager->setTempParent(p->getWindow());
|
||||
}
|
||||
}
|
||||
|
||||
auto obj = create();
|
||||
obj->getParams(L, -1);
|
||||
obj->build(L);
|
||||
obj->push(L);
|
||||
|
||||
if (p)
|
||||
luaLvglManager->setTempParent((prevParent));
|
||||
} else {
|
||||
lua_pushnil(L);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int luaLvglLabel(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetLabel(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetLabel(); });
|
||||
}
|
||||
|
||||
static int luaLvglRectangle(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetRectangle(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetRectangle(); });
|
||||
}
|
||||
|
||||
static int luaLvglCircle(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetCircle(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetCircle(); });
|
||||
}
|
||||
|
||||
static int luaLvglArc(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetArc(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetArc(); });
|
||||
}
|
||||
|
||||
static int luaLvglImage(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetImage(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetImage(); });
|
||||
}
|
||||
|
||||
static int luaLvglQRCode(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetQRCode(); });
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetQRCode(); });
|
||||
}
|
||||
|
||||
static int luaLvglMeter(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetMeter(); });
|
||||
}
|
||||
// static int luaLvglMeter(lua_State *L)
|
||||
// {
|
||||
// return luaLvglObjEx(L, [=]() { return new LvglWidgetMeter(); });
|
||||
// }
|
||||
|
||||
static int luaLvglButton(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetTextButton(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetTextButton(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglToggle(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetToggleSwitch(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetToggleSwitch(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglTextEdit(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetTextEdit(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetTextEdit(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglNumberEdit(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetNumberEdit(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetNumberEdit(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglChoice(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetChoice(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetChoice(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglSlider(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetSlider(); }, true);
|
||||
return luaLvglObjEx(L, [=]() { return new LvglWidgetSlider(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglPage(lua_State *L)
|
||||
{
|
||||
return luaLvglObj(L, [=]() { return new LvglWidgetPage(); }, true);
|
||||
}
|
||||
|
||||
static int luaLvglConfirm(lua_State *L)
|
||||
@@ -125,14 +157,6 @@ LvglWidgetObject *LvglWidgetObject::checkLvgl(lua_State *L, int index)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static LvglWidgetObject *optLvgl(lua_State *L, int index)
|
||||
{
|
||||
LvglWidgetObject **p =
|
||||
(LvglWidgetObject **)luaL_testudata(L, index, LVGL_METATABLE);
|
||||
if (p) return *p;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static int luaDestroyLvglWidget(lua_State *L)
|
||||
{
|
||||
auto p = LvglWidgetObject::checkLvgl(L, 1);
|
||||
@@ -150,18 +174,17 @@ static int luaLvglSet(lua_State *L)
|
||||
}
|
||||
|
||||
static int luaLvglClear(lua_State *L)
|
||||
{
|
||||
if (luaLvglManager) luaLvglManager->clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int luaLvglSetParent(lua_State *L)
|
||||
{
|
||||
if (luaLvglManager) {
|
||||
auto p = optLvgl(L, 1);
|
||||
luaLvglManager->setTempParent(p ? p->getWindow() : nullptr);
|
||||
if (lua_gettop(L) == 1) {
|
||||
auto p = LvglWidgetObject::checkLvgl(L, 1);
|
||||
if (p)
|
||||
p->getWindow()->clear();
|
||||
} else {
|
||||
luaLvglManager->clear();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -224,8 +247,8 @@ static void buildLvgl(lua_State *L, int srcIndex, int refIndex)
|
||||
lvobj = new LvglWidgetImage();
|
||||
else if (strcasecmp(p.type, "qrcode") == 0)
|
||||
lvobj = new LvglWidgetQRCode();
|
||||
else if (strcasecmp(p.type, "meter") == 0)
|
||||
lvobj = new LvglWidgetMeter();
|
||||
// else if (strcasecmp(p.type, "meter") == 0)
|
||||
// lvobj = new LvglWidgetMeter();
|
||||
else if (!luaLvglManager->isWidget()) {
|
||||
if (strcasecmp(p.type, "button") == 0)
|
||||
lvobj = new LvglWidgetTextButton();
|
||||
@@ -266,9 +289,22 @@ static void buildLvgl(lua_State *L, int srcIndex, int refIndex)
|
||||
static int luaLvglBuild(lua_State *L)
|
||||
{
|
||||
if (luaLvglManager) {
|
||||
LvglWidgetObject* p = nullptr;
|
||||
Window* prevParent = nullptr;
|
||||
if (lua_gettop(L) == 2) {
|
||||
p = LvglWidgetObject::checkLvgl(L, 1);
|
||||
if (p) {
|
||||
prevParent = luaLvglManager->getTempParent();
|
||||
luaLvglManager->setTempParent(p->getWindow());
|
||||
}
|
||||
}
|
||||
|
||||
// Return array of lvgl object references
|
||||
lua_newtable(L);
|
||||
buildLvgl(L, -2, -1);
|
||||
|
||||
if (p)
|
||||
luaLvglManager->setTempParent((prevParent));
|
||||
} else {
|
||||
lua_pushnil(L);
|
||||
}
|
||||
@@ -280,7 +316,6 @@ LROT_FUNCENTRY(__gc, luaDestroyLvglWidget)
|
||||
LROT_TABENTRY(__index, lvgllib)
|
||||
LROT_FUNCENTRY(clear, luaLvglClear)
|
||||
LROT_FUNCENTRY(build, luaLvglBuild)
|
||||
LROT_FUNCENTRY(setParent, luaLvglSetParent)
|
||||
// Objects
|
||||
LROT_FUNCENTRY(label, luaLvglLabel)
|
||||
LROT_FUNCENTRY(rectangle, luaLvglRectangle)
|
||||
@@ -288,7 +323,7 @@ LROT_FUNCENTRY(circle, luaLvglCircle)
|
||||
LROT_FUNCENTRY(arc, luaLvglArc)
|
||||
LROT_FUNCENTRY(image, luaLvglImage)
|
||||
LROT_FUNCENTRY(qrcode, luaLvglQRCode)
|
||||
LROT_FUNCENTRY(meter, luaLvglMeter)
|
||||
// LROT_FUNCENTRY(meter, luaLvglMeter)
|
||||
LROT_FUNCENTRY(button, luaLvglButton)
|
||||
LROT_FUNCENTRY(toggle, luaLvglToggle)
|
||||
LROT_FUNCENTRY(confirm, luaLvglConfirm)
|
||||
@@ -296,6 +331,7 @@ LROT_FUNCENTRY(textEdit, luaLvglTextEdit)
|
||||
LROT_FUNCENTRY(numberEdit, luaLvglNumberEdit)
|
||||
LROT_FUNCENTRY(choice, luaLvglChoice)
|
||||
LROT_FUNCENTRY(slider, luaLvglSlider)
|
||||
LROT_FUNCENTRY(page, luaLvglPage)
|
||||
// Manipulation functions
|
||||
LROT_FUNCENTRY(set, luaLvglSet)
|
||||
LROT_FUNCENTRY(show, luaLvglShow)
|
||||
|
||||
+312
-312
@@ -599,362 +599,362 @@ void LvglWidgetQRCode::build(lua_State *L)
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class LvglWidgetScaleIndicator : public LvglWidgetObjectBase
|
||||
{
|
||||
public:
|
||||
LvglWidgetScaleIndicator() {}
|
||||
// class LvglWidgetScaleIndicator : public LvglWidgetObjectBase
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetScaleIndicator() {}
|
||||
|
||||
virtual void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) = 0;
|
||||
// virtual void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) = 0;
|
||||
|
||||
protected:
|
||||
lv_obj_t *meter = nullptr;
|
||||
lv_meter_indicator_t *indic = nullptr;
|
||||
};
|
||||
// protected:
|
||||
// lv_obj_t *meter = nullptr;
|
||||
// lv_meter_indicator_t *indic = nullptr;
|
||||
// };
|
||||
|
||||
class LvglWidgetScaleArc : public LvglWidgetScaleIndicator
|
||||
{
|
||||
public:
|
||||
LvglWidgetScaleArc(lua_State *L) { getParams(L, -1); }
|
||||
// class LvglWidgetScaleArc : public LvglWidgetScaleIndicator
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetScaleArc(lua_State *L) { getParams(L, -1); }
|
||||
|
||||
bool callRefs(lua_State *L) override
|
||||
{
|
||||
if (!pcallUpdate1Int(L, getStartPosFunction, [=](int val) {
|
||||
lv_meter_set_indicator_start_value(meter, indic, val);
|
||||
}))
|
||||
return false;
|
||||
if (!pcallUpdate1Int(L, getEndPosFunction, [=](int val) {
|
||||
lv_meter_set_indicator_end_value(meter, indic, val);
|
||||
}))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
// bool callRefs(lua_State *L) override
|
||||
// {
|
||||
// if (!pcallUpdate1Int(L, getStartPosFunction, [=](int val) {
|
||||
// lv_meter_set_indicator_start_value(meter, indic, val);
|
||||
// }))
|
||||
// return false;
|
||||
// if (!pcallUpdate1Int(L, getEndPosFunction, [=](int val) {
|
||||
// lv_meter_set_indicator_end_value(meter, indic, val);
|
||||
// }))
|
||||
// return false;
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void clearRefs(lua_State *L) override
|
||||
{
|
||||
clearRef(L, getStartPosFunction);
|
||||
clearRef(L, getEndPosFunction);
|
||||
}
|
||||
// void clearRefs(lua_State *L) override
|
||||
// {
|
||||
// clearRef(L, getStartPosFunction);
|
||||
// clearRef(L, getEndPosFunction);
|
||||
// }
|
||||
|
||||
void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
{
|
||||
meter = parent;
|
||||
// void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
// {
|
||||
// meter = parent;
|
||||
|
||||
indic =
|
||||
lv_meter_add_arc(meter, scale, w, makeLvColor(colorToRGB(color)), rmod);
|
||||
if (hasStart) lv_meter_set_indicator_start_value(meter, indic, startPos);
|
||||
if (hasEnd) lv_meter_set_indicator_end_value(meter, indic, endPos);
|
||||
}
|
||||
// indic =
|
||||
// lv_meter_add_arc(meter, scale, w, makeLvColor(colorToRGB(color)), rmod);
|
||||
// if (hasStart) lv_meter_set_indicator_start_value(meter, indic, startPos);
|
||||
// if (hasEnd) lv_meter_set_indicator_end_value(meter, indic, endPos);
|
||||
// }
|
||||
|
||||
protected:
|
||||
uint8_t w = 0;
|
||||
int8_t rmod = 0;
|
||||
LcdFlags color = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
bool hasStart = false, hasEnd = false;
|
||||
int16_t startPos = 0, endPos = 0;
|
||||
// protected:
|
||||
// uint8_t w = 0;
|
||||
// int8_t rmod = 0;
|
||||
// LcdFlags color = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
// bool hasStart = false, hasEnd = false;
|
||||
// int16_t startPos = 0, endPos = 0;
|
||||
|
||||
int getStartPosFunction = 0;
|
||||
int getEndPosFunction = 0;
|
||||
// int getStartPosFunction = 0;
|
||||
// int getEndPosFunction = 0;
|
||||
|
||||
void parseParam(lua_State *L, const char *key) override
|
||||
{
|
||||
if (!strcmp(key, "w")) {
|
||||
w = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "rmod")) {
|
||||
rmod = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "startPos")) {
|
||||
if (lua_isfunction(L, -1))
|
||||
getStartPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
else {
|
||||
hasStart = true;
|
||||
startPos = luaL_checkinteger(L, -1);
|
||||
}
|
||||
} else if (!strcmp(key, "endPos")) {
|
||||
if (lua_isfunction(L, -1))
|
||||
getEndPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
else {
|
||||
hasEnd = true;
|
||||
endPos = luaL_checkinteger(L, -1);
|
||||
}
|
||||
} else if (!strcmp(key, "color")) {
|
||||
color = luaL_checkunsigned(L, -1);
|
||||
}
|
||||
}
|
||||
};
|
||||
// void parseParam(lua_State *L, const char *key) override
|
||||
// {
|
||||
// if (!strcmp(key, "w")) {
|
||||
// w = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "rmod")) {
|
||||
// rmod = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "startPos")) {
|
||||
// if (lua_isfunction(L, -1))
|
||||
// getStartPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
// else {
|
||||
// hasStart = true;
|
||||
// startPos = luaL_checkinteger(L, -1);
|
||||
// }
|
||||
// } else if (!strcmp(key, "endPos")) {
|
||||
// if (lua_isfunction(L, -1))
|
||||
// getEndPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
// else {
|
||||
// hasEnd = true;
|
||||
// endPos = luaL_checkinteger(L, -1);
|
||||
// }
|
||||
// } else if (!strcmp(key, "color")) {
|
||||
// color = luaL_checkunsigned(L, -1);
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
|
||||
class LvglWidgetScaleLines : public LvglWidgetScaleIndicator
|
||||
{
|
||||
public:
|
||||
LvglWidgetScaleLines(lua_State *L) { getParams(L, -1); }
|
||||
// class LvglWidgetScaleLines : public LvglWidgetScaleIndicator
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetScaleLines(lua_State *L) { getParams(L, -1); }
|
||||
|
||||
bool callRefs(lua_State *L) override
|
||||
{
|
||||
if (!pcallUpdate1Int(L, getStartPosFunction, [=](int val) {
|
||||
lv_meter_set_indicator_start_value(meter, indic, val);
|
||||
}))
|
||||
return false;
|
||||
if (!pcallUpdate1Int(L, getEndPosFunction, [=](int val) {
|
||||
lv_meter_set_indicator_end_value(meter, indic, val);
|
||||
}))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
// bool callRefs(lua_State *L) override
|
||||
// {
|
||||
// if (!pcallUpdate1Int(L, getStartPosFunction, [=](int val) {
|
||||
// lv_meter_set_indicator_start_value(meter, indic, val);
|
||||
// }))
|
||||
// return false;
|
||||
// if (!pcallUpdate1Int(L, getEndPosFunction, [=](int val) {
|
||||
// lv_meter_set_indicator_end_value(meter, indic, val);
|
||||
// }))
|
||||
// return false;
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void clearRefs(lua_State *L) override
|
||||
{
|
||||
clearRef(L, getStartPosFunction);
|
||||
clearRef(L, getEndPosFunction);
|
||||
}
|
||||
// void clearRefs(lua_State *L) override
|
||||
// {
|
||||
// clearRef(L, getStartPosFunction);
|
||||
// clearRef(L, getEndPosFunction);
|
||||
// }
|
||||
|
||||
void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
{
|
||||
meter = parent;
|
||||
// void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
// {
|
||||
// meter = parent;
|
||||
|
||||
indic = lv_meter_add_scale_lines(
|
||||
meter, scale, makeLvColor(colorToRGB(startColor)),
|
||||
makeLvColor(colorToRGB(endColor)), localFade, wmod);
|
||||
if (hasStart) lv_meter_set_indicator_start_value(meter, indic, startPos);
|
||||
if (hasEnd) lv_meter_set_indicator_end_value(meter, indic, endPos);
|
||||
}
|
||||
// indic = lv_meter_add_scale_lines(
|
||||
// meter, scale, makeLvColor(colorToRGB(startColor)),
|
||||
// makeLvColor(colorToRGB(endColor)), localFade, wmod);
|
||||
// if (hasStart) lv_meter_set_indicator_start_value(meter, indic, startPos);
|
||||
// if (hasEnd) lv_meter_set_indicator_end_value(meter, indic, endPos);
|
||||
// }
|
||||
|
||||
protected:
|
||||
int8_t wmod = 0;
|
||||
LcdFlags startColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
LcdFlags endColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
bool hasStart = false, hasEnd = false;
|
||||
int16_t startPos = 0, endPos = 0;
|
||||
bool localFade = false;
|
||||
// protected:
|
||||
// int8_t wmod = 0;
|
||||
// LcdFlags startColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
// LcdFlags endColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
// bool hasStart = false, hasEnd = false;
|
||||
// int16_t startPos = 0, endPos = 0;
|
||||
// bool localFade = false;
|
||||
|
||||
int getStartPosFunction = 0;
|
||||
int getEndPosFunction = 0;
|
||||
// int getStartPosFunction = 0;
|
||||
// int getEndPosFunction = 0;
|
||||
|
||||
void parseParam(lua_State *L, const char *key) override
|
||||
{
|
||||
if (!strcmp(key, "wmod")) {
|
||||
wmod = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "startPos")) {
|
||||
if (lua_isfunction(L, -1)) {
|
||||
getStartPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
} else {
|
||||
hasStart = true;
|
||||
startPos = luaL_checkinteger(L, -1);
|
||||
}
|
||||
} else if (!strcmp(key, "endPos")) {
|
||||
if (lua_isfunction(L, -1)) {
|
||||
getEndPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
} else {
|
||||
hasEnd = true;
|
||||
endPos = luaL_checkinteger(L, -1);
|
||||
}
|
||||
} else if (!strcmp(key, "startColor")) {
|
||||
startColor = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "endColor")) {
|
||||
endColor = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "localFade")) {
|
||||
localFade = lua_toboolean(L, -1);
|
||||
}
|
||||
}
|
||||
};
|
||||
// void parseParam(lua_State *L, const char *key) override
|
||||
// {
|
||||
// if (!strcmp(key, "wmod")) {
|
||||
// wmod = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "startPos")) {
|
||||
// if (lua_isfunction(L, -1)) {
|
||||
// getStartPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
// } else {
|
||||
// hasStart = true;
|
||||
// startPos = luaL_checkinteger(L, -1);
|
||||
// }
|
||||
// } else if (!strcmp(key, "endPos")) {
|
||||
// if (lua_isfunction(L, -1)) {
|
||||
// getEndPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
// } else {
|
||||
// hasEnd = true;
|
||||
// endPos = luaL_checkinteger(L, -1);
|
||||
// }
|
||||
// } else if (!strcmp(key, "startColor")) {
|
||||
// startColor = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "endColor")) {
|
||||
// endColor = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "localFade")) {
|
||||
// localFade = lua_toboolean(L, -1);
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
|
||||
class LvglWidgetScaleNeedle : public LvglWidgetScaleIndicator
|
||||
{
|
||||
public:
|
||||
LvglWidgetScaleNeedle(lua_State *L) { getParams(L, -1); }
|
||||
// class LvglWidgetScaleNeedle : public LvglWidgetScaleIndicator
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetScaleNeedle(lua_State *L) { getParams(L, -1); }
|
||||
|
||||
bool callRefs(lua_State *L) override
|
||||
{
|
||||
if (!pcallUpdate1Int(L, getPosFunction, [=](int val) {
|
||||
lv_meter_set_indicator_value(meter, indic, val);
|
||||
}))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
// bool callRefs(lua_State *L) override
|
||||
// {
|
||||
// if (!pcallUpdate1Int(L, getPosFunction, [=](int val) {
|
||||
// lv_meter_set_indicator_value(meter, indic, val);
|
||||
// }))
|
||||
// return false;
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void clearRefs(lua_State *L) override { clearRef(L, getPosFunction); }
|
||||
// void clearRefs(lua_State *L) override { clearRef(L, getPosFunction); }
|
||||
|
||||
void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
{
|
||||
meter = parent;
|
||||
// void buildIndicator(lv_obj_t *parent, lv_meter_scale_t *scale) override
|
||||
// {
|
||||
// meter = parent;
|
||||
|
||||
indic = lv_meter_add_needle_line(meter, scale, w,
|
||||
makeLvColor(colorToRGB(color)), rmod);
|
||||
}
|
||||
// indic = lv_meter_add_needle_line(meter, scale, w,
|
||||
// makeLvColor(colorToRGB(color)), rmod);
|
||||
// }
|
||||
|
||||
protected:
|
||||
uint8_t w = 0;
|
||||
int8_t rmod = 0;
|
||||
LcdFlags color = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
// protected:
|
||||
// uint8_t w = 0;
|
||||
// int8_t rmod = 0;
|
||||
// LcdFlags color = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
|
||||
int getPosFunction = 0;
|
||||
// int getPosFunction = 0;
|
||||
|
||||
void parseParam(lua_State *L, const char *key) override
|
||||
{
|
||||
if (!strcmp(key, "w")) {
|
||||
w = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "rmod")) {
|
||||
rmod = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "color")) {
|
||||
color = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "pos")) {
|
||||
getPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}
|
||||
}
|
||||
};
|
||||
// void parseParam(lua_State *L, const char *key) override
|
||||
// {
|
||||
// if (!strcmp(key, "w")) {
|
||||
// w = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "rmod")) {
|
||||
// rmod = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "color")) {
|
||||
// color = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "pos")) {
|
||||
// getPosFunction = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
|
||||
class LvglWidgetMeterScale : public LvglWidgetObjectBase
|
||||
{
|
||||
public:
|
||||
LvglWidgetMeterScale(lua_State *L) { getParams(L, -1); }
|
||||
// class LvglWidgetMeterScale : public LvglWidgetObjectBase
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetMeterScale(lua_State *L) { getParams(L, -1); }
|
||||
|
||||
bool callRefs(lua_State *L) override
|
||||
{
|
||||
for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
if (!(*it)->callRefs(L)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// bool callRefs(lua_State *L) override
|
||||
// {
|
||||
// for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
// if (!(*it)->callRefs(L)) return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void clearRefs(lua_State *L) override
|
||||
{
|
||||
for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
(*it)->clearRefs(L);
|
||||
}
|
||||
}
|
||||
// void clearRefs(lua_State *L) override
|
||||
// {
|
||||
// for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
// (*it)->clearRefs(L);
|
||||
// }
|
||||
// }
|
||||
|
||||
void build(lv_obj_t *parent)
|
||||
{
|
||||
meter = parent;
|
||||
lv_meter_scale_t *scale = lv_meter_add_scale(meter);
|
||||
// void build(lv_obj_t *parent)
|
||||
// {
|
||||
// meter = parent;
|
||||
// lv_meter_scale_t *scale = lv_meter_add_scale(meter);
|
||||
|
||||
if (ticks) {
|
||||
lv_meter_set_scale_ticks(meter, scale, ticks, tickWidth, tickLen,
|
||||
makeLvColor(colorToRGB(tickColor)));
|
||||
if (majorNth)
|
||||
lv_meter_set_scale_major_ticks(
|
||||
meter, scale, majorNth, majorWidth, majorLen,
|
||||
makeLvColor(colorToRGB(majorColor)), labelGap);
|
||||
}
|
||||
// if (ticks) {
|
||||
// lv_meter_set_scale_ticks(meter, scale, ticks, tickWidth, tickLen,
|
||||
// makeLvColor(colorToRGB(tickColor)));
|
||||
// if (majorNth)
|
||||
// lv_meter_set_scale_major_ticks(
|
||||
// meter, scale, majorNth, majorWidth, majorLen,
|
||||
// makeLvColor(colorToRGB(majorColor)), labelGap);
|
||||
// }
|
||||
|
||||
lv_meter_set_scale_range(meter, scale, scaleMin, scaleMax, scaleAngle,
|
||||
scaleRotate);
|
||||
// lv_meter_set_scale_range(meter, scale, scaleMin, scaleMax, scaleAngle,
|
||||
// scaleRotate);
|
||||
|
||||
if (centerDotSize > 0) {
|
||||
lv_obj_set_style_size(meter, centerDotSize, LV_PART_INDICATOR);
|
||||
etx_bg_color_from_flags(meter, centerDotColor, LV_PART_INDICATOR);
|
||||
lv_obj_set_style_bg_opa(meter, LV_OPA_COVER, LV_PART_INDICATOR);
|
||||
lv_obj_set_style_radius(meter, LV_RADIUS_CIRCLE, LV_PART_INDICATOR);
|
||||
}
|
||||
// if (centerDotSize > 0) {
|
||||
// lv_obj_set_style_size(meter, centerDotSize, LV_PART_INDICATOR);
|
||||
// etx_bg_color_from_flags(meter, centerDotColor, LV_PART_INDICATOR);
|
||||
// lv_obj_set_style_bg_opa(meter, LV_OPA_COVER, LV_PART_INDICATOR);
|
||||
// lv_obj_set_style_radius(meter, LV_RADIUS_CIRCLE, LV_PART_INDICATOR);
|
||||
// }
|
||||
|
||||
for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
(*it)->buildIndicator(meter, scale);
|
||||
}
|
||||
}
|
||||
// for (auto it = indicators.cbegin(); it != indicators.cend(); ++it) {
|
||||
// (*it)->buildIndicator(meter, scale);
|
||||
// }
|
||||
// }
|
||||
|
||||
protected:
|
||||
lv_obj_t *meter;
|
||||
std::vector<LvglWidgetScaleIndicator *> indicators;
|
||||
// protected:
|
||||
// lv_obj_t *meter;
|
||||
// std::vector<LvglWidgetScaleIndicator *> indicators;
|
||||
|
||||
int16_t scaleMin = 0, scaleMax = 100, scaleAngle = 360, scaleRotate = 0;
|
||||
uint8_t ticks = 0, majorNth = 0;
|
||||
uint8_t tickWidth = 0, majorWidth = 0;
|
||||
uint8_t tickLen = 0, majorLen = 0;
|
||||
LcdFlags tickColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1);
|
||||
LcdFlags majorColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1);
|
||||
uint8_t labelGap = 0, centerDotSize = 0;
|
||||
LcdFlags centerDotColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
// int16_t scaleMin = 0, scaleMax = 100, scaleAngle = 360, scaleRotate = 0;
|
||||
// uint8_t ticks = 0, majorNth = 0;
|
||||
// uint8_t tickWidth = 0, majorWidth = 0;
|
||||
// uint8_t tickLen = 0, majorLen = 0;
|
||||
// LcdFlags tickColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1);
|
||||
// LcdFlags majorColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1);
|
||||
// uint8_t labelGap = 0, centerDotSize = 0;
|
||||
// LcdFlags centerDotColor = COLOR2FLAGS(COLOR_THEME_PRIMARY1_INDEX);
|
||||
|
||||
void parseParam(lua_State *L, const char *key) override
|
||||
{
|
||||
if (!strcmp(key, "ticks")) {
|
||||
ticks = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "tickWidth")) {
|
||||
tickWidth = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "tickLen")) {
|
||||
tickLen = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "tickColor")) {
|
||||
tickColor = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "majorNth")) {
|
||||
majorNth = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "majorWidth")) {
|
||||
majorWidth = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "majorLen")) {
|
||||
majorLen = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "majorColor")) {
|
||||
majorColor = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "labelGap")) {
|
||||
labelGap = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "min")) {
|
||||
scaleMin = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "max")) {
|
||||
scaleMax = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "angle")) {
|
||||
scaleAngle = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "rotate")) {
|
||||
scaleRotate = luaL_checkinteger(L, -1);
|
||||
} else if (!strcmp(key, "dotSize")) {
|
||||
centerDotSize = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "dotColor")) {
|
||||
centerDotColor = luaL_checkunsigned(L, -1);
|
||||
} else if (!strcmp(key, "indicators")) {
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) {
|
||||
lua_getfield(L, -1, "type");
|
||||
const char *key = lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
if (!strcmp(key, "arc")) {
|
||||
indicators.push_back(new LvglWidgetScaleArc(L));
|
||||
} else if (!strcmp(key, "lines")) {
|
||||
indicators.push_back(new LvglWidgetScaleLines(L));
|
||||
} else if (!strcmp(key, "needle")) {
|
||||
indicators.push_back(new LvglWidgetScaleNeedle(L));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// void parseParam(lua_State *L, const char *key) override
|
||||
// {
|
||||
// if (!strcmp(key, "ticks")) {
|
||||
// ticks = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "tickWidth")) {
|
||||
// tickWidth = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "tickLen")) {
|
||||
// tickLen = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "tickColor")) {
|
||||
// tickColor = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "majorNth")) {
|
||||
// majorNth = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "majorWidth")) {
|
||||
// majorWidth = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "majorLen")) {
|
||||
// majorLen = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "majorColor")) {
|
||||
// majorColor = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "labelGap")) {
|
||||
// labelGap = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "min")) {
|
||||
// scaleMin = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "max")) {
|
||||
// scaleMax = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "angle")) {
|
||||
// scaleAngle = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "rotate")) {
|
||||
// scaleRotate = luaL_checkinteger(L, -1);
|
||||
// } else if (!strcmp(key, "dotSize")) {
|
||||
// centerDotSize = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "dotColor")) {
|
||||
// centerDotColor = luaL_checkunsigned(L, -1);
|
||||
// } else if (!strcmp(key, "indicators")) {
|
||||
// luaL_checktype(L, -1, LUA_TTABLE);
|
||||
// for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) {
|
||||
// lua_getfield(L, -1, "type");
|
||||
// const char *key = lua_tostring(L, -1);
|
||||
// lua_pop(L, 1);
|
||||
// if (!strcmp(key, "arc")) {
|
||||
// indicators.push_back(new LvglWidgetScaleArc(L));
|
||||
// } else if (!strcmp(key, "lines")) {
|
||||
// indicators.push_back(new LvglWidgetScaleLines(L));
|
||||
// } else if (!strcmp(key, "needle")) {
|
||||
// indicators.push_back(new LvglWidgetScaleNeedle(L));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
|
||||
void LvglWidgetMeter::parseParam(lua_State *L, const char *key)
|
||||
{
|
||||
if (!strcmp(key, "scales")) {
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) {
|
||||
scales.push_back(new LvglWidgetMeterScale(L));
|
||||
}
|
||||
} else {
|
||||
LvglWidgetRoundObject::parseParam(L, key);
|
||||
}
|
||||
}
|
||||
// void LvglWidgetMeter::parseParam(lua_State *L, const char *key)
|
||||
// {
|
||||
// if (!strcmp(key, "scales")) {
|
||||
// luaL_checktype(L, -1, LUA_TTABLE);
|
||||
// for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) {
|
||||
// scales.push_back(new LvglWidgetMeterScale(L));
|
||||
// }
|
||||
// } else {
|
||||
// LvglWidgetRoundObject::parseParam(L, key);
|
||||
// }
|
||||
// }
|
||||
|
||||
bool LvglWidgetMeter::callRefs(lua_State *L)
|
||||
{
|
||||
for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
if (!(*it)->callRefs(L)) return false;
|
||||
}
|
||||
return LvglWidgetRoundObject::callRefs(L);
|
||||
}
|
||||
// bool LvglWidgetMeter::callRefs(lua_State *L)
|
||||
// {
|
||||
// for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
// if (!(*it)->callRefs(L)) return false;
|
||||
// }
|
||||
// return LvglWidgetRoundObject::callRefs(L);
|
||||
// }
|
||||
|
||||
void LvglWidgetMeter::clearRefs(lua_State *L)
|
||||
{
|
||||
for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
(*it)->clearRefs(L);
|
||||
}
|
||||
LvglWidgetRoundObject::clearRefs(L);
|
||||
}
|
||||
// void LvglWidgetMeter::clearRefs(lua_State *L)
|
||||
// {
|
||||
// for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
// (*it)->clearRefs(L);
|
||||
// }
|
||||
// LvglWidgetRoundObject::clearRefs(L);
|
||||
// }
|
||||
|
||||
void LvglWidgetMeter::build(lua_State *L)
|
||||
{
|
||||
window = new Window(lvglManager->getCurrentParent(),
|
||||
{x - radius, y - radius, radius * 2, radius * 2},
|
||||
lv_meter_create);
|
||||
// void LvglWidgetMeter::build(lua_State *L)
|
||||
// {
|
||||
// window = new Window(lvglManager->getCurrentParent(),
|
||||
// {x - radius, y - radius, radius * 2, radius * 2},
|
||||
// lv_meter_create);
|
||||
|
||||
lv_obj_t *meter = window->getLvObj();
|
||||
// lv_obj_t *meter = window->getLvObj();
|
||||
|
||||
lv_obj_add_flag(meter, LV_OBJ_FLAG_EVENT_BUBBLE);
|
||||
lv_obj_clear_flag(meter, LV_OBJ_FLAG_CLICKABLE);
|
||||
// lv_obj_add_flag(meter, LV_OBJ_FLAG_EVENT_BUBBLE);
|
||||
// lv_obj_clear_flag(meter, LV_OBJ_FLAG_CLICKABLE);
|
||||
|
||||
for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
(*it)->build(meter);
|
||||
}
|
||||
}
|
||||
// for (auto it = scales.cbegin(); it != scales.cend(); ++it) {
|
||||
// (*it)->build(meter);
|
||||
// }
|
||||
// }
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -264,22 +264,22 @@ class LvglWidgetQRCode : public LvglWidgetObject
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class LvglWidgetMeterScale;
|
||||
// class LvglWidgetMeterScale;
|
||||
|
||||
class LvglWidgetMeter : public LvglWidgetRoundObject
|
||||
{
|
||||
public:
|
||||
LvglWidgetMeter() : LvglWidgetRoundObject() {}
|
||||
// class LvglWidgetMeter : public LvglWidgetRoundObject
|
||||
// {
|
||||
// public:
|
||||
// LvglWidgetMeter() : LvglWidgetRoundObject() {}
|
||||
|
||||
void build(lua_State *L) override;
|
||||
bool callRefs(lua_State *L) override;
|
||||
void clearRefs(lua_State *L) override;
|
||||
// void build(lua_State *L) override;
|
||||
// bool callRefs(lua_State *L) override;
|
||||
// void clearRefs(lua_State *L) override;
|
||||
|
||||
protected:
|
||||
std::vector<LvglWidgetMeterScale*> scales;
|
||||
// protected:
|
||||
// std::vector<LvglWidgetMeterScale*> scales;
|
||||
|
||||
void parseParam(lua_State *L, const char *key) override;
|
||||
};
|
||||
// void parseParam(lua_State *L, const char *key) override;
|
||||
// };
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user