增加两页UI

This commit is contained in:
2026-09-09 13:18:06 +08:00
parent 9ead5679a1
commit 24c2f57555
24 changed files with 1436 additions and 122 deletions
+32 -4
View File
@@ -21,6 +21,8 @@
#include "ui_menu_view.h"
#include "ui_content_page.h"
#include "ui_menu_tab.h"
#include "lvgl.h"
@@ -88,6 +90,23 @@ static void menu_back(void) {
ui_menu_view_focus();
}
/*
* 函数功能:查叶子节点对应的内容页(无内容页返回哨兵值)
* 入口参数:node - 菜单节点下标 uint8_t
* 返回值:内容页 ID content_page_id_t;无内容页 = CONTENT_PAGE_COUNT
* 限定条件:无
* 函数说明:仅部分叶子有内容页(参考图 10/20/21);下标对应 ui_menu_tab.c
* node 1=装置信息、3=交流量、4=直流量(表序变更时须同步本映射)
*/
static content_page_id_t menu_content_page_for(uint8_t node) {
switch (node) {
case 1u: return CONTENT_PAGE_DEVICE_INFO; /* 装置信息(L1 叶子) */
case 3u: return CONTENT_PAGE_AC; /* 交流量(实时数据子项) */
case 4u: return CONTENT_PAGE_DC; /* 直流量(实时数据子项) */
default: return (content_page_id_t)CONTENT_PAGE_COUNT; /* 无内容页 */
}
}
/*
* 函数功能:按键语义分发(移/进/退)
* 入口参数:depth - 焦点所在层深度 uint8_t
@@ -95,7 +114,7 @@ static void menu_back(void) {
* 返回值:无
* 限定条件:ui_menu_init() 已完成
* 函数说明: 1. UP/DOWN:移选(首尾环绕);选中越出可见区由显示层跟随滚动
* 2. ENTER/RIGHT:进子框(叶子 → 空白终点框)
* 2. ENTER/RIGHT:叶子有内容页 → 切内容屏(不压层);否则进子框(叶子 → 空白终点框)
* 3. ESC/LEFT:关最右框(根框不响应)
* 4. 空框(终点页 0 条目)只响应返回
*/
@@ -119,12 +138,21 @@ static void menu_key_handle(uint8_t depth, lv_key_t key) {
}
break;
case LV_KEY_ENTER:
case LV_KEY_RIGHT:
case LV_KEY_RIGHT: {
/* 进子框:空框无条目可进;最深层(depth=MAX-1)无子层可再开 */
if (cnt > 0u && depth < MENU_PAGE_MAX - 1u) {
menu_open(kids[s_sel[depth]]); /* 压层:建新框 + 焦点移到新框 */
if (cnt > 0u) {
content_page_id_t pid = menu_content_page_for(kids[s_sel[depth]]);
if (pid < CONTENT_PAGE_COUNT) {
/* 叶子有内容页:切内容屏(不压层,导航状态原样保留;ESC 返回即还原) */
ui_content_page_open(pid);
}
else if (depth < MENU_PAGE_MAX - 1u) {
menu_open(kids[s_sel[depth]]); /* 压层:建新框 + 焦点移到新框(叶子 → 空白终点框) */
}
}
break;
}
case LV_KEY_ESC:
case LV_KEY_LEFT:
if (depth > 0u) { /* 根框(d=0)不响应返回 */