代码拉取完成,页面将自动刷新
#include "vtor_menu.h"
#include "vtor_printf.h"
#ifdef __VTOR_MENU__
// 根菜单节点,当前显示的菜单,当前选择的子菜单
VtorMenu* VtorMenu_CurMenu = NULL;
VtorMenu* VtorMenu_CurSubMenu = NULL;
void VtorMenu_Display()
{
// 显示预处理
VtorMenu_PreProcess();
// 先绘制标题
VtorMenu* subMenu = VtorMenu_CurSubMenu;
// 先显示菜单标题,再显示菜单的内容
uint8_t itemIdx = 0;
VtorMenu_DisplaySubMenu(itemIdx++, subMenu->parentMenu);
if(subMenu == subMenu->parentMenu)
{
return ;
}
// 调整到 当前子菜单同等级 的 长子菜单
subMenu = subMenu->parentMenu->childMenu;
while(NULL != subMenu)
{
VtorMenu_DisplaySubMenu(itemIdx++, subMenu);
subMenu = subMenu->nextMenu;
}
}
void VtorMenu_Tree(VtorMenu* menu)
{
static int tabCnt = 0;
uint8_t prefixStr[11] = "\t\t\t\t\t\t\t\t\t\t";
prefixStr[tabCnt] = '\0';
VtorDebugChanPrintf("%s%s:%d\r\n", prefixStr, menu->menuName, menu->menuValue);
// 如果存在子节点
if(menu->childMenu)
{
tabCnt++;
VtorMenu* tempMenu = menu->childMenu;
while(NULL != tempMenu)
{
VtorMenu_Tree(tempMenu);
tempMenu = tempMenu->nextMenu;
// 扫描下一项
}
tabCnt--;
}
}
VtorMenu* VtorMenu_GetPrevMenu(VtorMenu* menu)
{
if(menu->prevMenu)
{
menu = menu->prevMenu;
}
#ifdef VTOR_MENU_CONFIG_ROLLBACK
else
{
while(menu->nextMenu)
{
menu = menu->nextMenu;
}
}
#endif
return menu;
}
VtorMenu* VtorMenu_GetNextMenu(VtorMenu* menu)
{
if(menu->nextMenu)
{
menu = menu->nextMenu;
}
#ifdef VTOR_MENU_CONFIG_ROLLBACK
else
{
while(menu->prevMenu)
{
menu = menu->prevMenu;
}
}
#endif
return menu;
}
void VtorMenu_Operate(uint8_t opType, int32_t opValue)
{
switch(opType)
{
case VTOR_MENU_OPERATE_ENTER: // 进入操作
if(VtorMenu_CurSubMenu->childMenu)
{
VtorMenu_CurSubMenu = VtorMenu_CurSubMenu->childMenu;
VtorMenu_CurMenu = VtorMenu_CurSubMenu->parentMenu;
}
break;
case VTOR_MENU_OPERATE_OUTER: // 退出操作
if(VtorMenu_CurMenu->parentMenu)
{
VtorMenu_CurSubMenu = VtorMenu_CurSubMenu->parentMenu;
VtorMenu_CurMenu = VtorMenu_CurSubMenu->parentMenu;
}
break;
case VTOR_MENU_OPERATE_CLICK: // 点击操作
VtorMenu_ClickHandler(VtorMenu_CurSubMenu);
break;
case VTOR_MENU_OPERATE_CHANGE_MENU: // 更改所选菜单
if(-1 == opValue)
{
VtorMenu_CurSubMenu = VtorMenu_GetPrevMenu(VtorMenu_CurSubMenu);
}
else if(1 == opValue)
{
VtorMenu_CurSubMenu = VtorMenu_GetNextMenu(VtorMenu_CurSubMenu);
}
break;
case VTOR_MENU_OPERATE_SELECT_MENU: // 直接选择确定的菜单(暂不支持)
break;
// 针对项的值,需要操作pCurMenuIte
case VTOR_MENU_OPERATE_CHANGE_VALUE:
VtorMenu_CurSubMenu->menuValue += opValue;
break;
case VTOR_MENU_OPERATE_SET_VALUE:
VtorMenu_CurSubMenu->menuValue = opValue;
break;
default:
break;
}
// 操作后再处理
VtorMenu_ReProcess();
}
void VtorMenu_Relate(VtorMenu* menu, VtorMenu* subMenu)
{
if(NULL == menu || NULL == subMenu)
{
return;
}
// 如果没有子菜单,构建父子关系
if(NULL == menu->childMenu)
{
menu->childMenu = subMenu;
subMenu->parentMenu = menu;
// 构建双向链表
subMenu->nextMenu = NULL;
subMenu->prevMenu = NULL;
subMenu->childMenu = NULL;
}
else
{
// 有子菜单,尾插法,与子菜单构建兄弟关系
VtorMenu* tempMenu = menu->childMenu;
while(NULL != tempMenu->nextMenu)
{
tempMenu = tempMenu->nextMenu;
}
tempMenu->nextMenu = subMenu;
// 只有父节点为null,才认为是新节点
// 加入这个判断,允许了一个菜单项的进入就是回到父菜单
if(NULL != subMenu->prevMenu)
{
subMenu->prevMenu = tempMenu;
subMenu->parentMenu = menu;
subMenu->childMenu = NULL;
subMenu->nextMenu = NULL;
}
}
}
#endif // __VTOR_MENU__
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。