diff options
Diffstat (limited to 'lib/luavgl/src/obj.c')
| -rw-r--r-- | lib/luavgl/src/obj.c | 446 |
1 files changed, 271 insertions, 175 deletions
diff --git a/lib/luavgl/src/obj.c b/lib/luavgl/src/obj.c index fb89e3f9..496b7855 100644 --- a/lib/luavgl/src/obj.c +++ b/lib/luavgl/src/obj.c @@ -1,5 +1,3 @@ -#include "core/lv_group.h" -#include "core/lv_obj.h" #include "luavgl.h" #include "private.h" @@ -10,16 +8,18 @@ static int luavgl_anim_create(lua_State *L); static int luavgl_obj_delete(lua_State *L); +static int luavgl_obj_clean(lua_State *L); -static void _lv_obj_set_align(void *obj, lua_State *L) { +static void _lv_obj_set_align(void *obj, lua_State *L) +{ if (lua_isinteger(L, -1)) { lv_obj_align(obj, lua_tointeger(L, -1), 0, 0); return; } if (!lua_istable(L, -1)) { - luaL_argerror(L, -1, "should be table."); - debug("para should be table."); + luaL_argerror(L, -1, "should be table"); + LV_LOG_ERROR("para should be table"); return; } @@ -43,11 +43,13 @@ static void _lv_obj_set_align(void *obj, lua_State *L) { * * Internally used. */ -static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj) { +static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj) +{ luavgl_iterate(L, -1, luavgl_obj_set_property_kv, obj); } -static void obj_delete_cb(lv_event_t *e) { +static void obj_delete_cb(lv_event_t *e) +{ lua_State *L = e->user_data; lua_pushlightuserdata(L, e->current_target); lua_rawget(L, LUA_REGISTRYINDEX); @@ -67,7 +69,33 @@ static void obj_delete_cb(lv_event_t *e) { goto pop_exit; } - luavgl_obj_delete(L); + /* Clean its children firstly */ + luavgl_obj_clean(L); + + /* Remove events added from lua, but keep them unremoved */ + int size = lv_array_size(&lobj->events); + struct event_callback_s *event; + struct event_callback_s **events = lv_array_front(&lobj->events); + for (int i = 0; i < size; i++) { + event = events[i]; + if (event == NULL || event->dsc == NULL) { + continue; + } + + luaL_unref(L, LUA_REGISTRYINDEX, event->ref); + lv_free(event); + } + + lv_array_deinit(&lobj->events); + + /* remove userdata from registry. */ + lua_checkstack(L, 2); + lua_pushlightuserdata(L, lobj->obj); + lua_pushnil(L); + lua_rawset(L, LUA_REGISTRYINDEX); + + LV_LOG_INFO("delete obj: %p", lobj->obj); + lobj->obj = NULL; return; pop_exit: @@ -80,7 +108,8 @@ pop_exit: * one. result stack: table(from uservalue) * return uservalue type: LUA_TTABLE */ -LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) { +LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) +{ int type = lua_getuservalue(L, idx); if (type == LUA_TTABLE) return type; @@ -99,11 +128,13 @@ LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) { return LUA_TTABLE; } -static int luavgl_obj_create(lua_State *L) { +static int luavgl_obj_create(lua_State *L) +{ return luavgl_obj_create_helper(L, lv_obj_create); } -static int luavgl_obj_delete(lua_State *L) { +static int luavgl_obj_delete(lua_State *L) +{ luavgl_obj_t *lobj; /** @@ -146,14 +177,15 @@ static int luavgl_obj_delete(lua_State *L) { lua_pushnil(L); lua_rawset(L, LUA_REGISTRYINDEX); - debug("delete obj: %p\n", lobj->obj); + LV_LOG_INFO("delete obj: %p", lobj->obj); lobj->obj = NULL; lua_pop(L, 1); /* remove the userdata para */ return 0; } -static int luavgl_obj_clean(lua_State *L) { +static int luavgl_obj_clean(lua_State *L) +{ luavgl_obj_t *lobj = luavgl_to_lobj(L, -1); if (lobj == NULL || lobj->obj == NULL) return 0; @@ -170,31 +202,36 @@ static int luavgl_obj_clean(lua_State *L) { luavgl_obj_delete(L); } - lua_pop(L, 1); /* remove the userdata para */ - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set(lua_State *L) { +static int luavgl_obj_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; + luaL_error(L, "expect a table on 2nd para"); + lua_settop(L, 1); + return 1; } luavgl_setup_obj(L, obj); - return 0; + + lua_settop(L, 1); + return 1; } /** * obj:align_to({base=base, type=type, x_ofs=0, y_ofs=0}) */ -static int luavgl_obj_align_to(lua_State *L) { +static int luavgl_obj_align_to(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_istable(L, 2)) { - debug("para should be table."); - return luaL_argerror(L, 2, "should be table."); + LV_LOG_ERROR("para should be table"); + return luaL_argerror(L, 2, "should be table"); } lua_getfield(L, 2, "type"); @@ -205,7 +242,7 @@ static int luavgl_obj_align_to(lua_State *L) { lv_obj_t *base = luavgl_to_lobj(L, -1)->obj; lua_pop(L, 1); if (base == NULL) { - debug("base is not lua obj"); + LV_LOG_ERROR("base is not lua obj"); return luaL_argerror(L, -1, "base is not lua obj"); } @@ -218,17 +255,22 @@ static int luavgl_obj_align_to(lua_State *L) { lua_pop(L, 1); lv_obj_align_to(obj, base, align, x_ofs, y_ofs); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_parent(lua_State *L) { +static int luavgl_obj_set_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *parent = luavgl_to_obj(L, 2); lv_obj_set_parent(obj, parent); - return 0; + lua_pop(L, 1); + return 1; } -static int luavgl_obj_get_screen(lua_State *L) { +static int luavgl_obj_get_screen(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *screen = lv_obj_get_screen(obj); @@ -246,7 +288,8 @@ static int luavgl_obj_get_screen(lua_State *L) { return 1; } -static int luavgl_obj_get_parent(lua_State *L) { +static int luavgl_obj_get_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *parent = lv_obj_get_parent(obj); @@ -263,7 +306,8 @@ static int luavgl_obj_get_parent(lua_State *L) { return 1; } -static int luavgl_obj_set_get_parent(lua_State *L) { +static int luavgl_obj_set_get_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_isnoneornil(L, 2)) { lv_obj_t *parent = luavgl_to_obj(L, 2); @@ -273,7 +317,8 @@ static int luavgl_obj_set_get_parent(lua_State *L) { return luavgl_obj_get_parent(L); } -static int luavgl_obj_get_child(lua_State *L) { +static int luavgl_obj_get_child(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int id = luavgl_tointeger(L, 2); @@ -293,13 +338,15 @@ static int luavgl_obj_get_child(lua_State *L) { return 1; } -static int luavgl_obj_get_child_cnt(lua_State *L) { +static int luavgl_obj_get_child_cnt(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushinteger(L, lv_obj_get_child_cnt(obj)); return 1; } -static int luavgl_obj_get_state(lua_State *L) { +static int luavgl_obj_get_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lv_obj_get_state(obj); lua_pushinteger(L, state); @@ -312,7 +359,8 @@ static int luavgl_obj_get_state(lua_State *L) { * obj:scroll_to({x=10, anim=true}) * obj:scroll_to({x=10, y=100, anim=false}) */ -static int luavgl_obj_scroll_to(lua_State *L) { +static int luavgl_obj_scroll_to(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_istable(L, -1)) { @@ -338,176 +386,231 @@ static int luavgl_obj_scroll_to(lua_State *L) { } lua_pop(L, 1); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_visible(lua_State *L) { +static int luavgl_obj_is_visible(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_visible(obj)); return 1; } -static int luavgl_obj_add_flag(lua_State *L) { +static int luavgl_obj_add_flag(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_add_flag(obj, flag); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_clear_flag(lua_State *L) { +static int luavgl_obj_clear_flag(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_clear_flag(obj, flag); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_add_state(lua_State *L) { +static int luavgl_obj_add_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lua_tointeger(L, 2); lv_obj_add_state(obj, state); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_clear_state(lua_State *L) { +static int luavgl_obj_clear_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lua_tointeger(L, 2); lv_obj_clear_state(obj, state); - return 0; + + lua_settop(L, 1); + return 1; } /** * obj:scroll_by(x, y, anim_en) */ -static int luavgl_obj_scroll_by(lua_State *L) { +static int luavgl_obj_scroll_by(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int x = luavgl_tointeger(L, 2); int y = luavgl_tointeger(L, 3); int anim_en = luavgl_tointeger(L, 4); lv_obj_scroll_by(obj, x, y, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_by_bounded(lua_State *L) { +static int luavgl_obj_scroll_by_bounded(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int dx = luavgl_tointeger(L, 2); int dy = luavgl_tointeger(L, 3); int anim_en = luavgl_tointeger(L, 4); lv_obj_scroll_by_bounded(obj, dx, dy, anim_en); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_to_view(lua_State *L) { +static int luavgl_obj_scroll_to_view(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_scroll_to_view(obj, anim_en); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_to_view_recursive(lua_State *L) { +static int luavgl_obj_scroll_to_view_recursive(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_scroll_to_view_recursive(obj, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_by_raw(lua_State *L) { +static int luavgl_obj_scroll_by_raw(lua_State *L) +{ +#if LV_VERSION_CHECK(8, 3, 0) lv_obj_t *obj = luavgl_to_obj(L, 1); int x = luavgl_tointeger(L, 2); int y = luavgl_tointeger(L, 3); _lv_obj_scroll_by_raw(obj, x, y); - return 0; +#endif + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_scrolling(lua_State *L) { +static int luavgl_obj_is_scrolling(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_scrolling(obj)); return 1; } -static int luavgl_obj_scrollbar_invalidate(lua_State *L) { +static int luavgl_obj_scrollbar_invalidate(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_scrollbar_invalidate(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_readjust_scroll(lua_State *L) { +static int luavgl_obj_readjust_scroll(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_readjust_scroll(obj, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_editable(lua_State *L) { +static int luavgl_obj_is_editable(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_editable(obj)); return 1; } -static int luavgl_obj_is_group_def(lua_State *L) { +static int luavgl_obj_is_group_def(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_group_def(obj)); return 1; } -static int luavgl_obj_is_layout_positioned(lua_State *L) { +static int luavgl_obj_is_layout_positioned(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_layout_positioned(obj)); return 1; } -static int luavgl_obj_mark_layout_as_dirty(lua_State *L) { +static int luavgl_obj_mark_layout_as_dirty(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_mark_layout_as_dirty(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_center(lua_State *L) { +static int luavgl_obj_center(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_center(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_invalidate(lua_State *L) { +static int luavgl_obj_invalidate(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_invalidate(obj); - return 0; + + return 1; } -static int luavgl_obj_set_flex_flow(lua_State *L) { +static int luavgl_obj_set_flex_flow(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_flex_flow_t flow = luavgl_tointeger(L, 2); lv_obj_set_flex_flow(obj, flow); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_flex_align(lua_State *L) { +static int luavgl_obj_set_flex_align(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_flex_align_t m = luavgl_tointeger(L, 2); lv_flex_align_t c = luavgl_tointeger(L, 3); lv_flex_align_t t = luavgl_tointeger(L, 4); lv_obj_set_flex_align(obj, m, c, t); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_flex_grow(lua_State *L) { +static int luavgl_obj_set_flex_grow(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); uint8_t grow = luavgl_tointeger(L, 2); lv_obj_set_flex_grow(obj, grow); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_indev_search(lua_State *L) { +static int luavgl_obj_indev_search(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_point_t point; if (lua_istable(L, 2)) { @@ -537,7 +640,8 @@ static int luavgl_obj_indev_search(lua_State *L) { return 1; } -static int luavgl_obj_get_coords(lua_State *L) { +static int luavgl_obj_get_coords(lua_State *L) +{ lv_area_t area; lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_get_coords(obj, &area); @@ -561,7 +665,8 @@ static int luavgl_obj_get_coords(lua_State *L) { /** * get object real position using lv_obj_get_x/x2/y/y2 */ -static int luavgl_obj_get_pos(lua_State *L) { +static int luavgl_obj_get_pos(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_newtable(L); @@ -581,38 +686,17 @@ static int luavgl_obj_get_pos(lua_State *L) { } /** - * set this object as the current selection - */ -static int luavgl_obj_focus(lua_State *L) { - lv_obj_t *obj = luavgl_to_obj(L, 1); - - lv_group_t *group = lv_obj_get_group(obj); - if (group == NULL) { - return 0; - } - lv_group_focus_obj(obj); - - return 0; -} - -static int luavgl_obj_move_to_index(lua_State *L) { - lv_obj_t *obj = luavgl_to_obj(L, 1); - int idx = luavgl_tointeger(L, 2); - - lv_obj_move_to_index(obj, idx); - return 0; -} - -/** * Remove all animations associates to this object */ -static int luavgl_obj_remove_anim_all(lua_State *L) { +static int luavgl_obj_remove_anim_all(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_anim_del(obj, NULL); return 1; } -static int luavgl_obj_gc(lua_State *L) { +static int luavgl_obj_gc(lua_State *L) +{ if (lua_type(L, 1) != LUA_TUSERDATA) { /* If t = setmetatable({}, obj_meta_table), this will happen when t is * gc;ed. Currently all metatables for classes based on obj, that has no own @@ -621,7 +705,7 @@ static int luavgl_obj_gc(lua_State *L) { return 0; } - debug("\n"); + LV_LOG_INFO("enter"); luavgl_obj_t *lobj = lua_touserdata(L, 1); if (lobj == NULL || lobj->obj == NULL) { @@ -629,70 +713,69 @@ static int luavgl_obj_gc(lua_State *L) { return 0; } - debug("GC for obj: %p\n", lobj->obj); + LV_LOG_INFO("GC for obj: %p", lobj->obj); luavgl_obj_delete(L); return 0; } static const luaL_Reg luavgl_obj_methods[] = { - {"set", luavgl_obj_set}, - {"set_style", luavgl_obj_set_style}, - {"align_to", luavgl_obj_align_to}, - {"delete", luavgl_obj_delete}, - {"clean", luavgl_obj_clean}, - - /* misc. functions */ - {"parent", luavgl_obj_set_get_parent}, - {"set_parent", luavgl_obj_set_parent}, - {"get_parent", luavgl_obj_get_parent}, - {"get_child", luavgl_obj_get_child}, - {"get_child_cnt", luavgl_obj_get_child_cnt}, - {"get_screen", luavgl_obj_get_screen}, - {"get_state", luavgl_obj_get_state}, - {"scroll_to", luavgl_obj_scroll_to}, - {"is_scrolling", luavgl_obj_is_scrolling}, - {"is_visible", luavgl_obj_is_visible}, - {"add_flag", luavgl_obj_add_flag}, - {"clear_flag", luavgl_obj_clear_flag}, - {"add_state", luavgl_obj_add_state}, - {"clear_state", luavgl_obj_clear_state}, - {"add_style", luavgl_obj_add_style}, - {"remove_style", luavgl_obj_remove_style}, - {"remove_style_all", luavgl_obj_remove_style_all}, - {"scroll_by", luavgl_obj_scroll_by}, - {"scroll_by_bounded", luavgl_obj_scroll_by_bounded}, - {"scroll_to_view", luavgl_obj_scroll_to_view}, + {"set", luavgl_obj_set }, + {"set_style", luavgl_obj_set_style }, + {"align_to", luavgl_obj_align_to }, + {"delete", luavgl_obj_delete }, + {"clean", luavgl_obj_clean }, + + /* misc. functions */ + {"parent", luavgl_obj_set_get_parent }, + {"set_parent", luavgl_obj_set_parent }, + {"get_parent", luavgl_obj_get_parent }, + {"get_child", luavgl_obj_get_child }, + {"get_child_cnt", luavgl_obj_get_child_cnt }, + {"get_screen", luavgl_obj_get_screen }, + {"get_state", luavgl_obj_get_state }, + {"scroll_to", luavgl_obj_scroll_to }, + {"is_scrolling", luavgl_obj_is_scrolling }, + {"is_visible", luavgl_obj_is_visible }, + {"add_flag", luavgl_obj_add_flag }, + {"clear_flag", luavgl_obj_clear_flag }, + {"add_state", luavgl_obj_add_state }, + {"clear_state", luavgl_obj_clear_state }, + {"add_style", luavgl_obj_add_style }, + {"remove_style", luavgl_obj_remove_style }, + {"remove_style_all", luavgl_obj_remove_style_all }, + {"scroll_by", luavgl_obj_scroll_by }, + {"scroll_by_bounded", luavgl_obj_scroll_by_bounded }, + {"scroll_to_view", luavgl_obj_scroll_to_view }, {"scroll_to_view_recursive", luavgl_obj_scroll_to_view_recursive}, - {"scroll_by_raw", luavgl_obj_scroll_by_raw}, - {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate}, - {"readjust_scroll", luavgl_obj_readjust_scroll}, - {"is_editable", luavgl_obj_is_editable}, - {"is_group_def", luavgl_obj_is_group_def}, - {"is_layout_positioned", luavgl_obj_is_layout_positioned}, - {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty}, - {"center", luavgl_obj_center}, - {"invalidate", luavgl_obj_invalidate}, - {"set_flex_flow", luavgl_obj_set_flex_flow}, - {"set_flex_align", luavgl_obj_set_flex_align}, - {"set_flex_grow", luavgl_obj_set_flex_grow}, - {"indev_search", luavgl_obj_indev_search}, - {"get_coords", luavgl_obj_get_coords}, - {"get_pos", luavgl_obj_get_pos}, - {"focus", luavgl_obj_focus}, - {"move_to_index", luavgl_obj_move_to_index}, - - {"onevent", luavgl_obj_on_event}, - {"onPressed", luavgl_obj_on_pressed}, - {"onClicked", luavgl_obj_on_clicked}, - {"onShortClicked", luavgl_obj_on_short_clicked}, - {"anim", luavgl_anim_create}, - {"Anim", luavgl_anim_create}, - {"remove_all_anim", luavgl_obj_remove_anim_all}, /* remove all */ - {NULL, NULL}, + {"scroll_by_raw", luavgl_obj_scroll_by_raw }, + {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate }, + {"readjust_scroll", luavgl_obj_readjust_scroll }, + {"is_editable", luavgl_obj_is_editable }, + {"is_group_def", luavgl_obj_is_group_def }, + {"is_layout_positioned", luavgl_obj_is_layout_positioned }, + {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty }, + {"center", luavgl_obj_center }, + {"invalidate", luavgl_obj_invalidate }, + {"set_flex_flow", luavgl_obj_set_flex_flow }, + {"set_flex_align", luavgl_obj_set_flex_align }, + {"set_flex_grow", luavgl_obj_set_flex_grow }, + {"indev_search", luavgl_obj_indev_search }, + {"get_coords", luavgl_obj_get_coords }, + {"get_pos", luavgl_obj_get_pos }, + + {"onevent", luavgl_obj_on_event }, + {"onPressed", luavgl_obj_on_pressed }, + {"onClicked", luavgl_obj_on_clicked }, + {"onShortClicked", luavgl_obj_on_short_clicked }, + {"anim", luavgl_anim_create }, + {"Anim", luavgl_anim_create }, + {"remove_all_anim", luavgl_obj_remove_anim_all }, /* remove all */ + {NULL, NULL }, }; -static void luavgl_obj_init(lua_State *L) { +static void luavgl_obj_init(lua_State *L) +{ /* base lv_obj */ luavgl_obj_newmetatable(L, &lv_obj_class, "lv_obj", luavgl_obj_methods); lua_pushcfunction(L, luavgl_obj_gc); @@ -718,16 +801,16 @@ static void luavgl_obj_init(lua_State *L) { } static const luavgl_value_setter_t obj_property_table[] = { - {"x", 0, {.setter = (setter_int_t)lv_obj_set_x}}, - {"y", 0, {.setter = (setter_int_t)lv_obj_set_y}}, - {"w", 0, {.setter = (setter_int_t)lv_obj_set_width}}, - {"h", 0, {.setter = (setter_int_t)lv_obj_set_height}}, - {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align}}, - - {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}}, - {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir}}, - {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x}}, - {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y}}, + {"x", 0, {.setter = (setter_int_t)lv_obj_set_x} }, + {"y", 0, {.setter = (setter_int_t)lv_obj_set_y} }, + {"w", 0, {.setter = (setter_int_t)lv_obj_set_width} }, + {"h", 0, {.setter = (setter_int_t)lv_obj_set_height} }, + {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align} }, + + {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}}, + {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir} }, + {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x} }, + {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y} }, }; /** @@ -741,8 +824,17 @@ static const luavgl_value_setter_t obj_property_table[] = { * stack[-2]: key(property name) * stack[-1]: value(could be any lua data) */ -LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) { +LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) +{ lv_obj_t *obj = data; + + /* Check for integer key with userdata as value */ + if (lua_type(L, -2) == LUA_TNUMBER && lua_type(L, -1) == LUA_TUSERDATA) { + lv_obj_t *child = luavgl_to_obj(L, -1); + lv_obj_set_parent(child, obj); + return 0; + } + int ret = luavgl_set_property(L, obj, obj_property_table); if (ret == 0) @@ -753,7 +845,8 @@ LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) { } LUALIB_API int luavgl_obj_create_helper(lua_State *L, - lv_obj_t *(*create)(lv_obj_t *parent)) { + lv_obj_t *(*create)(lv_obj_t *parent)) +{ luavgl_ctx_t *ctx = luavgl_context(L); lv_obj_t *parent; @@ -765,7 +858,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, lua_remove(L, 1); } - debug("create obj on: %p\n", parent); + LV_LOG_INFO("create obj on: %p", parent); lv_obj_t *obj = create(parent); luavgl_add_lobj(L, obj)->lua_created = true; @@ -790,7 +883,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, lua_rawget(L, LUA_REGISTRYINDEX); } - debug("create obj: %p\n", obj); + LV_LOG_INFO("create obj: %p", obj); return 1; } @@ -799,7 +892,8 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, * If no metatable not found for this obj class, then lv_obj_class metatable is * used */ -LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) { +LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) +{ luavgl_obj_t *lobj; /* In rare case, obj may be deleted but not gc'ed in lua, and lvgl quickly @@ -817,16 +911,18 @@ LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) { if (luavgl_obj_getmetatable(L, obj->class_p) == LUA_TNIL) { lua_pop(L, 1); - debug("cannot find metatable for class: %p\n", obj->class_p); + LV_LOG_ERROR("cannot find metatable for class: %p", obj->class_p); /* use base obj metatable instead */ luavgl_obj_getmetatable(L, &lv_obj_class); } lua_setmetatable(L, -2); - memset(lobj, 0, sizeof(*lobj)); - luavgl_obj_event_init(lobj); + lv_memset(lobj, 0, sizeof(*lobj)); lobj->obj = obj; + + /* Init event array to store events added from lua. */ + lv_array_init(&lobj->events, 0, sizeof(struct event_callback_s *)); lv_obj_add_event_cb(obj, obj_delete_cb, LV_EVENT_DELETE, L); /* registry[obj] = lobj */ |
