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