| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /*
- @module easylvgl.tabview
- @summary EasyLVGL TabView 组件
- @version 0.1.0
- @date 2025.12.26
- @tag LUAT_USE_EASYLVGL
- */
- #include "luat_base.h"
- #include "lua.h"
- #include "lauxlib.h"
- #include "../inc/luat_easylvgl.h"
- #include "../inc/luat_easylvgl_component.h"
- #include "../inc/luat_easylvgl_binding.h"
- #define EASYLVGL_TABVIEW_MT "easylvgl.tabview"
- static int l_easylvgl_tabview(lua_State *L) {
- easylvgl_ctx_t *ctx = NULL;
- lua_getfield(L, LUA_REGISTRYINDEX, "easylvgl_ctx");
- if (lua_type(L, -1) == LUA_TLIGHTUSERDATA) {
- ctx = (easylvgl_ctx_t *)lua_touserdata(L, -1);
- }
- lua_pop(L, 1);
- if (ctx == NULL) {
- luaL_error(L, "easylvgl not initialized, call easylvgl.init() first");
- return 0;
- }
- luaL_checktype(L, 1, LUA_TTABLE);
- lv_obj_t *tabview = easylvgl_tabview_create_from_config(L, 1);
- if (tabview == NULL) {
- lua_pushnil(L);
- return 1;
- }
- easylvgl_push_component_userdata(L, tabview, EASYLVGL_TABVIEW_MT);
- return 1;
- }
- static int l_tabview_set_active(lua_State *L) {
- lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
- int index = luaL_checkinteger(L, 2);
- easylvgl_tabview_set_active(tabview, index);
- return 0;
- }
- static int l_tabview_get_content(lua_State *L) {
- lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
- int index = luaL_checkinteger(L, 2);
- lv_obj_t *page = easylvgl_tabview_get_content(tabview, index);
- if (page == NULL) {
- lua_pushnil(L);
- return 1;
- }
- easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)lua_newuserdata(L, sizeof(easylvgl_component_ud_t));
- ud->obj = page;
- return 1;
- }
- static int l_tabview_set_on_change(lua_State *L) {
- lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
- luaL_checktype(L, 2, LUA_TFUNCTION);
- lua_pushvalue(L, 2);
- int ref = luaL_ref(L, LUA_REGISTRYINDEX);
- easylvgl_component_meta_t *meta = easylvgl_component_meta_get(tabview);
- if (meta != NULL) {
- easylvgl_component_bind_event(meta, EASYLVGL_EVENT_VALUE_CHANGED, ref);
- } else {
- luaL_unref(L, LUA_REGISTRYINDEX, ref);
- }
- return 0;
- }
- static int l_tabview_gc(lua_State *L) {
- easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)luaL_checkudata(L, 1, EASYLVGL_TABVIEW_MT);
- if (ud != NULL && ud->obj != NULL) {
- easylvgl_component_meta_t *meta = easylvgl_component_meta_get(ud->obj);
- if (meta != NULL) {
- easylvgl_tabview_release_data(meta);
- easylvgl_component_meta_free(meta);
- }
- lv_obj_delete(ud->obj);
- ud->obj = NULL;
- }
- return 0;
- }
- void easylvgl_register_tabview_meta(lua_State *L) {
- luaL_newmetatable(L, EASYLVGL_TABVIEW_MT);
- lua_pushcfunction(L, l_tabview_gc);
- lua_setfield(L, -2, "__gc");
- static const luaL_Reg methods[] = {
- {"set_active", l_tabview_set_active},
- {"get_content", l_tabview_get_content},
- {"set_on_change", l_tabview_set_on_change},
- {NULL, NULL}
- };
- luaL_newlib(L, methods);
- lua_setfield(L, -2, "__index");
- lua_pop(L, 1);
- }
- int easylvgl_tabview_create(lua_State *L) {
- return l_easylvgl_tabview(L);
- }
|