feat(color): additions/fixes for Lua LVGL API (#6294)

This commit is contained in:
philmoz
2025-05-26 10:35:53 +10:00
committed by GitHub
parent 936a66bcd8
commit 7977e8e694
7 changed files with 431 additions and 275 deletions
+149 -77
View File
@@ -50,8 +50,105 @@ struct LvglParamFuncOrValue
void parse(lua_State *L, ParamType typ = PVALUE);
void forceUpdate() { currVal = -1; }
bool changedColor(LcdFlags newFlags);
bool changedFont(LcdFlags newFlags) { return changedColor(newFlags);}
bool changedText(const char* s);
bool changedValue(uint32_t v);
void clearRef(lua_State *L);
};
//-----------------------------------------------------------------------------
class LvglGetSetParams
{
public:
LvglGetSetParams() {}
protected:
int getFunction = LUA_REFNIL;
int setFunction = LUA_REFNIL;
bool parseGetSetParam(lua_State *L, const char *key);
void clearGetSetRefs(lua_State *L);
};
class LvglTextParams
{
public:
LvglTextParams() {}
protected:
LvglParamFuncOrValue txt = { .function = LUA_REFNIL, .txt = ""};
LvglParamFuncOrValue font = { .function = LUA_REFNIL, .flags = FONT(STD)};
bool parseTextParam(lua_State *L, const char *key);
void clearTextRefs(lua_State *L);
};
class LvglMinMaxParams
{
public:
LvglMinMaxParams(int min, int max) : min(min), max(max) {}
protected:
int min;
int max;
bool parseMinMaxParam(lua_State *L, const char *key);
};
class LvglTitleParam
{
public:
LvglTitleParam() {}
protected:
std::string title;
bool parseTitleParam(lua_State *L, const char *key);
};
class LvglMessageParam
{
public:
LvglMessageParam() {}
protected:
std::string message;
bool parseMessageParam(lua_State *L, const char *key);
};
class LvglRoundedParam
{
public:
LvglRoundedParam() {}
protected:
bool rounded = false;
bool parseRoundedParam(lua_State *L, const char *key);
};
class LvglThicknessParam
{
public:
LvglThicknessParam() {}
protected:
coord_t thickness = 1;
bool parseThicknessParam(lua_State *L, const char *key);
};
class LvglValuesParam
{
public:
LvglValuesParam() {}
protected:
std::vector<std::string> values;
bool parseValuesParam(lua_State *L, const char *key);
};
//-----------------------------------------------------------------------------
@@ -76,6 +173,9 @@ class LvglWidgetObjectBase
virtual void disable() {};
virtual void close() {};
virtual coord_t getScrollX() { return 0; }
virtual coord_t getScrollY() { return 0; }
virtual void setColor(LcdFlags newColor) {}
virtual void setOpacity(uint8_t newOpa) {}
virtual void setPos(coord_t x, coord_t y) {}
@@ -110,8 +210,6 @@ class LvglWidgetObjectBase
void getParams(lua_State *L, int index);
void clearRef(lua_State *L, int& ref);
void pcallSimpleFunc(lua_State *L, int funcRef);
bool pcallUpdateBool(lua_State *L, int getFuncRef,
std::function<void(bool)> update);
@@ -147,7 +245,7 @@ class LvglSimpleWidgetObject : public LvglWidgetObjectBase
//-----------------------------------------------------------------------------
class LvglWidgetLabel : public LvglSimpleWidgetObject
class LvglWidgetLabel : public LvglSimpleWidgetObject, public LvglTextParams
{
public:
LvglWidgetLabel() : LvglSimpleWidgetObject() {}
@@ -161,9 +259,7 @@ class LvglWidgetLabel : public LvglSimpleWidgetObject
void clearRefs(lua_State *L) override;
protected:
LvglParamFuncOrValue font = { .function = LUA_REFNIL, .flags = FONT(STD)};
LvglParamFuncOrValue align = { .function = LUA_REFNIL, .flags = LEFT};
LvglParamFuncOrValue txt = { .function = LUA_REFNIL, .txt = ""};
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
@@ -178,7 +274,7 @@ class LvglWidgetLabel : public LvglSimpleWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetLineBase : public LvglSimpleWidgetObject
class LvglWidgetLineBase : public LvglSimpleWidgetObject, public LvglRoundedParam
{
public:
LvglWidgetLineBase() : LvglSimpleWidgetObject() {}
@@ -189,7 +285,6 @@ class LvglWidgetLineBase : public LvglSimpleWidgetObject
void setSize(coord_t w, coord_t h) override;
protected:
bool rounded = false;
int dashGap = 0;
int dashWidth = 0;
lv_point_t pts[2];
@@ -225,7 +320,7 @@ class LvglWidgetVLine : public LvglWidgetLineBase
//-----------------------------------------------------------------------------
class LvglWidgetLine : public LvglSimpleWidgetObject
class LvglWidgetLine : public LvglSimpleWidgetObject, public LvglRoundedParam, public LvglThicknessParam
{
public:
LvglWidgetLine();
@@ -240,8 +335,6 @@ class LvglWidgetLine : public LvglSimpleWidgetObject
void clearRefs(lua_State *L) override;
protected:
coord_t thickness = 1;
bool rounded = false;
size_t ptCnt = 0;
size_t ptAlloc = 0;
lv_point_t* pts = nullptr;
@@ -326,19 +419,11 @@ class LvglWidgetBox : public LvglWidgetObject
public:
LvglWidgetBox() : LvglWidgetObject() {}
protected:
void build(lua_State *L) override;
};
//-----------------------------------------------------------------------------
class LvglWidgetSetting : public LvglWidgetObject
{
public:
LvglWidgetSetting() : LvglWidgetObject() {}
coord_t getScrollX() override;
coord_t getScrollY() override;
protected:
const char *txt = "";
lv_dir_t scrollDir = LV_DIR_ALL;
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
@@ -346,19 +431,30 @@ class LvglWidgetSetting : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetBorderedObject : public LvglWidgetObject
class LvglWidgetSetting : public LvglWidgetObject, public LvglTitleParam
{
public:
LvglWidgetBorderedObject() : LvglWidgetObject() {}
LvglWidgetSetting() : LvglWidgetObject() {}
protected:
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
};
//-----------------------------------------------------------------------------
class LvglWidgetBorderedObject : public LvglWidgetBox, public LvglThicknessParam
{
public:
LvglWidgetBorderedObject() : LvglWidgetBox() {}
void setColor(LcdFlags newColor) override;
void setOpacity(uint8_t newOpa) override;
protected:
coord_t thickness = 1;
bool filled = false;
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
};
@@ -367,7 +463,10 @@ class LvglWidgetBorderedObject : public LvglWidgetObject
class LvglWidgetRoundObject : public LvglWidgetBorderedObject
{
public:
LvglWidgetRoundObject() : LvglWidgetBorderedObject() {}
LvglWidgetRoundObject() : LvglWidgetBorderedObject()
{
scrollDir = LV_DIR_NONE;
}
void setPos(coord_t x, coord_t y) override;
void setRadius(coord_t r);
@@ -413,7 +512,7 @@ class LvglWidgetCircle : public LvglWidgetRoundObject
//-----------------------------------------------------------------------------
class LvglWidgetArc : public LvglWidgetRoundObject
class LvglWidgetArc : public LvglWidgetRoundObject, public LvglRoundedParam
{
public:
LvglWidgetArc() : LvglWidgetRoundObject() {}
@@ -431,7 +530,6 @@ class LvglWidgetArc : public LvglWidgetRoundObject
void clearRefs(lua_State *L) override;
protected:
bool rounded = false;
LvglParamFuncOrValue startAngle = { .function = LUA_REFNIL, .coord = 0};
LvglParamFuncOrValue endAngle = { .function = LUA_REFNIL, .coord = 360};
LvglParamFuncOrValue bgColor = { .function = LUA_REFNIL, .flags = (LcdFlags)-1};
@@ -488,7 +586,7 @@ class LvglWidgetQRCode : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetTextButtonBase : public LvglWidgetObject
class LvglWidgetTextButtonBase : public LvglWidgetObject, public LvglTextParams
{
public:
LvglWidgetTextButtonBase() : LvglWidgetObject(LVGL_SIMPLEMETATABLE)
@@ -497,6 +595,7 @@ class LvglWidgetTextButtonBase : public LvglWidgetObject
}
void setText(const char *s);
void setFont(LcdFlags font);
void setSize(coord_t w, coord_t h) override;
void setColor(LcdFlags newColor) override;
void setTextColor(LcdFlags newColor);
@@ -506,8 +605,6 @@ class LvglWidgetTextButtonBase : public LvglWidgetObject
void clearRefs(lua_State *L) override;
protected:
LvglParamFuncOrValue txt = { .function = LUA_REFNIL, .txt = ""};
LcdFlags font = FONT(STD);
coord_t rounded = -1;
LvglParamFuncOrValue textColor = { .function = LUA_REFNIL, .flags = (LcdFlags)-1};
int pressFunction = LUA_REFNIL;
@@ -515,6 +612,8 @@ class LvglWidgetTextButtonBase : public LvglWidgetObject
void parseParam(lua_State *L, const char *key) override;
void refresh() override
{
setText(txt.txt);
setFont(font.flags);
setTextColor(textColor.flags);
LvglWidgetObject::refresh();
}
@@ -527,7 +626,6 @@ class LvglWidgetTextButton : public LvglWidgetTextButtonBase
public:
LvglWidgetTextButton() : LvglWidgetTextButtonBase() {}
void setFont(LcdFlags font);
void setChecked(bool check);
void clearRefs(lua_State *L) override;
@@ -541,7 +639,7 @@ class LvglWidgetTextButton : public LvglWidgetTextButtonBase
void refresh() override
{
setChecked(checked);
LvglWidgetObject::refresh();
LvglWidgetTextButtonBase::refresh();
}
};
@@ -552,8 +650,6 @@ class LvglWidgetMomentaryButton : public LvglWidgetTextButtonBase
public:
LvglWidgetMomentaryButton() : LvglWidgetTextButtonBase() {}
void setFont(LcdFlags font);
void clearRefs(lua_State *L) override;
protected:
@@ -565,7 +661,7 @@ class LvglWidgetMomentaryButton : public LvglWidgetTextButtonBase
//-----------------------------------------------------------------------------
class LvglWidgetToggleSwitch : public LvglWidgetObject
class LvglWidgetToggleSwitch : public LvglWidgetObject, public LvglGetSetParams
{
public:
LvglWidgetToggleSwitch() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {}
@@ -573,9 +669,6 @@ class LvglWidgetToggleSwitch : public LvglWidgetObject
void clearRefs(lua_State *L) override;
protected:
int getStateFunction = LUA_REFNIL;
int setStateFunction = LUA_REFNIL;
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
};
@@ -602,18 +695,14 @@ class LvglWidgetTextEdit : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetNumberEdit : public LvglWidgetObject
class LvglWidgetNumberEdit : public LvglWidgetObject, public LvglGetSetParams, public LvglMinMaxParams
{
public:
LvglWidgetNumberEdit() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {}
LvglWidgetNumberEdit() : LvglWidgetObject(LVGL_SIMPLEMETATABLE), LvglMinMaxParams(-1024, 1024) {}
void clearRefs(lua_State *L) override;
protected:
int min = -1024, max = 1024;
int getFunction = LUA_REFNIL;
int setFunction = LUA_REFNIL;
int dispFunction = LUA_REFNIL;
void build(lua_State *L) override;
@@ -622,10 +711,10 @@ class LvglWidgetNumberEdit : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetSliderBase : public LvglWidgetObject
class LvglWidgetSliderBase : public LvglWidgetObject, public LvglGetSetParams, public LvglMinMaxParams
{
public:
LvglWidgetSliderBase() : LvglWidgetObject(LVGL_SIMPLEMETATABLE)
LvglWidgetSliderBase() : LvglWidgetObject(LVGL_SIMPLEMETATABLE), LvglMinMaxParams(0, 100)
{
color.flags = -1;
}
@@ -635,11 +724,6 @@ class LvglWidgetSliderBase : public LvglWidgetObject
void clearRefs(lua_State *L) override;
protected:
int32_t vmin = 0;
int32_t vmax = 100;
int getValueFunction = LUA_REFNIL;
int setValueFunction = LUA_REFNIL;
void parseParam(lua_State *L, const char *key) override;
};
@@ -667,17 +751,20 @@ class LvglWidgetVerticalSlider : public LvglWidgetSliderBase
//-----------------------------------------------------------------------------
class LvglWidgetPage : public LvglWidgetObject
class LvglWidgetPage : public LvglWidgetObject, public LvglTitleParam
{
public:
LvglWidgetPage() : LvglWidgetObject() {}
void clearRefs(lua_State *L) override;
coord_t getScrollX() override;
coord_t getScrollY() override;
protected:
std::string title;
std::string subtitle;
std::string iconFile;
lv_dir_t scrollDir = LV_DIR_ALL;
int backActionFunction = LUA_REFNIL;
@@ -687,7 +774,7 @@ class LvglWidgetPage : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetDialog : public LvglWidgetObject
class LvglWidgetDialog : public LvglWidgetObject, public LvglTitleParam
{
public:
LvglWidgetDialog() : LvglWidgetObject() {}
@@ -696,7 +783,6 @@ class LvglWidgetDialog : public LvglWidgetObject
void close() override;
protected:
const char *title = nullptr;
LvglDialog* dialog = nullptr;
int closeFunction = LUA_REFNIL;
@@ -707,7 +793,7 @@ class LvglWidgetDialog : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetConfirmDialog : public LvglWidgetObject
class LvglWidgetConfirmDialog : public LvglWidgetObject, public LvglTitleParam, public LvglMessageParam
{
public:
LvglWidgetConfirmDialog() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {}
@@ -715,9 +801,6 @@ class LvglWidgetConfirmDialog : public LvglWidgetObject
void clearRefs(lua_State *L) override;
protected:
const char *title = nullptr;
const char *message = nullptr;
int confirmFunction = LUA_REFNIL;
int cancelFunction = LUA_REFNIL;
@@ -727,14 +810,12 @@ class LvglWidgetConfirmDialog : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetMessageDialog : public LvglWidgetObject
class LvglWidgetMessageDialog : public LvglWidgetObject, public LvglTitleParam, public LvglMessageParam
{
public:
LvglWidgetMessageDialog() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {}
protected:
const char *title = nullptr;
const char *message = nullptr;
const char *details = nullptr;
void build(lua_State *L) override;
@@ -743,7 +824,7 @@ class LvglWidgetMessageDialog : public LvglWidgetObject
//-----------------------------------------------------------------------------
class LvglWidgetPicker : public LvglWidgetObject
class LvglWidgetPicker : public LvglWidgetObject, public LvglGetSetParams
{
public:
LvglWidgetPicker() : LvglWidgetObject(LVGL_SIMPLEMETATABLE) {}
@@ -751,15 +832,12 @@ class LvglWidgetPicker : public LvglWidgetObject
void clearRefs(lua_State *L) override;
protected:
int getFunction = LUA_REFNIL;
int setFunction = LUA_REFNIL;
void parseParam(lua_State *L, const char *key) override;
};
//-----------------------------------------------------------------------------
class LvglWidgetChoice : public LvglWidgetPicker
class LvglWidgetChoice : public LvglWidgetPicker, public LvglTitleParam, public LvglValuesParam
{
public:
LvglWidgetChoice() : LvglWidgetPicker() {}
@@ -767,8 +845,6 @@ class LvglWidgetChoice : public LvglWidgetPicker
void clearRefs(lua_State *L) override;
protected:
std::string title;
std::vector<std::string> values;
int filterFunction = LUA_REFNIL;
void build(lua_State *L) override;
@@ -777,15 +853,12 @@ class LvglWidgetChoice : public LvglWidgetPicker
//-----------------------------------------------------------------------------
class LvglWidgetMenu : public LvglWidgetPicker
class LvglWidgetMenu : public LvglWidgetPicker, public LvglTitleParam, public LvglValuesParam
{
public:
LvglWidgetMenu() : LvglWidgetPicker() {}
protected:
std::string title;
std::vector<std::string> values;
void build(lua_State *L) override;
void parseParam(lua_State *L, const char *key) override;
};
@@ -864,14 +937,13 @@ class LvglWidgetSourcePicker : public LvglWidgetPicker
//-----------------------------------------------------------------------------
class LvglWidgetFilePicker : public LvglWidgetPicker
class LvglWidgetFilePicker : public LvglWidgetPicker, public LvglTitleParam
{
public:
LvglWidgetFilePicker() : LvglWidgetPicker() {}
protected:
const char *title = nullptr;
const char* folder = nullptr;
const char* folder = nullptr;
const char* extension = nullptr;
int maxLen = 255;
bool hideExtension = false;