luat_lib_easylvgl_tabview.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. @module easylvgl.tabview
  3. @summary EasyLVGL TabView 组件
  4. @version 0.1.0
  5. @date 2025.12.26
  6. @tag LUAT_USE_EASYLVGL
  7. */
  8. #include "luat_base.h"
  9. #include "lua.h"
  10. #include "lauxlib.h"
  11. #include "../inc/luat_easylvgl.h"
  12. #include "../inc/luat_easylvgl_component.h"
  13. #include "../inc/luat_easylvgl_binding.h"
  14. #define EASYLVGL_TABVIEW_MT "easylvgl.tabview"
  15. static int l_easylvgl_tabview(lua_State *L) {
  16. easylvgl_ctx_t *ctx = NULL;
  17. lua_getfield(L, LUA_REGISTRYINDEX, "easylvgl_ctx");
  18. if (lua_type(L, -1) == LUA_TLIGHTUSERDATA) {
  19. ctx = (easylvgl_ctx_t *)lua_touserdata(L, -1);
  20. }
  21. lua_pop(L, 1);
  22. if (ctx == NULL) {
  23. luaL_error(L, "easylvgl not initialized, call easylvgl.init() first");
  24. return 0;
  25. }
  26. luaL_checktype(L, 1, LUA_TTABLE);
  27. lv_obj_t *tabview = easylvgl_tabview_create_from_config(L, 1);
  28. if (tabview == NULL) {
  29. lua_pushnil(L);
  30. return 1;
  31. }
  32. easylvgl_push_component_userdata(L, tabview, EASYLVGL_TABVIEW_MT);
  33. return 1;
  34. }
  35. static int l_tabview_set_active(lua_State *L) {
  36. lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
  37. int index = luaL_checkinteger(L, 2);
  38. easylvgl_tabview_set_active(tabview, index);
  39. return 0;
  40. }
  41. static int l_tabview_get_content(lua_State *L) {
  42. lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
  43. int index = luaL_checkinteger(L, 2);
  44. lv_obj_t *page = easylvgl_tabview_get_content(tabview, index);
  45. if (page == NULL) {
  46. lua_pushnil(L);
  47. return 1;
  48. }
  49. easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)lua_newuserdata(L, sizeof(easylvgl_component_ud_t));
  50. ud->obj = page;
  51. return 1;
  52. }
  53. static int l_tabview_set_on_change(lua_State *L) {
  54. lv_obj_t *tabview = easylvgl_check_component(L, 1, EASYLVGL_TABVIEW_MT);
  55. luaL_checktype(L, 2, LUA_TFUNCTION);
  56. lua_pushvalue(L, 2);
  57. int ref = luaL_ref(L, LUA_REGISTRYINDEX);
  58. easylvgl_component_meta_t *meta = easylvgl_component_meta_get(tabview);
  59. if (meta != NULL) {
  60. easylvgl_component_bind_event(meta, EASYLVGL_EVENT_VALUE_CHANGED, ref);
  61. } else {
  62. luaL_unref(L, LUA_REGISTRYINDEX, ref);
  63. }
  64. return 0;
  65. }
  66. static int l_tabview_gc(lua_State *L) {
  67. easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)luaL_checkudata(L, 1, EASYLVGL_TABVIEW_MT);
  68. if (ud != NULL && ud->obj != NULL) {
  69. easylvgl_component_meta_t *meta = easylvgl_component_meta_get(ud->obj);
  70. if (meta != NULL) {
  71. easylvgl_tabview_release_data(meta);
  72. easylvgl_component_meta_free(meta);
  73. }
  74. lv_obj_delete(ud->obj);
  75. ud->obj = NULL;
  76. }
  77. return 0;
  78. }
  79. void easylvgl_register_tabview_meta(lua_State *L) {
  80. luaL_newmetatable(L, EASYLVGL_TABVIEW_MT);
  81. lua_pushcfunction(L, l_tabview_gc);
  82. lua_setfield(L, -2, "__gc");
  83. static const luaL_Reg methods[] = {
  84. {"set_active", l_tabview_set_active},
  85. {"get_content", l_tabview_get_content},
  86. {"set_on_change", l_tabview_set_on_change},
  87. {NULL, NULL}
  88. };
  89. luaL_newlib(L, methods);
  90. lua_setfield(L, -2, "__index");
  91. lua_pop(L, 1);
  92. }
  93. int easylvgl_tabview_create(lua_State *L) {
  94. return l_easylvgl_tabview(L);
  95. }