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:
10:2b6ddf53b05e
Parent:
9:c9df0b33d176
Child:
11:6814cbc83ae0
diff -r c9df0b33d176 -r 2b6ddf53b05e Navigator.cpp
--- a/Navigator.cpp	Fri Mar 13 18:44:49 2015 +0000
+++ b/Navigator.cpp	Mon Mar 16 21:05:37 2015 +0000
@@ -6,9 +6,13 @@
     _cursorPos = 0;
     _cursorLine = 1;
     _display_rows = lcd->rows();
-    
+    _display_cols = lcd->columns();
+
     activeMenu->CurrentSelection = _cursorPos;
 
+    _wait_for_select = false;
+    _wait_for_yesno  = false;
+
     printMenu();
     printCursor();
 }
@@ -53,77 +57,135 @@
 // no longer needed
 }
 
+void Navigator::show_yes_no(bool yesorno)
+{
+    // MenuItem is a Yes/no question?
+    // show the text in yesnodata and wait for a yes or no
+    lcd->cls();
+    //printf("YesNo: \n");
+    //printf("%s <Yes><No>",activeMenu->selections[_cursorPos].menu_parameter->text);
+    if (activeMenu->selections[_cursorPos].menu_parameter->text != NULL) {
+        if (yesorno) {
+            // Yes is default
+            lcd->printf("%s <Yes> No ",activeMenu->selections[_cursorPos].menu_parameter->text);
+        } else {
+            //No is default
+            lcd->printf("%s  Yes <No>",activeMenu->selections[_cursorPos].menu_parameter->text);
+        }
+        activeMenu->selections[_cursorPos].menu_parameter->yes_no = yesorno;
+    }
+}
+
 void Navigator::select()
 {
     Menu *lastMenu;
-    
-    if(activeMenu->selections[_cursorPos].userAction != NULL) {
-        //execute function
-        (activeMenu->selections[_cursorPos].userAction)();
-        // refresh the Menu
-        //printMenu();
-        //printCursor();
+
+    // are we waiting for a Select()?
+    if (_wait_for_select) {
+        _wait_for_select = false;
+        // show the menu again
+        printMenu();
+        printCursor();
+
+    } else if (_wait_for_yesno) {
+        // user selected a value
+        _wait_for_yesno = false;
+        // show the menu again
+        printMenu();
+        printCursor();
+    } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_yes_no) {
+        show_yes_no(activeMenu->selections[_cursorPos].menu_parameter->yes_no);
+        _wait_for_yesno = true;
+    } else {
+        // normal mneuItem
+        if(activeMenu->selections[_cursorPos].userAction != NULL) {
+            //execute function
+            (activeMenu->selections[_cursorPos].userAction)();
+            // refresh the Menu
+            //printMenu();
+            //printCursor();
+        }
+        //change the menu?
+        if(activeMenu->selections[_cursorPos].childMenu != NULL) {
+            lastMenu = activeMenu;
+
+            //change to childMenu
+            activeMenu = activeMenu->selections[_cursorPos].childMenu;
+
+            // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again
+            if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) {
+                //reset menuposition of submenu to zero
+                lastMenu->CurrentSelection = 0;
+            }
+
+            // return to last position from that menu, if we went up on level
+            _cursorPos = activeMenu->CurrentSelection;
+
+            _cursorLine = 1;
+            printMenu();
+            printCursor();
+        }
+        // only accept select after showing this menu/user_action ?
+        if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_wait_select) {
+            _wait_for_select = true;
+        }
     }
-    //change the menu?
-    if(activeMenu->selections[_cursorPos].childMenu != NULL) {
-        lastMenu = activeMenu;
-        
-        //change to childMenu
-        activeMenu = activeMenu->selections[_cursorPos].childMenu;
-        
-        // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again
-        if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) {
-            //reset menuposition of submenu to zero
-            lastMenu->CurrentSelection = 0;
-        }            
-        
-        // return to last position from that menu, if we went up on level
-        _cursorPos = activeMenu->CurrentSelection;
-               
-        _cursorLine = 1;
+}
+
+void Navigator::moveUp()
+{
+   if (_wait_for_yesno) {
+        // change Yes/no Selection
+        show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no);
+    }else
+    // only if we don't wait for a select()
+    if (! _wait_for_select) {
+        // Show the MenuItems
+        // allready on TOP of Display?
+        if(_cursorLine > 1) {
+            // scroll up cursor one line
+            _cursorLine--;
+        }
+
+        if(_cursorPos > 0) {
+            //scroll up one item
+            _cursorPos--;
+            activeMenu->CurrentSelection = _cursorPos;
+
+        }
         printMenu();
         printCursor();
     }
 }
-void Navigator::moveUp()
-{
-    // allready on TOP of Display?
-    if(_cursorLine > 1) {
-        // scroll up cursor one line
-        _cursorLine--;
-    }
-
-    if(_cursorPos > 0) {
-        //scroll up one item
-        _cursorPos--;
-        activeMenu->CurrentSelection = _cursorPos;
-
-    }
-    printMenu();
-    printCursor();
-}
 
 void Navigator::moveDown()
 {
-
-    // 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++;
+    if (_wait_for_yesno) {
+        // change Yes/no Selection
+        show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no);
+    }else
+    // only if we don't wait for a select()
+    if (! _wait_for_select) {
+        //Show the menuItem
+        // allready on last line of display?
+        if (_cursorPos == activeMenu->selections.size()-1) {
+            //stay on this line
         } else {
-            // on last Display-Line scroll down Menu
-            _cursorPos++;
-        }
-        // save currentPosition in Menu
-        activeMenu->CurrentSelection = _cursorPos;
+            // move down
+            if(_cursorLine < _display_rows) {
+                // Only move down cursor
+                _cursorLine++;
+                _cursorPos++;
+            } else {
+                // on last Display-Line scroll down Menu
+                _cursorPos++;
+            }
+            // save currentPosition in Menu
+            activeMenu->CurrentSelection = _cursorPos;
 
-    }
+        }
 
-    printMenu();
-    printCursor();
-}
\ No newline at end of file
+        printMenu();
+        printCursor();
+    } 
+}