1. 修复UI管理模块的问题
This commit is contained in:
parent
28aa36f70f
commit
164b291f11
@ -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个页面, 如超过则需要修改字节栈类型
|
||||
};
|
||||
} 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
|
||||
|
||||
@ -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)) {
|
||||
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));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user