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
