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
Navigator.cpp
- Committer:
- charly
- Date:
- 2015-03-16
- Revision:
- 10:2b6ddf53b05e
- Parent:
- 9:c9df0b33d176
- Child:
- 11:6814cbc83ae0
File content as of revision 10:2b6ddf53b05e:
#include "Navigator.h" Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd) { _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(); } void Navigator::printMenu() { int index =0; lcd->cls(); for(int row=0; row < _display_rows; row++) { lcd->locate(0,row); index = row + _cursorPos - (_cursorLine-1); // index into selection for this line //should we display a menu on this line? if (index <= activeMenu->selections.size()-1 ) { lcd->printf(" %s", activeMenu->selections[index].selText); } } } void Navigator::printCursor() { if(activeMenu->selections[_cursorPos].childMenu == NULL) printf("No child menu\n"); else printf("child menu: %s\n", activeMenu->selections[_cursorPos].childMenu->menuID); lcd->locate(0,0); for (int row=0; row<_display_rows; row++) { lcd->locate(0,row); if (row == _cursorLine-1) { //we are on Cursor-Line //print cursor lcd->putc('>'); } else { //on other lines print a space lcd->putc(' '); } } } void Navigator::poll() { // 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; // 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; } } } 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::moveDown() { 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 { // 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(); } }