#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