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(); + } }