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:
- 5:91b1bc68290b
- Parent:
- 4:67097127da6c
- Child:
- 6:819049708d51
--- a/Navigator.cpp Thu Jan 01 23:00:06 2015 +0000 +++ b/Navigator.cpp Fri Jan 02 15:41:09 2015 +0000 @@ -1,95 +1,106 @@ #include "Navigator.h" -Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd) +Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd) { - bottom = root->selections.size(); - cursorPos = 0; - cursorLine = 1; - + + _cursorPos = 0; + _cursorLine = 1; + _display_rows = lcd->rows(); + printMenu(); printCursor(); } void Navigator::printMenu() -{ +{ + int index =0; lcd->cls(); - if(bottom == 1){ // the current Menu only has one selection - lcd->printf(" %s", activeMenu->selections[0].selText); - } else { - if(cursorLine == 2){ // if we're at the bottom - lcd->printf(" %s", activeMenu->selections[cursorPos-1].selText); - lcd->locate(0,1); - lcd->printf(" %s", activeMenu->selections[cursorPos].selText); - } else { - lcd->printf(" %s", activeMenu->selections[cursorPos].selText); - lcd->locate(0,1); - lcd->printf(" %s", activeMenu->selections[cursorPos+1].selText); + + 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); - +{ + 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); - if(cursorLine == 1){ - lcd->putc('>'); - lcd->locate(0,1); - lcd->putc(' '); - } else if(cursorLine == 2){ - lcd->putc(' '); - lcd->locate(0,1); - lcd->putc('>'); + 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 +// no longer needed } void Navigator::select() { - if(activeMenu->selections[cursorPos].fun != NULL){ - (activeMenu->selections[cursorPos].fun)(); - } - if(activeMenu->selections[cursorPos].childMenu != NULL){ - activeMenu = activeMenu->selections[cursorPos].childMenu; - bottom = activeMenu->selections.size(); - cursorPos = 0; - cursorLine = 1; - printMenu(); - printCursor(); - } + if(activeMenu->selections[_cursorPos].fun != NULL) { + //execute function + (activeMenu->selections[_cursorPos].fun)(); + } + if(activeMenu->selections[_cursorPos].childMenu != NULL) { + activeMenu = activeMenu->selections[_cursorPos].childMenu; + _cursorPos = 0; + _cursorLine = 1; + printMenu(); + printCursor(); + } } void Navigator::moveUp() { - if(cursorLine == 1){ - printMenu(); - } else if(cursorLine == 2){ - cursorLine = 1; + // allready on TOP of Display? + if(_cursorLine > 1) { + // scroll up cursor one line + _cursorLine--; } - - if(cursorPos != 0){ - cursorPos--; - printMenu(); + + if(_cursorPos > 0) { + //scroll up one item + _cursorPos--; + } + printMenu(); printCursor(); } void Navigator::moveDown() { - if(cursorLine == 1){ - cursorLine = 2; - } else if(cursorLine == 2){ - printMenu(); + + // 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++; + } + } - - if(cursorPos != (bottom-1)){ - cursorPos++; - printMenu(); - } + + printMenu(); printCursor(); } \ No newline at end of file