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 Peihsun Yeh

Library to display menus on TextLCDs. Interaction with functions Up,Down and Select (Buttons or RPG) Based on menu-library from pyeh9

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?

UserRevisionLine numberNew 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 }