1 Star 4 Fork 8

vtor3478/vtor_elec_module

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
vtor_menu.c 3.75 KB
一键复制 编辑 原始数据 按行查看 历史
#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__
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/vtor3478/vtor_elec_module.git
git@gitee.com:vtor3478/vtor_elec_module.git
vtor3478
vtor_elec_module
vtor_elec_module
main

搜索帮助

0d507c66 1850385 C8b1a773 1850385