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:
- 10:2b6ddf53b05e
- Parent:
- 9:c9df0b33d176
- Child:
- 11:6814cbc83ae0
--- 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();
+ }
+}
