home_page.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. --[[
  2. @module home_page
  3. @summary eink主页模块,提供应用入口和导航功能
  4. @version 1.0
  5. @date 2025.12.25
  6. @author 江访
  7. @usage
  8. 本模块为主页模块,主要功能包括:
  9. 1、提供应用入口和导航功能;
  10. 2、显示系统标题和操作提示;
  11. 3、管理两个功能选项的选中状态;
  12. 4、处理主页面的按键事件;
  13. 对外接口:
  14. 1、home_page.draw():绘制主页面所有UI元素,包括选中指示
  15. 2、home_page.handle_key():处理主页面按键事件
  16. 3、home_page.on_enter():页面进入时重置选中状态
  17. ]]
  18. local home_page = {}
  19. -- 选项区域定义(eink屏幕200x200,需合理布局)
  20. local options = {
  21. {name = "eink_demo", text = "eink演示", x1 = 20, y1 = 80, x2 = 90, y2 = 130, color = 0},
  22. {name = "time_demo", text = "时间显示", x1 = 110, y1 = 80, x2 = 180, y2 = 130, color = 0}
  23. }
  24. -- 当前选中项索引
  25. local selected_index = 1
  26. --[[
  27. 绘制主页界面;
  28. 绘制主页面所有UI元素,包括选中指示;
  29. @api home_page.draw()
  30. @summary 绘制主页面所有UI元素,包括选中指示
  31. @return nil
  32. @usage
  33. -- 在UI主循环中调用
  34. home_page.draw()
  35. ]]
  36. function home_page.draw()
  37. -- 清除绘图缓冲区
  38. eink.clear(1, true)
  39. -- 显示标题
  40. eink.setFont(eink.font_opposansm12_chinese)
  41. eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
  42. eink.print(60, 30, "eink演示系统", 0)
  43. -- 显示操作提示
  44. eink.print(30, 65, "切换键:切换 确认键:确认", 0)
  45. -- 绘制分隔线
  46. eink.line(10, 70, 190, 70, 0)
  47. -- 绘制所有选项框
  48. for i, opt in ipairs(options) do
  49. -- 绘制选项框
  50. if i == selected_index then
  51. -- 选中状态:实心矩形
  52. eink.rect(opt.x1, opt.y1, opt.x2, opt.y2, 0, 1)
  53. eink.print(opt.x1 + 15, opt.y1 + 25, opt.text, 1) -- 白色文字
  54. else
  55. -- 未选中状态:空心矩形
  56. eink.rect(opt.x1, opt.y1, opt.x2, opt.y2, 0, 0)
  57. eink.print(opt.x1 + 15, opt.y1 + 25, opt.text, 0) -- 黑色文字
  58. end
  59. end
  60. -- 绘制底部信息
  61. eink.print(50, 155, "eink核心库演示", 0)
  62. eink.print(60, 175, "微雪1.54寸", 0)
  63. -- 刷新屏幕
  64. eink.show(0, 0, true)
  65. end
  66. --[[
  67. 处理主页按键事件;
  68. 根据按键类型执行相应的操作;
  69. @api home_page.handle_key(key_type, switch_page)
  70. @summary 处理主页按键事件
  71. @string key_type 按键类型
  72. @valid_values "confirm_up", "switch_up"
  73. @function switch_page 页面切换回调函数
  74. @return bool 事件处理成功返回true,否则返回false
  75. @usage
  76. -- 在UI主循环中调用
  77. local handled = home_page.handle_key("switch_up", switch_page)
  78. ]]
  79. function home_page.handle_key(key_type, switch_page)
  80. log.info("home_page.handle_key", "key_type:", key_type, "selected_index:", selected_index)
  81. if key_type == "confirm_up" then
  82. -- 确认键:切换到选中的页面
  83. local opt = options[selected_index]
  84. switch_page(opt.name)
  85. return true
  86. elseif key_type == "switch_up" then
  87. -- 切换键:切换选项
  88. selected_index = selected_index % #options + 1
  89. home_page.draw() -- 立即重绘以显示新的选中状态
  90. return true
  91. end
  92. return false
  93. end
  94. --[[
  95. 页面进入时重置选中状态;
  96. 重置选中状态为第一个选项;
  97. @api home_page.on_enter()
  98. @summary 重置选中状态
  99. @return nil
  100. @usage
  101. -- 在页面切换时调用
  102. home_page.on_enter()
  103. ]]
  104. function home_page.on_enter()
  105. selected_index = 1 -- 默认选中第一个
  106. log.info("home_page", "进入主页")
  107. end
  108. --[[
  109. 页面离开时执行清理操作;
  110. @api home_page.on_leave()
  111. @summary 页面离开时执行清理操作
  112. @return nil
  113. @usage
  114. -- 在页面切换时调用
  115. home_page.on_leave()
  116. ]]
  117. function home_page.on_leave()
  118. log.info("home_page", "离开主页")
  119. end
  120. return home_page