Fix error on menu walk up from leveler if some menu items disabled (example in HI output modulation select menu)

Also now more easy disable some menu items (only in menuDisabled need add rule)
Add delay then walk in menu
More compact code
pull/4/head
DiSlord 6 years ago
parent d845c67d23
commit 7245722343

57
ui.c

@ -435,12 +435,12 @@ select_lever_mode(int mode)
// type of menu item // type of menu item
enum { enum {
MT_NONE, MT_NONE, // sentinel menu
MT_BLANK, MT_BLANK, // blank menu (nothing draw)
MT_SUBMENU, MT_SUBMENU, // enter to submenu
MT_CALLBACK, MT_CALLBACK, // call user function
MT_CANCEL, MT_CANCEL, // menu, step back on one level up
MT_TITLE, MT_TITLE, // Title
MT_CLOSE, MT_CLOSE,
MT_KEYPAD, MT_KEYPAD,
MT_ICON = 0x10, MT_ICON = 0x10,
@ -1567,6 +1567,16 @@ extern void menu_item_modify_attribute(
const menuitem_t *menu, int item, uint16_t *fg, uint16_t *bg); const menuitem_t *menu, int item, uint16_t *fg, uint16_t *bg);
#endif #endif
static bool menuDisabled(uint8_t type){
if ((type & MT_LOW) && !MODE_LOW(setting.mode))
return true;
if ((type & MT_HIGH) && !MODE_HIGH(setting.mode))
return true;
if (type == MT_BLANK)
return true;
return false;
}
static void static void
draw_menu_buttons(const menuitem_t *menu) draw_menu_buttons(const menuitem_t *menu)
{ {
@ -1575,14 +1585,10 @@ draw_menu_buttons(const menuitem_t *menu)
int y = 0; int y = 0;
for (i = 0; i < MENU_BUTTON_MAX; i++) { for (i = 0; i < MENU_BUTTON_MAX; i++) {
const char *l1, *l2; const char *l1, *l2;
if ((menu[i].type & MT_LOW) && !MODE_LOW(setting.mode)) //not applicable to mode if (menuDisabled(menu[i].type)) //not applicable to mode
continue;
if ((menu[i].type & MT_HIGH) && !MODE_HIGH(setting.mode)) //not applicable to mode
continue; continue;
if (MT_MASK(menu[i].type) == MT_NONE) if (MT_MASK(menu[i].type) == MT_NONE)
break; break;
if (MT_MASK(menu[i].type) == MT_BLANK)
continue;
uint16_t bg; uint16_t bg;
uint16_t fg; uint16_t fg;
if (MT_MASK(menu[i].type) == MT_TITLE) { if (MT_MASK(menu[i].type) == MT_TITLE) {
@ -2060,36 +2066,39 @@ ui_process_normal(void)
static void static void
ui_process_menu(void) ui_process_menu(void)
{ {
// Flag show, can close menu if user come out from it
// if false user must select some thing
const menuitem_t *menu = menu_stack[menu_current_level];
int status = btn_check(); int status = btn_check();
if (status != 0) { if (status != 0) {
if (status & EVT_BUTTON_SINGLE_CLICK) { if (status & EVT_BUTTON_SINGLE_CLICK) {
// if (selection == -1) {
// selection = 0;
// goto activate;
// }
menu_invoke(selection); menu_invoke(selection);
} else { } else {
do { do {
if (status & EVT_UP) { if (status & EVT_UP) {
// close menu if next item is sentinel // skip menu item if disabled
while (((menu_stack[menu_current_level][selection+1].type & MT_LOW) && !MODE_LOW(setting.mode) ) || while (menuDisabled(menu[selection+1].type))
((menu_stack[menu_current_level][selection+1].type & MT_HIGH) && !MODE_HIGH(setting.mode)))
selection++; selection++;
if (menu_stack[menu_current_level][selection+1].type == MT_NONE) // close menu if next item is sentinel, else step up
goto menuclose; if (menu[selection+1].type != MT_NONE)
if (!(menu_stack[menu_current_level][selection+1].type == (MT_FORM | MT_NONE)))
selection++; selection++;
else if (!(menu[0].type & MT_FORM)) // not close if type = form menu
goto menuclose;
} }
if (status & EVT_DOWN) { if (status & EVT_DOWN) {
while (((menu_stack[menu_current_level][selection+1].type & MT_LOW) && !MODE_LOW(setting.mode) ) || // skip menu item if disabled
((menu_stack[menu_current_level][selection+1].type & MT_HIGH) && !MODE_HIGH(setting.mode))) while (menuDisabled(menu[selection-1].type))
selection--; selection--;
if (! ( selection == 0 && menu_stack[menu_current_level][0].type & MT_FORM)) // close menu if item is 0, else step down
if (selection > 0)
selection--; selection--;
else if (!(menu[0].type & MT_FORM)) // not close if type = form menu
goto menuclose;
} }
//activate: //activate:
ensure_selection(); ensure_selection();
draw_menu(); draw_menu();
chThdSleepMilliseconds(100); // Add delay for not move so fast in menu
status = btn_wait_release(); status = btn_wait_release();
} while (status != 0); } while (status != 0);
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.