Library to display menus on TextLCDs. Interaction with functions Up,Down and Select (Buttons or RPG) Based on menu-library from pyeh9
Fork of Menu by
Library to display menus on TextLCDs. Interaction with functions Up,Down and Select (Buttons or RPG) Based on menu-library from pyeh9
Diff: Navigator.cpp
- Revision:
- 10:2b6ddf53b05e
- Parent:
- 9:c9df0b33d176
- Child:
- 11:6814cbc83ae0
--- a/Navigator.cpp Fri Mar 13 18:44:49 2015 +0000 +++ b/Navigator.cpp Mon Mar 16 21:05:37 2015 +0000 @@ -6,9 +6,13 @@ _cursorPos = 0; _cursorLine = 1; _display_rows = lcd->rows(); - + _display_cols = lcd->columns(); + activeMenu->CurrentSelection = _cursorPos; + _wait_for_select = false; + _wait_for_yesno = false; + printMenu(); printCursor(); } @@ -53,77 +57,135 @@ // no longer needed } +void Navigator::show_yes_no(bool yesorno) +{ + // MenuItem is a Yes/no question? + // show the text in yesnodata and wait for a yes or no + lcd->cls(); + //printf("YesNo: \n"); + //printf("%s <Yes><No>",activeMenu->selections[_cursorPos].menu_parameter->text); + if (activeMenu->selections[_cursorPos].menu_parameter->text != NULL) { + if (yesorno) { + // Yes is default + lcd->printf("%s <Yes> No ",activeMenu->selections[_cursorPos].menu_parameter->text); + } else { + //No is default + lcd->printf("%s Yes <No>",activeMenu->selections[_cursorPos].menu_parameter->text); + } + activeMenu->selections[_cursorPos].menu_parameter->yes_no = yesorno; + } +} + void Navigator::select() { Menu *lastMenu; - - if(activeMenu->selections[_cursorPos].userAction != NULL) { - //execute function - (activeMenu->selections[_cursorPos].userAction)(); - // refresh the Menu - //printMenu(); - //printCursor(); + + // are we waiting for a Select()? + if (_wait_for_select) { + _wait_for_select = false; + // show the menu again + printMenu(); + printCursor(); + + } else if (_wait_for_yesno) { + // user selected a value + _wait_for_yesno = false; + // show the menu again + printMenu(); + printCursor(); + } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_yes_no) { + show_yes_no(activeMenu->selections[_cursorPos].menu_parameter->yes_no); + _wait_for_yesno = true; + } else { + // normal mneuItem + if(activeMenu->selections[_cursorPos].userAction != NULL) { + //execute function + (activeMenu->selections[_cursorPos].userAction)(); + // refresh the Menu + //printMenu(); + //printCursor(); + } + //change the menu? + if(activeMenu->selections[_cursorPos].childMenu != NULL) { + lastMenu = activeMenu; + + //change to childMenu + activeMenu = activeMenu->selections[_cursorPos].childMenu; + + // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again + if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) { + //reset menuposition of submenu to zero + lastMenu->CurrentSelection = 0; + } + + // return to last position from that menu, if we went up on level + _cursorPos = activeMenu->CurrentSelection; + + _cursorLine = 1; + printMenu(); + printCursor(); + } + // only accept select after showing this menu/user_action ? + if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_wait_select) { + _wait_for_select = true; + } } - //change the menu? - if(activeMenu->selections[_cursorPos].childMenu != NULL) { - lastMenu = activeMenu; - - //change to childMenu - activeMenu = activeMenu->selections[_cursorPos].childMenu; - - // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again - if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) { - //reset menuposition of submenu to zero - lastMenu->CurrentSelection = 0; - } - - // return to last position from that menu, if we went up on level - _cursorPos = activeMenu->CurrentSelection; - - _cursorLine = 1; +} + +void Navigator::moveUp() +{ + if (_wait_for_yesno) { + // change Yes/no Selection + show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no); + }else + // only if we don't wait for a select() + if (! _wait_for_select) { + // Show the MenuItems + // allready on TOP of Display? + if(_cursorLine > 1) { + // scroll up cursor one line + _cursorLine--; + } + + if(_cursorPos > 0) { + //scroll up one item + _cursorPos--; + activeMenu->CurrentSelection = _cursorPos; + + } printMenu(); printCursor(); } } -void Navigator::moveUp() -{ - // allready on TOP of Display? - if(_cursorLine > 1) { - // scroll up cursor one line - _cursorLine--; - } - - if(_cursorPos > 0) { - //scroll up one item - _cursorPos--; - activeMenu->CurrentSelection = _cursorPos; - - } - printMenu(); - printCursor(); -} void Navigator::moveDown() { - - // allready on last line of display? - if (_cursorPos == activeMenu->selections.size()-1) { - //stay on this line - } else { - // move down - if(_cursorLine < _display_rows) { - // Only move down cursor - _cursorLine++; - _cursorPos++; + if (_wait_for_yesno) { + // change Yes/no Selection + show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no); + }else + // only if we don't wait for a select() + if (! _wait_for_select) { + //Show the menuItem + // allready on last line of display? + if (_cursorPos == activeMenu->selections.size()-1) { + //stay on this line } else { - // on last Display-Line scroll down Menu - _cursorPos++; - } - // save currentPosition in Menu - activeMenu->CurrentSelection = _cursorPos; + // move down + if(_cursorLine < _display_rows) { + // Only move down cursor + _cursorLine++; + _cursorPos++; + } else { + // on last Display-Line scroll down Menu + _cursorPos++; + } + // save currentPosition in Menu + activeMenu->CurrentSelection = _cursorPos; - } + } - printMenu(); - printCursor(); -} \ No newline at end of file + printMenu(); + printCursor(); + } +}