将菜单的架构改成 MVP,并且进一步优化视图层和模型层的逻辑

This commit is contained in:
2026-04-01 19:42:05 +08:00
parent 0690d6a00e
commit 8b44b84d4c
54 changed files with 5362 additions and 2200 deletions

View File

@@ -0,0 +1,77 @@
#ifndef PAGE_MANAGER_H
#define PAGE_MANAGER_H
#include "page.h"
/* -------------------------------------------------------------------------
* 结构体名: page_manager_t
* 作用:
* 页面管理器运行时上下文,维护“页面栈 + 页面注册表”两套核心状态。
*
* 设计说明:
* - page_stack:
* 运行时导航栈,表示当前页面跳转路径。
* 栈顶元素是当前可见/可交互页面。
* - stack_top:
* 栈顶索引。约定 -1 表示空栈。
* 当前栈深可由 (stack_top + 1) 推导。
* - page_registry:
* 可导航页面的注册表,按 page_id 查找目标页面时使用。
* - page_count:
* 当前注册表有效页面数量,范围 [0, MAX_PAGE_COUNT]。
*
* 约束关系:
* - page_stack 最大深度由 MAX_PAGE_STACK_DEPTH 限制;
* - page_registry 最大容量由 MAX_PAGE_COUNT 限制;
* - 调用方需通过 PageManager_Init 初始化后再使用。
* ------------------------------------------------------------------------- */
#define MAX_PAGE_STACK_DEPTH 5
#define MAX_PAGE_COUNT 16
/* -------------------------------------------------------------------------
* 枚举名: page_manager_result_t
* 作用:
* 定义 PageManager 相关接口的统一返回码,避免使用无语义的裸整数。
*
* 取值说明:
* PAGE_MANAGER_OK - 操作成功
* PAGE_MANAGER_ERR_NULL_PARAM - 传入参数为空
* PAGE_MANAGER_ERR_INVALID_ID - 页面 ID 非法
* PAGE_MANAGER_ERR_NOT_FOUND - 目标页面未注册/未找到
* PAGE_MANAGER_ERR_STACK_FULL - 页面栈已满,无法继续压栈
* PAGE_MANAGER_ERR_STACK_BOTTOM - 页面栈已到栈底,无法继续弹栈
* PAGE_MANAGER_ERR_REGISTRY_FULL - 页面注册表已满
* PAGE_MANAGER_ERR_NO_ACTIVE_PAGE - 当前无活动页面可供分发/循环驱动
* ------------------------------------------------------------------------- */
typedef enum
{
PAGE_MANAGER_OK = 0,
PAGE_MANAGER_ERR_NULL_PARAM = -1,
PAGE_MANAGER_ERR_INVALID_ID = -2,
PAGE_MANAGER_ERR_NOT_FOUND = -3,
PAGE_MANAGER_ERR_STACK_FULL = -4,
PAGE_MANAGER_ERR_STACK_BOTTOM = -5,
PAGE_MANAGER_ERR_REGISTRY_FULL = -6,
PAGE_MANAGER_ERR_NO_ACTIVE_PAGE = -7
} page_manager_result_t;
typedef struct
{
page_t *page_stack[MAX_PAGE_STACK_DEPTH]; /* 页面导航栈 */
int8_t stack_top; /* 栈顶索引(-1 表示空栈) */
page_t *page_registry[MAX_PAGE_COUNT]; /* 页面注册表 */
uint8_t page_count; /* 注册页面数量 */
} page_manager_t;
void PageManager_Init(void);
page_manager_result_t PageManager_Register(page_t *page);
page_manager_result_t PageManager_Navigate(page_id_t pageId);
page_manager_result_t PageManager_DispatchEvent(input_event_t *event);
page_t *PageManager_GetTop(void);
page_manager_result_t PageManager_Push(page_t *newPage);
page_manager_result_t PageManager_Pop(void);
page_t *PageManager_Find(page_id_t pageId);
void PageManager_Loop(void);
#endif