From 164b291f11ea7e24ff5bbbb5739924b92d997952 Mon Sep 17 00:00:00 2001 From: coffee Date: Tue, 22 Apr 2025 11:57:30 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8DUI=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HUIPageManage.h | 40 ++++++++++++++--- src/HUIPageManage.c | 96 ++++++++++++++++++++++++++++++++--------- 2 files changed, 110 insertions(+), 26 deletions(-) diff --git a/include/HUIPageManage.h b/include/HUIPageManage.h index e4e3477..df69fb0 100644 --- a/include/HUIPageManage.h +++ b/include/HUIPageManage.h @@ -18,14 +18,38 @@ #define __COUNT_ARGS(...) __COUNT_ARGS_IMPL(dummy, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) #endif +#define USE_UI_PAGE +/** ================================================================= */ // 注册页面函数辅助宏 #define UIPAGE_FUNC(func) uint8_t func##PageCall(uint16_t cmd, void *data, uint16_t len) #define UIPAGE_DATA data #define UIPAGE_LEN len #define UIPAGE_CMD cmd +#if 1 +#define UIPAGE_CASE(page, func) case page: { LogD("current page[%d], event[%s]", page, #page); func(); LogD("event End"); } break +#define UIPAGE_CASE_RET(page, func) case page: { LogD("current page[%d], event[%s]", page, #page); return func(); LogD("event End"); } break +#else +#define UIPAGE_CASE(page, func) case page: { func(); } break +#define UIPAGE_CASE_RET(page, func) case page: { return func(); } break +#endif + +#define UIPAGE_INIT_FUNC(func) UIPAGE_CASE(kCallInitPage, func) +#define UIPAGE_FREE_FUNC(func) UIPAGE_CASE(kCallFreePage, func) +#define UIPAGE_SHOW_FUNC(func) UIPAGE_CASE(kCallShowPage, func) +#define UIPAGE_HIDE_FUNC(func) UIPAGE_CASE(kCallHidePage, func) + +#define UIPAGE_SWITCH_FUNC(func) UIPAGE_CASE_RET(kCallSwitchPage, func) +#define UIPAGE_INDEX_FUNC(func) UIPAGE_CASE(kCallIndexSave, func) + +#define UIPAGE_INIT_SHOW_FUNC(init, show) UIPAGE_INIT_FUNC(init); UIPAGE_SHOW_FUNC(show) +#define UIPAGE_DEINIT_HIDE_FUNC(deinit, hide) UIPAGE_FREE_FUNC(deinit); UIPAGE_HIDE_FUNC(hide) +#define UIPAGE_INIT_DEINIT_FUNC(init, deinit) UIPAGE_INIT_FUNC(init); UIPAGE_FREE_FUNC(deinit) +#define UIPAGE_SHOW_HIDE_FUNC(show, hide) UIPAGE_SHOW_FUNC(show); UIPAGE_HIDE_FUNC(hide) + // 对应事件的data转换具体类型宏 #define UI_CALL_INDEX_TYPE(value) ((enum eUIPage *)value) +/** ================================================================= */ // hide -> free -> update Page -> init -> show @@ -42,11 +66,12 @@ enum eCallCmd }; -// 每个页面占用一个枚举, 根据枚举切换页面, kUIPageMax最大页面值, 要求格式统一 kUIPage + 页面名 -enum eUIPage +// 每个页面占用一个枚举, 根据枚举切换页面, kUIPageMax最大页面值, 要求格式统一 kUIPage + 页面名, 可以任意调整位置 +typedef enum eUIPage { - kUIPageMax, ///< ui最大个数, 不超过254个页面, 如超过则需要修改字节栈类型 -}; + + kUIPageMax, ///< ui最大个数, 不超过254个页面, 如超过则需要修改字节栈类型 +} eUIPage; ///< cmd命令, data数据, len数据长度 typedef uint8_t (*pageCallType_t)(uint16_t cmd, void *data, uint16_t len); @@ -62,11 +87,14 @@ void HUIPageSetHome(enum eUIPage page); // 因为有些页面可能不用HUIPageBack来返回, 所以需要兼容这种情况 void HUIPageSwitch(enum eUIPage page); +// 切换到主页 +void HUIPageSwitchHome(); + // 返回上一个页面 void HUIPageBack(); -// 清空返回栈 -void HUIPageClear(); +// 清空返回栈, 不允许切换时, 将显示该页面, 而无法继续回栈, 成功返回1, 否则返回0 +uint8_t HUIPageClear(); /** * @brief diff --git a/src/HUIPageManage.c b/src/HUIPageManage.c index 858cbae..685519f 100644 --- a/src/HUIPageManage.c +++ b/src/HUIPageManage.c @@ -61,7 +61,8 @@ static void InitPage() { static void UpdateIndexEvent(uint8_t currPage, uint8_t isHideEvent, enum eUIPage nextPage) { - pageManage.saveIndex = 1; + // 非回退情况下, 保存索引 + pageManage.saveIndex = pageManage.isBack == 0; if (isHideEvent) { pageManage.pageCall[currPage](kCallHidePage, NULL, 0); } else { @@ -98,30 +99,43 @@ static uint8_t CheckSwitchPage() { return 1; } -static void SwitchPage(enum eUIPage page) { +static void HideFreePage(enum eUIPage currPage, enum eUIPage nextPage) { if (pageManage.isInit == 1) { // hide -> free -> update Page -> init -> show - UpdateIndexEvent(pageManage.currPage, 1, page); + UpdateIndexEvent(currPage, 1, nextPage); if (pageManage.isBack == 0) { // 非回退时触发存储索引事件 // hide -> index -> free -> update Page -> init -> show - UpdateIndexEvent(pageManage.currPage, 0, page); + UpdateIndexEvent(currPage, 0, nextPage); } - if (HBitGet(notFreeBit, pageManage.currPage) == 0) { + if (HBitGet(notFreeBit, currPage) == 0) { pageManage.pageCall[pageManage.currPage](kCallFreePage, NULL, 0); - HBitSet(initPageBit, pageManage.currPage, 0); + HBitSet(initPageBit, currPage, 0); } } else { pageManage.isInit = 1; } +} +static void RecoveryUserDataFlag() { // 上一个页面退出时, 不修改用户数据就重置为0 if (pageManage.modifyUserData == 0) { pageManage.userData = 0; } pageManage.modifyUserData = 0; +} + +static void SwitchPage(enum eUIPage page) { + if (CheckPageIsNull(page) == 0) { + LogD("Switch Page[%d] is nullptr", page); + return ; + } + + HideFreePage(pageManage.currPage, page); + + RecoveryUserDataFlag(); pageManage.prevPage = pageManage.currPage; pageManage.currPage = page; @@ -137,11 +151,7 @@ static void SwitchPage(enum eUIPage page) { HBitSet(initPageBit, pageManage.currPage, 1); pageManage.pageCall[pageManage.currPage](kCallShowPage, NULL, 0); - if (pageManage.modifyUserData == 0) { - pageManage.userData = 0; - } - - pageManage.modifyUserData = 0; + RecoveryUserDataFlag(); pageManage.isBack = 0; } @@ -158,7 +168,7 @@ void HUIPageInit(initPageType_t initPage) { InitPage(); } - SwitchPage(pageManage.homePage); + //SwitchPage(pageManage.homePage); } void HUIPageSetHome(enum eUIPage page) { @@ -191,7 +201,9 @@ void HUIPageSwitch(enum eUIPage page) { // 切换到首页时清空返回栈 pageManage.isBack = 0; if (page == pageManage.homePage) { - HUIPageClear(); + if (HUIPageClear() == 0) { + return ; + } } else { // 如果查找页面在栈中, 说明这个是返回, 当前页面不能入栈 HByteLenType pos = HByteStackFind(pageStack, page); @@ -209,11 +221,27 @@ void HUIPageSwitch(enum eUIPage page) { SwitchPage(page); } +void HUIPageSwitchHome() { + if (HUIPageClear() == 0) { + return ; + } + + SwitchPage(pageManage.homePage); +} + // 返回上一个页面 void HUIPageBack() { + // 检查当前页面是否允许切换 + if (CheckSwitchPage() == 0) { + return ; + } + pageManage.isBack = 1; if (HByteStackEmpty(pageStack)) { - SwitchPage(pageManage.homePage); + if (pageManage.currPage != pageManage.homePage) { + LogD("currPage[%d], backHome", pageManage.currPage); + SwitchPage(pageManage.homePage); + } return; } @@ -221,10 +249,36 @@ void HUIPageBack() { HByteStackPop(indexStack); } -// 清空返回栈 -void HUIPageClear() { - HByteStackClear(pageStack); - HByteStackClear(indexStack); +// 清空返回栈, 不允许切换时, 将显示该页面, 而无法继续回栈 +uint8_t HUIPageClear() { + uint8_t isBack = pageManage.isBack; + uint8_t needShow = 0; + uint8_t result = 1; + pageManage.isBack = 1; + + // 逐个回栈清理 + while (HByteStackEmpty(pageStack) == 0) { + if (CheckSwitchPage() == 0) { + if (needShow) { + SwitchPage(pageManage.currPage); + } + + result = 0; + break; + } + + HideFreePage(pageManage.currPage, HByteStackTop(pageStack)); + pageManage.prevPage = pageManage.currPage; + pageManage.currPage = HByteStackTop(pageStack); + RecoveryUserDataFlag(); + + HByteStackPop(pageStack); + HByteStackPop(indexStack); + needShow = 1; + } + + pageManage.isBack = isBack; + return result; } /** @@ -258,7 +312,9 @@ void _HUIPageAddStack(int len, ...) { pageManage.isBack = 1; } else if (curr == pageManage.homePage) { // 如果查找不到, 传入的首个页面又是首页, 则清空返回栈 - HUIPageClear(); + if (HUIPageClear() == 0) { + return ; + } } findPos = HByteStackGetUseLen(pageStack); @@ -359,7 +415,7 @@ uint8_t HUIPageSaveIndex(uint8_t value) { return 1; } -// 获取当前页面索引 +// 获取当前页面索引, 仅在 HUIPageIsBack() 返回1时有效, 否则返回0 uint8_t HUIPageGetIndex() { if (pageManage.isBack == 0) { LogD("not back Event, value[%d] size[%d]", HByteStackTop(indexStack), HByteStackGetUseLen(indexStack));