From 7cdcd44e0ca10ebdc796638190ed1d9b45d99ef0 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 15 Jan 2024 12:31:20 +1100 Subject: Begin migration of remaining screens to Lua --- lib/luavgl/src/lvgl.lua | 495 ++++++++++++++++++++++----------------- lib/luavgl/src/widgets/slider.c | 88 +++++++ lib/luavgl/src/widgets/switch.c | 57 +++++ lib/luavgl/src/widgets/widgets.c | 24 ++ 4 files changed, 447 insertions(+), 217 deletions(-) create mode 100644 lib/luavgl/src/widgets/slider.c create mode 100644 lib/luavgl/src/widgets/switch.c (limited to 'lib/luavgl/src') diff --git a/lib/luavgl/src/lvgl.lua b/lib/luavgl/src/lvgl.lua index 67c2960e..32061c1f 100644 --- a/lib/luavgl/src/lvgl.lua +++ b/lib/luavgl/src/lvgl.lua @@ -9,278 +9,278 @@ lvgl = {} --- @enum ObjEventCode lvgl.EVENT = { - ALL = 0, - PRESSED = 0, - PRESSING = 0, - PRESS_LOST = 0, - SHORT_CLICKED = 0, - LONG_PRESSED = 0, - LONG_PRESSED_REPEAT = 0, - CLICKED = 0, - RELEASED = 0, - SCROLL_BEGIN = 0, - SCROLL_END = 0, - SCROLL = 0, - GESTURE = 0, - KEY = 0, - FOCUSED = 0, - DEFOCUSED = 0, - LEAVE = 0, - HIT_TEST = 0, - COVER_CHECK = 0, - REFR_EXT_DRAW_SIZE = 0, - DRAW_MAIN_BEGIN = 0, - DRAW_MAIN = 0, - DRAW_MAIN_END = 0, - DRAW_POST_BEGIN = 0, - DRAW_POST = 0, - DRAW_POST_END = 0, - DRAW_PART_BEGIN = 0, - DRAW_PART_END = 0, - VALUE_CHANGED = 0, - INSERT = 0, - REFRESH = 0, - READY = 0, - CANCEL = 0, - DELETE = 0, - CHILD_CHANGED = 0, - CHILD_CREATED = 0, - CHILD_DELETED = 0, - SCREEN_UNLOAD_START = 0, - SCREEN_LOAD_START = 0, - SCREEN_LOADED = 0, - SCREEN_UNLOADED = 0, - SIZE_CHANGED = 0, - STYLE_CHANGED = 0, - LAYOUT_CHANGED = 0, - GET_SELF_SIZE = 0, + ALL = 0, + PRESSED = 0, + PRESSING = 0, + PRESS_LOST = 0, + SHORT_CLICKED = 0, + LONG_PRESSED = 0, + LONG_PRESSED_REPEAT = 0, + CLICKED = 0, + RELEASED = 0, + SCROLL_BEGIN = 0, + SCROLL_END = 0, + SCROLL = 0, + GESTURE = 0, + KEY = 0, + FOCUSED = 0, + DEFOCUSED = 0, + LEAVE = 0, + HIT_TEST = 0, + COVER_CHECK = 0, + REFR_EXT_DRAW_SIZE = 0, + DRAW_MAIN_BEGIN = 0, + DRAW_MAIN = 0, + DRAW_MAIN_END = 0, + DRAW_POST_BEGIN = 0, + DRAW_POST = 0, + DRAW_POST_END = 0, + DRAW_PART_BEGIN = 0, + DRAW_PART_END = 0, + VALUE_CHANGED = 0, + INSERT = 0, + REFRESH = 0, + READY = 0, + CANCEL = 0, + DELETE = 0, + CHILD_CHANGED = 0, + CHILD_CREATED = 0, + CHILD_DELETED = 0, + SCREEN_UNLOAD_START = 0, + SCREEN_LOAD_START = 0, + SCREEN_LOADED = 0, + SCREEN_UNLOADED = 0, + SIZE_CHANGED = 0, + STYLE_CHANGED = 0, + LAYOUT_CHANGED = 0, + GET_SELF_SIZE = 0, } --- object flag for obj:add_flag obj:clear_flag --- @enum ObjFlag lvgl.FLAG = { - PRESSED = 0, - HIDDEN = 0, - CLICKABLE = 0, - CLICK_FOCUSABLE = 0, - CHECKABLE = 0, - SCROLLABLE = 0, - SCROLL_ELASTIC = 0, - SCROLL_MOMENTUM = 0, - SCROLL_ONE = 0, - SCROLL_CHAIN_HOR = 0, - SCROLL_CHAIN_VER = 0, - SCROLL_CHAIN = 0, - SCROLL_ON_FOCUS = 0, - SCROLL_WITH_ARROW = 0, - SNAPPABLE = 0, - PRESS_LOCK = 0, - EVENT_BUBBLE = 0, - GESTURE_BUBBLE = 0, - ADV_HITTEST = 0, - IGNORE_LAYOUT = 0, - FLOATING = 0, - OVERFLOW_VISIBLE = 0, - LAYOUT_1 = 0, - LAYOUT_2 = 0, - WIDGET_1 = 0, - WIDGET_2 = 0, - USER_1 = 0, - USER_2 = 0, - USER_3 = 0, - USER_4 = 0, + PRESSED = 0, + HIDDEN = 0, + CLICKABLE = 0, + CLICK_FOCUSABLE = 0, + CHECKABLE = 0, + SCROLLABLE = 0, + SCROLL_ELASTIC = 0, + SCROLL_MOMENTUM = 0, + SCROLL_ONE = 0, + SCROLL_CHAIN_HOR = 0, + SCROLL_CHAIN_VER = 0, + SCROLL_CHAIN = 0, + SCROLL_ON_FOCUS = 0, + SCROLL_WITH_ARROW = 0, + SNAPPABLE = 0, + PRESS_LOCK = 0, + EVENT_BUBBLE = 0, + GESTURE_BUBBLE = 0, + ADV_HITTEST = 0, + IGNORE_LAYOUT = 0, + FLOATING = 0, + OVERFLOW_VISIBLE = 0, + LAYOUT_1 = 0, + LAYOUT_2 = 0, + WIDGET_1 = 0, + WIDGET_2 = 0, + USER_1 = 0, + USER_2 = 0, + USER_3 = 0, + USER_4 = 0, } --- @enum ObjState lvgl.STATE = { - DEFAULT = 0, - CHECKED = 0, - FOCUSED = 0, - FOCUS_KEY = 0, - EDITED = 0, - HOVERED = 0, - PRESSED = 0, - SCROLLED = 0, - DISABLED = 0, - USER_1 = 0, - USER_2 = 0, - USER_3 = 0, - USER_4 = 0, - ANY = 0, + DEFAULT = 0, + CHECKED = 0, + FOCUSED = 0, + FOCUS_KEY = 0, + EDITED = 0, + HOVERED = 0, + PRESSED = 0, + SCROLLED = 0, + DISABLED = 0, + USER_1 = 0, + USER_2 = 0, + USER_3 = 0, + USER_4 = 0, + ANY = 0, } --- @enum ObjAlignType lvgl.ALIGN = { - DEFAULT = 0, - TOP_LEFT = 0, - TOP_MID = 0, - TOP_RIGHT = 0, - BOTTOM_LEFT = 0, - BOTTOM_MID = 0, - BOTTOM_RIGHT = 0, - LEFT_MID = 0, - RIGHT_MID = 0, - CENTER = 0, - OUT_TOP_LEFT = 0, - OUT_TOP_MID = 0, - OUT_TOP_RIGHT = 0, - OUT_BOTTOM_LEFT = 0, - OUT_BOTTOM_MID = 0, - OUT_BOTTOM_RIGHT = 0, - OUT_LEFT_TOP = 0, - OUT_LEFT_MID = 0, - OUT_LEFT_BOTTOM = 0, - OUT_RIGHT_TOP = 0, - OUT_RIGHT_MID = 0, - OUT_RIGHT_BOTTOM = 0, + DEFAULT = 0, + TOP_LEFT = 0, + TOP_MID = 0, + TOP_RIGHT = 0, + BOTTOM_LEFT = 0, + BOTTOM_MID = 0, + BOTTOM_RIGHT = 0, + LEFT_MID = 0, + RIGHT_MID = 0, + CENTER = 0, + OUT_TOP_LEFT = 0, + OUT_TOP_MID = 0, + OUT_TOP_RIGHT = 0, + OUT_BOTTOM_LEFT = 0, + OUT_BOTTOM_MID = 0, + OUT_BOTTOM_RIGHT = 0, + OUT_LEFT_TOP = 0, + OUT_LEFT_MID = 0, + OUT_LEFT_BOTTOM = 0, + OUT_RIGHT_TOP = 0, + OUT_RIGHT_MID = 0, + OUT_RIGHT_BOTTOM = 0, } --- @enum BuiltinFont lvgl.BUILTIN_FONT = { - MONTSERRAT_8 = 0, - MONTSERRAT_10 = 0, - MONTSERRAT_12 = 0, - MONTSERRAT_14 = 0, - MONTSERRAT_16 = 0, - MONTSERRAT_18 = 0, - MONTSERRAT_20 = 0, - MONTSERRAT_22 = 0, - MONTSERRAT_24 = 0, - MONTSERRAT_26 = 0, - MONTSERRAT_28 = 0, - MONTSERRAT_30 = 0, - MONTSERRAT_32 = 0, - MONTSERRAT_34 = 0, - MONTSERRAT_36 = 0, - MONTSERRAT_38 = 0, - MONTSERRAT_40 = 0, - MONTSERRAT_42 = 0, - MONTSERRAT_44 = 0, - MONTSERRAT_46 = 0, - MONTSERRAT_48 = 0, - MONTSERRAT_12_SUBPX = 0, - MONTSERRAT_28_COMPRESSED = 0, - DEJAVU_16_PERSIAN_HEBREW = 0, - SIMSUN_16_CJK = 0, - UNSCII_8 = 0, - UNSCII_16 = 0, + MONTSERRAT_8 = 0, + MONTSERRAT_10 = 0, + MONTSERRAT_12 = 0, + MONTSERRAT_14 = 0, + MONTSERRAT_16 = 0, + MONTSERRAT_18 = 0, + MONTSERRAT_20 = 0, + MONTSERRAT_22 = 0, + MONTSERRAT_24 = 0, + MONTSERRAT_26 = 0, + MONTSERRAT_28 = 0, + MONTSERRAT_30 = 0, + MONTSERRAT_32 = 0, + MONTSERRAT_34 = 0, + MONTSERRAT_36 = 0, + MONTSERRAT_38 = 0, + MONTSERRAT_40 = 0, + MONTSERRAT_42 = 0, + MONTSERRAT_44 = 0, + MONTSERRAT_46 = 0, + MONTSERRAT_48 = 0, + MONTSERRAT_12_SUBPX = 0, + MONTSERRAT_28_COMPRESSED = 0, + DEJAVU_16_PERSIAN_HEBREW = 0, + SIMSUN_16_CJK = 0, + UNSCII_8 = 0, + UNSCII_16 = 0, } --- @enum LABEL lvgl.LABEL = { - LONG_WRAP = 0, - LONG_DOT = 0, - LONG_SCROLL = 0, - LONG_SCROLL_CIRCULAR = 0, - LONG_CLIP = 0, + LONG_WRAP = 0, + LONG_DOT = 0, + LONG_SCROLL = 0, + LONG_SCROLL_CIRCULAR = 0, + LONG_CLIP = 0, } --- @enum SCR_LOAD_ANIM lvgl.SCR_LOAD_ANIM = { - NONE = 0, - OVER_LEFT = 0, - OVER_RIGHT = 0, - OVER_TOP = 0, - OVER_BOTTOM = 0, - MOVE_LEFT = 0, - MOVE_RIGHT = 0, - MOVE_TOP = 0, - MOVE_BOTTOM = 0, - FADE_IN = 0, - FADE_ON = 0, - FADE_OUT = 0, - OUT_LEFT = 0, - OUT_RIGHT = 0, - OUT_TOP = 0, - OUT_BOTTOM = 0, + NONE = 0, + OVER_LEFT = 0, + OVER_RIGHT = 0, + OVER_TOP = 0, + OVER_BOTTOM = 0, + MOVE_LEFT = 0, + MOVE_RIGHT = 0, + MOVE_TOP = 0, + MOVE_BOTTOM = 0, + FADE_IN = 0, + FADE_ON = 0, + FADE_OUT = 0, + OUT_LEFT = 0, + OUT_RIGHT = 0, + OUT_TOP = 0, + OUT_BOTTOM = 0, } --- @enum ScrollbarMode lvgl.SCROLLBAR_MODE = { - OFF = 0, - ON = 0, - ACTIVE = 0, - AUTO = 0, + OFF = 0, + ON = 0, + ACTIVE = 0, + AUTO = 0, } --- @enum Dir lvgl.DIR = { - NONE = 0, - LEFT = 0, - RIGHT = 0, - TOP = 0, - BOTTOM = 0, - HOR = 0, - VER = 0, - ALL = 0, + NONE = 0, + LEFT = 0, + RIGHT = 0, + TOP = 0, + BOTTOM = 0, + HOR = 0, + VER = 0, + ALL = 0, } --- @enum KeyboardMode lvgl.KEYBOARD_MODE = { - TEXT_LOWER = 0, - TEXT_UPPER = 0, - SPECIAL = 0, - NUMBER = 0, - USER_1 = 0, - USER_2 = 0, - USER_3 = 0, - USER_4 = 0, - TEXT_ARABIC = 0, + TEXT_LOWER = 0, + TEXT_UPPER = 0, + SPECIAL = 0, + NUMBER = 0, + USER_1 = 0, + USER_2 = 0, + USER_3 = 0, + USER_4 = 0, + TEXT_ARABIC = 0, } --- @enum FlexFlow lvgl.FLEX_FLOW = { - ROW = 0, - COLUMN = 0, - ROW_WRAP = 0, - ROW_REVERSE = 0, - ROW_WRAP_REVERSE = 0, - COLUMN_WRAP = 0, - COLUMN_REVERSE = 0, - COLUMN_WRAP_REVERSE = 0, + ROW = 0, + COLUMN = 0, + ROW_WRAP = 0, + ROW_REVERSE = 0, + ROW_WRAP_REVERSE = 0, + COLUMN_WRAP = 0, + COLUMN_REVERSE = 0, + COLUMN_WRAP_REVERSE = 0, } --- @enum FlexAlign lvgl.FLEX_ALIGN = { - START = 0, - END = 0, - CENTER = 0, - SPACE_EVENLY = 0, - SPACE_AROUND = 0, - SPACE_BETWEEN = 0, + START = 0, + END = 0, + CENTER = 0, + SPACE_EVENLY = 0, + SPACE_AROUND = 0, + SPACE_BETWEEN = 0, } --- @enum GridAlign lvgl.GRID_ALIGN = { - START = 0, - CENTER = 0, - END = 0, - STRETCH = 0, - SPACE_EVENLY = 0, - SPACE_AROUND = 0, - SPACE_BETWEEN = 0, + START = 0, + CENTER = 0, + END = 0, + STRETCH = 0, + SPACE_EVENLY = 0, + SPACE_AROUND = 0, + SPACE_BETWEEN = 0, } --- @enum RollerMode lvgl.ROLLER_MODE = { - NORMAL = 0, - INFINITE = 0, + NORMAL = 0, + INFINITE = 0, } --- @enum KEY lvgl.KEY = { - UP = 0, - DOWN = 0, - RIGHT = 0, - LEFT = 0, - ESC = 0, - DEL = 0, - BACKSPACE = 0, - ENTER = 0, - NEXT = 0, - PREV = 0, - HOME = 0, - END = 0, + UP = 0, + DOWN = 0, + RIGHT = 0, + LEFT = 0, + ESC = 0, + DEL = 0, + BACKSPACE = 0, + ENTER = 0, + NEXT = 0, + PREV = 0, + HOME = 0, + END = 0, } lvgl.ANIM_REPEAT_INFINITE = 0 @@ -404,7 +404,6 @@ end function lvgl.Keyboard(parent, property) end - --- --- Create Led Widget on parent --- @param parent? Object | nil @@ -429,6 +428,20 @@ end function lvgl.Roller(parent, property) end +--- Create Slider widget on parent +--- @param parent? Object | nil +--- @param property? BarStyle +--- @return Slider +function lvgl.Slider(parent, property) +end + +--- Create Switch widget on parent +--- @param parent? Object | nil +--- @param property? StyleProp +--- @return Switch +function lvgl.Switch(parent, property) +end + --- --- Create Timer --- @param p TimerPara @@ -555,13 +568,27 @@ end function obj:List(property) end - --- --- Create Roller Widget on parent --- @param property? RollerStyle --- @return Roller function obj:Roller(parent, property) end + +--- +--- Create Slider on object +--- @param property? BarStyle +--- @return Slider +function obj:Slider(property) +end + +--- +--- Create switch on object +--- @param property? StyleProp +--- @return Switch +function obj:Switch(property) +end + --- --- Set object property --- @param p StyleProp @@ -1049,6 +1076,40 @@ end function label:cut_text(pos, cnt) end +--- +--- Slider widget +---@class Slider:Object +--- +local slider = {} + +--- set method for slider widget. Uses Bar widget's properties. +--- @param p BarStyle +--- @return nil +function slider:set(p) +end + +--- get value of slider +--- @return integer +function slider:value() +end + +--- +--- Switch widget +---@class Switch:Object +--- +local switch = {} + +--- set method for switch widget +--- @param p StyleProp +--- @return nil +function switch:set(p) +end + +--- get checked state of switch +--- @return boolean +function switch:enabled() +end + --- --- Textarea widget ---@class Textarea: Object diff --git a/lib/luavgl/src/widgets/slider.c b/lib/luavgl/src/widgets/slider.c new file mode 100644 index 00000000..c385f6bb --- /dev/null +++ b/lib/luavgl/src/widgets/slider.c @@ -0,0 +1,88 @@ +#include "lua.h" +#include "luavgl.h" +#include "private.h" +#include + +static int luavgl_slider_create(lua_State *L) { + return luavgl_obj_create_helper(L, lv_slider_create); +} + +static void _lv_slider_set_range(void *obj, lua_State *L) { + int min = 0, max = 100; + + int type = lua_type(L, -1); + if (type == LUA_TTABLE) { + lua_getfield(L, -1, "min"); + min = lua_tointeger(L, -1); + lua_pop(L, 1); + lua_getfield(L, -1, "max"); + max = luavgl_tointeger(L, -1); + lua_pop(L, 1); + } + + lv_slider_set_range(obj, min, max); +} + +static void _lv_slider_set_value(void *obj, int value) { + lv_slider_set_value(obj, value, LV_ANIM_OFF); +} + +static const luavgl_value_setter_t slider_property_table[] = { + {"range", SETTER_TYPE_STACK, {.setter_stack = _lv_slider_set_range}}, + {"value", SETTER_TYPE_INT, {.setter = (setter_int_t)_lv_slider_set_value}}, +}; + +LUALIB_API int luavgl_slider_set_property_kv(lua_State *L, void *data) { + lv_obj_t *obj = data; + int ret = luavgl_set_property(L, obj, slider_property_table); + + if (ret == 0) { + return 0; + } + /* a base obj property? */ + ret = luavgl_obj_set_property_kv(L, obj); + if (ret != 0) { + debug("unkown property for slider.\n"); + } + + return ret; +} + +static int luavgl_slider_set(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + + if (!lua_istable(L, -1)) { + luaL_error(L, "expect a table on 2nd para."); + return 0; + } + + luavgl_iterate(L, -1, luavgl_slider_set_property_kv, obj); + + return 0; +} + +static int luavgl_slider_value(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + lua_pushinteger(L, lv_slider_get_value(obj)); + return 1; +} + +static int luavgl_slider_tostring(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + lua_pushfstring(L, "lv_slider:%p", obj); + return 1; +} + +static const luaL_Reg luavgl_slider_methods[] = { + {"set", luavgl_slider_set}, + {"value", luavgl_slider_value}, + {NULL, NULL}, +}; + +static void luavgl_slider_init(lua_State *L) { + luavgl_obj_newmetatable(L, &lv_slider_class, "lv_slider", + luavgl_slider_methods); + lua_pushcfunction(L, luavgl_slider_tostring); + lua_setfield(L, -2, "__tostring"); + lua_pop(L, 1); +} diff --git a/lib/luavgl/src/widgets/switch.c b/lib/luavgl/src/widgets/switch.c new file mode 100644 index 00000000..e66f620e --- /dev/null +++ b/lib/luavgl/src/widgets/switch.c @@ -0,0 +1,57 @@ +#include "luavgl.h" +#include "private.h" +#include + +static int luavgl_switch_create(lua_State *L) { + return luavgl_obj_create_helper(L, lv_switch_create); +} + +LUALIB_API int luavgl_switch_set_property_kv(lua_State *L, void *data) { + lv_obj_t *obj = data; + /* switches only use base properties */ + int ret = luavgl_obj_set_property_kv(L, obj); + if (ret != 0) { + debug("unkown property for switch.\n"); + } + + return ret; +} + +static int luavgl_switch_set(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + + if (!lua_istable(L, -1)) { + luaL_error(L, "expect a table on 2nd para."); + return 0; + } + + luavgl_iterate(L, -1, luavgl_switch_set_property_kv, obj); + + return 0; +} + +static int luavgl_switch_enabled(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + lua_pushboolean(L, lv_obj_has_state(obj, LV_STATE_CHECKED)); + return 1; +} + +static int luavgl_switch_tostring(lua_State *L) { + lv_obj_t *obj = luavgl_to_obj(L, 1); + lua_pushfstring(L, "lv_switch:%p", obj); + return 1; +} + +static const luaL_Reg luavgl_switch_methods[] = { + {"set", luavgl_switch_set}, + {"enabled", luavgl_switch_enabled}, + {NULL, NULL}, +}; + +static void luavgl_switch_init(lua_State *L) { + luavgl_obj_newmetatable(L, &lv_switch_class, "lv_switch", + luavgl_switch_methods); + lua_pushcfunction(L, luavgl_switch_tostring); + lua_setfield(L, -2, "__tostring"); + lua_pop(L, 1); +} diff --git a/lib/luavgl/src/widgets/widgets.c b/lib/luavgl/src/widgets/widgets.c index e5f64f23..4a7a126e 100644 --- a/lib/luavgl/src/widgets/widgets.c +++ b/lib/luavgl/src/widgets/widgets.c @@ -45,6 +45,14 @@ #include "roller.c" #endif +#if LV_USE_SLIDER +#include "slider.c" +#endif + +#if LV_USE_SWITCH +#include "switch.c" +#endif + #if LV_USE_TEXTAREA #include "textarea.c" #endif @@ -98,6 +106,14 @@ static const luaL_Reg widget_create_methods[] = { {"Roller", luavgl_roller_create }, #endif +#if LV_USE_SLIDER + {"Slider", luavgl_slider_create}, +#endif + +#if LV_USE_SWITCH + {"Switch", luavgl_switch_create}, +#endif + #if LV_USE_TEXTAREA {"Textarea", luavgl_textarea_create}, #endif @@ -154,4 +170,12 @@ static void luavgl_widgets_init(lua_State *L) luavgl_bar_init(L); #endif +#if LV_USE_SLIDER + luavgl_slider_init(L); +#endif + +#if LV_USE_SWITCH + luavgl_switch_init(L); +#endif + } -- cgit v1.2.3