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@8:fbaeab73fe1a, 2015-01-16 (annotated)
- Committer:
- charly
- Date:
- Fri Jan 16 22:23:34 2015 +0000
- Revision:
- 8:fbaeab73fe1a
- Parent:
- 7:12f2b3b7975f
- Child:
- 9:c9df0b33d176
Save CurrentSelection of Menu to get back to the correct position.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pyeh9 | 1:84d263c8932d | 1 | #include "Navigator.h" |
pyeh9 | 1:84d263c8932d | 2 | |
charly | 5:91b1bc68290b | 3 | Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd) |
pyeh9 | 1:84d263c8932d | 4 | { |
charly | 5:91b1bc68290b | 5 | |
charly | 5:91b1bc68290b | 6 | _cursorPos = 0; |
charly | 5:91b1bc68290b | 7 | _cursorLine = 1; |
charly | 5:91b1bc68290b | 8 | _display_rows = lcd->rows(); |
charly | 8:fbaeab73fe1a | 9 | |
charly | 8:fbaeab73fe1a | 10 | activeMenu->CurrentSelection = _cursorPos; |
charly | 5:91b1bc68290b | 11 | |
pyeh9 | 2:2654dc659298 | 12 | printMenu(); |
pyeh9 | 2:2654dc659298 | 13 | printCursor(); |
pyeh9 | 1:84d263c8932d | 14 | } |
pyeh9 | 1:84d263c8932d | 15 | |
pyeh9 | 1:84d263c8932d | 16 | void Navigator::printMenu() |
charly | 5:91b1bc68290b | 17 | { |
charly | 5:91b1bc68290b | 18 | int index =0; |
pyeh9 | 1:84d263c8932d | 19 | lcd->cls(); |
charly | 5:91b1bc68290b | 20 | |
charly | 5:91b1bc68290b | 21 | for(int row=0; row < _display_rows; row++) { |
charly | 5:91b1bc68290b | 22 | |
charly | 5:91b1bc68290b | 23 | lcd->locate(0,row); |
charly | 5:91b1bc68290b | 24 | index = row + _cursorPos - (_cursorLine-1); // index into selection for this line |
charly | 5:91b1bc68290b | 25 | //should we display a menu on this line? |
charly | 5:91b1bc68290b | 26 | if (index <= activeMenu->selections.size()-1 ) { |
charly | 5:91b1bc68290b | 27 | lcd->printf(" %s", activeMenu->selections[index].selText); |
pyeh9 | 1:84d263c8932d | 28 | } |
pyeh9 | 1:84d263c8932d | 29 | } |
pyeh9 | 1:84d263c8932d | 30 | } |
pyeh9 | 1:84d263c8932d | 31 | |
pyeh9 | 1:84d263c8932d | 32 | void Navigator::printCursor() |
charly | 5:91b1bc68290b | 33 | { |
charly | 5:91b1bc68290b | 34 | if(activeMenu->selections[_cursorPos].childMenu == NULL) printf("No child menu\n"); |
charly | 5:91b1bc68290b | 35 | else printf("child menu: %s\n", activeMenu->selections[_cursorPos].childMenu->menuID); |
charly | 5:91b1bc68290b | 36 | |
pyeh9 | 1:84d263c8932d | 37 | lcd->locate(0,0); |
charly | 5:91b1bc68290b | 38 | for (int row=0; row<_display_rows; row++) { |
charly | 5:91b1bc68290b | 39 | lcd->locate(0,row); |
charly | 5:91b1bc68290b | 40 | if (row == _cursorLine-1) { |
charly | 5:91b1bc68290b | 41 | //we are on Cursor-Line |
charly | 5:91b1bc68290b | 42 | //print cursor |
charly | 5:91b1bc68290b | 43 | lcd->putc('>'); |
charly | 5:91b1bc68290b | 44 | } else { |
charly | 5:91b1bc68290b | 45 | //on other lines print a space |
charly | 5:91b1bc68290b | 46 | lcd->putc(' '); |
charly | 5:91b1bc68290b | 47 | } |
pyeh9 | 1:84d263c8932d | 48 | } |
pyeh9 | 1:84d263c8932d | 49 | } |
pyeh9 | 1:84d263c8932d | 50 | |
pyeh9 | 1:84d263c8932d | 51 | void Navigator::poll() |
pyeh9 | 1:84d263c8932d | 52 | { |
charly | 5:91b1bc68290b | 53 | // no longer needed |
pyeh9 | 1:84d263c8932d | 54 | } |
pyeh9 | 1:84d263c8932d | 55 | |
charly | 3:cfc36b42ae75 | 56 | void Navigator::select() |
charly | 3:cfc36b42ae75 | 57 | { |
charly | 8:fbaeab73fe1a | 58 | Menu *lastMenu; |
charly | 8:fbaeab73fe1a | 59 | |
charly | 5:91b1bc68290b | 60 | if(activeMenu->selections[_cursorPos].fun != NULL) { |
charly | 5:91b1bc68290b | 61 | //execute function |
charly | 5:91b1bc68290b | 62 | (activeMenu->selections[_cursorPos].fun)(); |
charly | 6:819049708d51 | 63 | // refresh the Menu |
charly | 7:12f2b3b7975f | 64 | //printMenu(); |
charly | 7:12f2b3b7975f | 65 | //printCursor(); |
charly | 5:91b1bc68290b | 66 | } |
charly | 8:fbaeab73fe1a | 67 | //change the menu? |
charly | 5:91b1bc68290b | 68 | if(activeMenu->selections[_cursorPos].childMenu != NULL) { |
charly | 8:fbaeab73fe1a | 69 | lastMenu = activeMenu; |
charly | 8:fbaeab73fe1a | 70 | |
charly | 8:fbaeab73fe1a | 71 | //change to childMenu |
charly | 5:91b1bc68290b | 72 | activeMenu = activeMenu->selections[_cursorPos].childMenu; |
charly | 8:fbaeab73fe1a | 73 | |
charly | 8:fbaeab73fe1a | 74 | // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again |
charly | 8:fbaeab73fe1a | 75 | if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) { |
charly | 8:fbaeab73fe1a | 76 | //reset menuposition of submenu to zero |
charly | 8:fbaeab73fe1a | 77 | lastMenu->CurrentSelection = 0; |
charly | 8:fbaeab73fe1a | 78 | } |
charly | 8:fbaeab73fe1a | 79 | |
charly | 8:fbaeab73fe1a | 80 | // return to last position from that menu, if we went up on level |
charly | 8:fbaeab73fe1a | 81 | _cursorPos = activeMenu->CurrentSelection; |
charly | 8:fbaeab73fe1a | 82 | |
charly | 5:91b1bc68290b | 83 | _cursorLine = 1; |
charly | 5:91b1bc68290b | 84 | printMenu(); |
charly | 5:91b1bc68290b | 85 | printCursor(); |
charly | 5:91b1bc68290b | 86 | } |
charly | 3:cfc36b42ae75 | 87 | } |
pyeh9 | 1:84d263c8932d | 88 | void Navigator::moveUp() |
pyeh9 | 1:84d263c8932d | 89 | { |
charly | 5:91b1bc68290b | 90 | // allready on TOP of Display? |
charly | 5:91b1bc68290b | 91 | if(_cursorLine > 1) { |
charly | 5:91b1bc68290b | 92 | // scroll up cursor one line |
charly | 5:91b1bc68290b | 93 | _cursorLine--; |
pyeh9 | 1:84d263c8932d | 94 | } |
charly | 5:91b1bc68290b | 95 | |
charly | 5:91b1bc68290b | 96 | if(_cursorPos > 0) { |
charly | 5:91b1bc68290b | 97 | //scroll up one item |
charly | 5:91b1bc68290b | 98 | _cursorPos--; |
charly | 8:fbaeab73fe1a | 99 | activeMenu->CurrentSelection = _cursorPos; |
charly | 5:91b1bc68290b | 100 | |
pyeh9 | 1:84d263c8932d | 101 | } |
charly | 5:91b1bc68290b | 102 | printMenu(); |
pyeh9 | 1:84d263c8932d | 103 | printCursor(); |
pyeh9 | 1:84d263c8932d | 104 | } |
pyeh9 | 1:84d263c8932d | 105 | |
pyeh9 | 1:84d263c8932d | 106 | void Navigator::moveDown() |
pyeh9 | 1:84d263c8932d | 107 | { |
charly | 5:91b1bc68290b | 108 | |
charly | 5:91b1bc68290b | 109 | // allready on last line of display? |
charly | 5:91b1bc68290b | 110 | if (_cursorPos == activeMenu->selections.size()-1) { |
charly | 5:91b1bc68290b | 111 | //stay on this line |
charly | 5:91b1bc68290b | 112 | } else { |
charly | 5:91b1bc68290b | 113 | // move down |
charly | 5:91b1bc68290b | 114 | if(_cursorLine < _display_rows) { |
charly | 5:91b1bc68290b | 115 | // Only move down cursor |
charly | 5:91b1bc68290b | 116 | _cursorLine++; |
charly | 5:91b1bc68290b | 117 | _cursorPos++; |
charly | 5:91b1bc68290b | 118 | } else { |
charly | 5:91b1bc68290b | 119 | // on last Display-Line scroll down Menu |
charly | 5:91b1bc68290b | 120 | _cursorPos++; |
charly | 5:91b1bc68290b | 121 | } |
charly | 8:fbaeab73fe1a | 122 | // save currentPosition in Menu |
charly | 8:fbaeab73fe1a | 123 | activeMenu->CurrentSelection = _cursorPos; |
charly | 5:91b1bc68290b | 124 | |
pyeh9 | 1:84d263c8932d | 125 | } |
charly | 5:91b1bc68290b | 126 | |
charly | 5:91b1bc68290b | 127 | printMenu(); |
pyeh9 | 1:84d263c8932d | 128 | printCursor(); |
pyeh9 | 1:84d263c8932d | 129 | } |