luat_lib_easylvgl_label.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. @module easylvgl.label
  3. @summary EasyLVGL Label 组件 Lua 绑定
  4. @version 0.1.0
  5. @date 2025.12.02
  6. @tag LUAT_USE_EASYLVGL
  7. */
  8. #include "luat_base.h"
  9. #include "luat_log.h"
  10. #include "lua.h"
  11. #include "lauxlib.h"
  12. #include "../inc/luat_easylvgl.h"
  13. #include "../inc/luat_easylvgl_component.h"
  14. #include "../inc/luat_easylvgl_binding.h"
  15. #include <string.h>
  16. #define LUAT_LOG_TAG "easylvgl.label"
  17. #include "luat_log.h"
  18. // 元表名称
  19. #define EASYLVGL_LABEL_MT "easylvgl.label"
  20. /**
  21. * 创建 Label 组件
  22. * @api easylvgl.label(config)
  23. * @table config 配置表
  24. * @int config.x X 坐标,默认 0
  25. * @int config.y Y 坐标,默认 0
  26. * @int config.w 宽度,默认 100
  27. * @int config.h 高度,默认 40
  28. * @string config.text 文本内容,可选
  29. * @userdata config.parent 父对象,可选,默认当前屏幕
  30. * @return userdata Label 对象
  31. */
  32. static int l_easylvgl_label(lua_State *L) {
  33. // 检查上下文是否已初始化(从注册表获取)
  34. easylvgl_ctx_t *ctx = NULL;
  35. lua_getfield(L, LUA_REGISTRYINDEX, "easylvgl_ctx");
  36. if (lua_type(L, -1) == LUA_TLIGHTUSERDATA) {
  37. ctx = (easylvgl_ctx_t *)lua_touserdata(L, -1);
  38. }
  39. lua_pop(L, 1);
  40. if (ctx == NULL) {
  41. luaL_error(L, "easylvgl not initialized, call easylvgl.init() first");
  42. return 0;
  43. }
  44. luaL_checktype(L, 1, LUA_TTABLE);
  45. lv_obj_t *label = easylvgl_label_create_from_config(L, 1);
  46. if (label == NULL) {
  47. lua_pushnil(L);
  48. return 1;
  49. }
  50. easylvgl_push_component_userdata(L, label, EASYLVGL_LABEL_MT);
  51. return 1;
  52. }
  53. /**
  54. * Label:set_text(text)
  55. * @api label:set_text(text)
  56. * @string text 文本内容
  57. * @return nil
  58. */
  59. static int l_label_set_text(lua_State *L) {
  60. lv_obj_t *label = easylvgl_check_component(L, 1, EASYLVGL_LABEL_MT);
  61. const char *text = luaL_checkstring(L, 2);
  62. easylvgl_label_set_text(label, text);
  63. return 0;
  64. }
  65. static int l_label_set_symbol(lua_State *L) {
  66. lv_obj_t *label = easylvgl_check_component(L, 1, EASYLVGL_LABEL_MT);
  67. const char *symbol = luaL_checkstring(L, 2);
  68. if (symbol == NULL) {
  69. return 0;
  70. }
  71. lv_label_set_text(label, symbol);
  72. return 0;
  73. }
  74. static int l_label_set_on_click(lua_State *L) {
  75. lv_obj_t *label = easylvgl_check_component(L, 1, EASYLVGL_LABEL_MT);
  76. luaL_checktype(L, 2, LUA_TFUNCTION);
  77. lua_pushvalue(L, 2);
  78. int ref = luaL_ref(L, LUA_REGISTRYINDEX);
  79. lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE);
  80. easylvgl_component_meta_t *meta = easylvgl_component_meta_get(label);
  81. if (meta != NULL) {
  82. easylvgl_component_bind_event(meta, EASYLVGL_EVENT_CLICKED, ref);
  83. } else {
  84. luaL_unref(L, LUA_REGISTRYINDEX, ref);
  85. }
  86. return 0;
  87. }
  88. /**
  89. * Label:get_text()
  90. * @api label:get_text()
  91. * @return string 文本内容
  92. */
  93. static int l_label_get_text(lua_State *L) {
  94. lv_obj_t *label = easylvgl_check_component(L, 1, EASYLVGL_LABEL_MT);
  95. const char *text = easylvgl_label_get_text(label);
  96. if (text != NULL) {
  97. lua_pushstring(L, text);
  98. } else {
  99. lua_pushstring(L, "");
  100. }
  101. return 1;
  102. }
  103. /**
  104. * Label GC(垃圾回收)
  105. */
  106. static int l_label_gc(lua_State *L) {
  107. easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)luaL_checkudata(L, 1, EASYLVGL_LABEL_MT);
  108. if (ud != NULL && ud->obj != NULL) {
  109. // 获取元数据并释放
  110. easylvgl_component_meta_t *meta = easylvgl_component_meta_get(ud->obj);
  111. if (meta != NULL) {
  112. easylvgl_component_meta_free(meta);
  113. }
  114. // 删除 LVGL 对象
  115. lv_obj_delete(ud->obj);
  116. ud->obj = NULL;
  117. }
  118. return 0;
  119. }
  120. /**
  121. * 注册 Label 元表
  122. * @param L Lua 状态
  123. */
  124. void easylvgl_register_label_meta(lua_State *L) {
  125. luaL_newmetatable(L, EASYLVGL_LABEL_MT);
  126. // 设置元方法
  127. lua_pushcfunction(L, l_label_gc);
  128. lua_setfield(L, -2, "__gc");
  129. // 设置方法表
  130. static const luaL_Reg methods[] = {
  131. {"set_text", l_label_set_text},
  132. {"set_symbol", l_label_set_symbol},
  133. {"set_on_click", l_label_set_on_click},
  134. {"get_text", l_label_get_text},
  135. {NULL, NULL}
  136. };
  137. luaL_newlib(L, methods);
  138. lua_setfield(L, -2, "__index");
  139. lua_pop(L, 1);
  140. }
  141. /**
  142. * Label 创建函数(供主模块注册)
  143. */
  144. int easylvgl_label_create(lua_State *L) {
  145. return l_easylvgl_label(L);
  146. }