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:
11:6814cbc83ae0
Parent:
10:2b6ddf53b05e
diff -r 2b6ddf53b05e -r 6814cbc83ae0 Navigator.cpp
--- a/Navigator.cpp	Mon Mar 16 21:05:37 2015 +0000
+++ b/Navigator.cpp	Wed Jan 13 19:59:21 2016 +0000
@@ -13,6 +13,8 @@
     _wait_for_select = false;
     _wait_for_yesno  = false;
 
+    _start_line = 0;
+
     printMenu();
     printCursor();
 }
@@ -52,10 +54,6 @@
     }
 }
 
-void Navigator::poll()
-{
-// no longer needed
-}
 
 void Navigator::show_yes_no(bool yesorno)
 {
@@ -76,8 +74,27 @@
     }
 }
 
+void Navigator::show_longtext(void)
+{
+    int maxchunksize = _display_cols - 1;    // one column for "Scrollbar"
+    // MenuItem is a long_text
+    // show the text , support scrolling up/down, wait for select
+    lcd->cls();
+    if (activeMenu->selections[_cursorPos].menu_parameter->text != NULL) {
+        //show text starting a correct position
+        for (int row=0; row< _display_rows; row++) {
+            lcd->locate(0,row);
+            lcd->printf("%-*.*s", maxchunksize,maxchunksize, activeMenu->selections[_cursorPos].menu_parameter->text + ((_start_line+row)*(_display_cols - 1)));
+            if ((row == 0)&& (_start_line > 0)) lcd->printf("^");
+            else if (row == _display_rows-1) lcd->printf("v");
+            else lcd->printf("|");
+        }
+    }
+}
+
 void Navigator::select()
 {
+    // user ressed the select button
     Menu *lastMenu;
 
     // are we waiting for a Select()?
@@ -96,6 +113,9 @@
     } 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 if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) {
+        show_longtext();
+        _wait_for_select = true;
     } else {
         // normal mneuItem
         if(activeMenu->selections[_cursorPos].userAction != NULL) {
@@ -126,7 +146,8 @@
             printCursor();
         }
         // only accept select after showing this menu/user_action ?
-        if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_wait_select) {
+        if ((activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_wait_select) ||
+                (activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext)) {
             _wait_for_select = true;
         }
     }
@@ -134,28 +155,36 @@
 
 void Navigator::moveUp()
 {
-   if (_wait_for_yesno) {
+    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;
+    } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) {
+        // show a long text
+        // can we scoll further up?
+        if (_start_line >= 1) {
+            _start_line--;
+            show_longtext();
+        }
+    } 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();
         }
-        printMenu();
-        printCursor();
-    }
 }
 
 void Navigator::moveDown()
@@ -163,29 +192,36 @@
     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 {
-            // move down
-            if(_cursorLine < _display_rows) {
-                // Only move down cursor
-                _cursorLine++;
-                _cursorPos++;
+    } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) {
+        // show a long text
+        // can we scoll further down?
+        if ((_start_line+_display_rows)*(_display_cols-1) < strlen(activeMenu->selections[_cursorPos].menu_parameter->text)) {
+        _start_line++;
+        show_longtext();
+        }
+    } 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();
-    } 
+            printMenu();
+            printCursor();
+        }
 }