luat_lib_easylvgl_msgbox.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. @module easylvgl.msgbox
  3. @summary EasyLVGL Msgbox 组件
  4. @version 0.2.0
  5. @date 2025.12.12
  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 "lvgl9/src/widgets/msgbox/lv_msgbox.h"
  16. #include "lvgl9/src/misc/lv_timer.h"
  17. #include "lvgl9/src/misc/lv_event.h"
  18. #define LUAT_LOG_TAG "easylvgl.msgbox"
  19. #include "luat_log.h"
  20. #define EASYLVGL_MSGBOX_MT "easylvgl.msgbox"
  21. /**
  22. * 清理 msgbox Lua 侧关联数据
  23. * @param ud 组件用户数据
  24. */
  25. static void easylvgl_msgbox_lua_cleanup(easylvgl_component_ud_t *ud)
  26. {
  27. if (ud == NULL || ud->obj == NULL) {
  28. return;
  29. }
  30. easylvgl_component_meta_t *meta = easylvgl_component_meta_get(ud->obj);
  31. if (meta != NULL) {
  32. lv_timer_t *timer = easylvgl_msgbox_release_user_data(meta);
  33. if (timer != NULL) {
  34. lv_timer_delete(timer);
  35. }
  36. easylvgl_component_meta_free(meta);
  37. }
  38. lv_msgbox_close(ud->obj);
  39. ud->obj = NULL;
  40. }
  41. /**
  42. * 创建 Msgbox 组件
  43. * @api easylvgl.msgbox(config)
  44. * @table config 配置表
  45. * @string config.title 标题文本,可选
  46. * @string config.text 内容文本,可选
  47. * @boolean config.auto_center 是否自动居中,默认 true
  48. * @int config.timeout 自动关闭时间(毫秒),默认 0
  49. * @table config.buttons 按钮标签数组,默认 ["OK"]
  50. * @function config.on_action 按钮点击回调
  51. * @userdata config.parent 父对象,可选
  52. * @return userdata Msgbox 对象,失败返回 nil
  53. */
  54. static int l_easylvgl_msgbox(lua_State *L)
  55. {
  56. easylvgl_ctx_t *ctx = NULL;
  57. lua_getfield(L, LUA_REGISTRYINDEX, "easylvgl_ctx");
  58. if (lua_type(L, -1) == LUA_TLIGHTUSERDATA) {
  59. ctx = (easylvgl_ctx_t *)lua_touserdata(L, -1);
  60. }
  61. lua_pop(L, 1);
  62. if (ctx == NULL) {
  63. luaL_error(L, "easylvgl not initialized, call easylvgl.init() first");
  64. return 0;
  65. }
  66. luaL_checktype(L, 1, LUA_TTABLE);
  67. lv_obj_t *msgbox = easylvgl_msgbox_create_from_config(L, 1);
  68. if (msgbox == NULL) {
  69. lua_pushnil(L);
  70. return 1;
  71. }
  72. easylvgl_push_component_userdata(L, msgbox, EASYLVGL_MSGBOX_MT);
  73. return 1;
  74. }
  75. /**
  76. * Msgbox:show()
  77. * @api msgbox:show()
  78. * @return nil
  79. */
  80. static int l_msgbox_show(lua_State *L)
  81. {
  82. lv_obj_t *msgbox = easylvgl_check_component(L, 1, EASYLVGL_MSGBOX_MT);
  83. easylvgl_msgbox_show(msgbox);
  84. return 0;
  85. }
  86. /**
  87. * Msgbox:hide()
  88. * @api msgbox:hide()
  89. * @return nil
  90. */
  91. static int l_msgbox_hide(lua_State *L)
  92. {
  93. lv_obj_t *msgbox = easylvgl_check_component(L, 1, EASYLVGL_MSGBOX_MT);
  94. easylvgl_msgbox_hide(msgbox);
  95. return 0;
  96. }
  97. /**
  98. * Msgbox:set_on_action(callback)
  99. * @api msgbox:set_on_action(callback)
  100. * @function callback 操作回调(按键 ID 传参)
  101. * @return nil
  102. */
  103. static int l_msgbox_set_on_action(lua_State *L)
  104. {
  105. lv_obj_t *msgbox = easylvgl_check_component(L, 1, EASYLVGL_MSGBOX_MT);
  106. luaL_checktype(L, 2, LUA_TFUNCTION);
  107. lua_pushvalue(L, 2);
  108. int ref = luaL_ref(L, LUA_REGISTRYINDEX);
  109. easylvgl_msgbox_set_on_action(msgbox, ref);
  110. return 0;
  111. }
  112. /**
  113. * Msgbox:release()
  114. * @api msgbox:release()
  115. * @return nil
  116. */
  117. static int l_msgbox_release(lua_State *L)
  118. {
  119. easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)luaL_checkudata(L, 1, EASYLVGL_MSGBOX_MT);
  120. if (ud != NULL && ud->obj != NULL) {
  121. easylvgl_msgbox_lua_cleanup(ud);
  122. }
  123. return 0;
  124. }
  125. /**
  126. * Msgbox GC(Lua 垃圾回收)
  127. */
  128. static int l_msgbox_gc(lua_State *L)
  129. {
  130. easylvgl_component_ud_t *ud = (easylvgl_component_ud_t *)luaL_checkudata(L, 1, EASYLVGL_MSGBOX_MT);
  131. easylvgl_msgbox_lua_cleanup(ud);
  132. return 0;
  133. }
  134. /**
  135. * 注册 Msgbox 元表
  136. * @param L Lua 状态
  137. */
  138. void easylvgl_register_msgbox_meta(lua_State *L)
  139. {
  140. luaL_newmetatable(L, EASYLVGL_MSGBOX_MT);
  141. lua_pushcfunction(L, l_msgbox_gc);
  142. lua_setfield(L, -2, "__gc");
  143. static const luaL_Reg methods[] = {
  144. {"show", l_msgbox_show},
  145. {"hide", l_msgbox_hide},
  146. {"set_on_action", l_msgbox_set_on_action},
  147. {"release", l_msgbox_release},
  148. {NULL, NULL}
  149. };
  150. luaL_newlib(L, methods);
  151. lua_setfield(L, -2, "__index");
  152. lua_pop(L, 1);
  153. }
  154. /**
  155. * Msgbox 创建函数(供主模块注册)
  156. */
  157. int easylvgl_msgbox_create(lua_State *L)
  158. {
  159. return l_easylvgl_msgbox(L);
  160. }