NWatch多级菜单技术分析
typedef struct{
menu_f btn1;
menu_f btn2;
menu_f btn3;
draw_f draw;
itemLoader_f loader;
}menuFuncs_t;
typedef struct{
uint8_t lastSelected;
menu_f last;
}prev_menu_s;
typedef struct{
uint8_t selected;
uint8_t optionCount;
bool isOpen;
const char* title;
menu_type_t menuType;
menuFuncs_t func;
menu_f prevMenu;
}menu_s;
首先NWatch会通过一个菜单结构体menu_s来设置当前菜单的内容,例如设置当前的菜单的被选的应用、应用个数、菜单名字、菜单类型、菜单的函数和上一级菜单的加载函数等相关信息。
定义主菜单
menu_s Main_Menu = {0};
初始化主菜单
NWatch多级菜单的实现是通过一种类似与链表的形式。
通过菜单的设置函数来设置当前菜单的的内容。
例如下面是设置手表菜单的内容,用来显示系统的时间和日期。
void drawWatch(void){
ticker();
drawDate();
}
void watchLoad(void){
SetDrawFunc(drawWatch);
SetButtonFunc(NULL, menuSelect, NULL);
SetMenuPre(&prevMenus,watchLoad);
AnimotionInto(NULL);
}
当按下确认键以后进行NWatch主界面,重新设置菜单的内容和功能。
void mainMenu(void){
SetDrawFunc(drawMenu);
SetButtonFunc(menuUp, menuSelect, menuDown);
SetMenuFunc(preOption, menuSelect, nextOption,loader);
SetMenuInfo(optionCount,MENU_TYPE_ICON,PSTR(STR_MAINMENU));
SetMenuPre(&prevMenus,mainMenu);
AnimotionInto(NULL);
}
当退出当前界面时候,也是类似调用菜单函数来重新填充当前菜单的内容
效果展示
多级菜单切换