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

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