Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Menu by
Navigator.cpp
00001 #include "Navigator.h" 00002 00003 Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd) 00004 { 00005 00006 _cursorPos = 0; 00007 _cursorLine = 1; 00008 _display_rows = lcd->rows(); 00009 _display_cols = lcd->columns(); 00010 00011 activeMenu->CurrentSelection = _cursorPos; 00012 00013 _wait_for_select = false; 00014 _wait_for_yesno = false; 00015 00016 _start_line = 0; 00017 00018 printMenu(); 00019 printCursor(); 00020 } 00021 00022 void Navigator::printMenu() 00023 { 00024 int index =0; 00025 lcd->cls(); 00026 00027 for(int row=0; row < _display_rows; row++) { 00028 00029 lcd->locate(0,row); 00030 index = row + _cursorPos - (_cursorLine-1); // index into selection for this line 00031 //should we display a menu on this line? 00032 if (index <= activeMenu->selections.size()-1 ) { 00033 lcd->printf(" %s", activeMenu->selections[index].selText); 00034 } 00035 } 00036 } 00037 00038 void Navigator::printCursor() 00039 { 00040 if(activeMenu->selections[_cursorPos].childMenu == NULL) printf("No child menu\n"); 00041 else printf("child menu: %s\n", activeMenu->selections[_cursorPos].childMenu->menuID); 00042 00043 lcd->locate(0,0); 00044 for (int row=0; row<_display_rows; row++) { 00045 lcd->locate(0,row); 00046 if (row == _cursorLine-1) { 00047 //we are on Cursor-Line 00048 //print cursor 00049 lcd->putc('>'); 00050 } else { 00051 //on other lines print a space 00052 lcd->putc(' '); 00053 } 00054 } 00055 } 00056 00057 00058 void Navigator::show_yes_no(bool yesorno) 00059 { 00060 // MenuItem is a Yes/no question? 00061 // show the text in yesnodata and wait for a yes or no 00062 lcd->cls(); 00063 //printf("YesNo: \n"); 00064 //printf("%s <Yes><No>",activeMenu->selections[_cursorPos].menu_parameter->text); 00065 if (activeMenu->selections[_cursorPos].menu_parameter->text != NULL) { 00066 if (yesorno) { 00067 // Yes is default 00068 lcd->printf("%s <Yes> No ",activeMenu->selections[_cursorPos].menu_parameter->text); 00069 } else { 00070 //No is default 00071 lcd->printf("%s Yes <No>",activeMenu->selections[_cursorPos].menu_parameter->text); 00072 } 00073 activeMenu->selections[_cursorPos].menu_parameter->yes_no = yesorno; 00074 } 00075 } 00076 00077 void Navigator::show_longtext(void) 00078 { 00079 int maxchunksize = _display_cols - 1; // one column for "Scrollbar" 00080 // MenuItem is a long_text 00081 // show the text , support scrolling up/down, wait for select 00082 lcd->cls(); 00083 if (activeMenu->selections[_cursorPos].menu_parameter->text != NULL) { 00084 //show text starting a correct position 00085 for (int row=0; row< _display_rows; row++) { 00086 lcd->locate(0,row); 00087 lcd->printf("%-*.*s", maxchunksize,maxchunksize, activeMenu->selections[_cursorPos].menu_parameter->text + ((_start_line+row)*(_display_cols - 1))); 00088 if ((row == 0)&& (_start_line > 0)) lcd->printf("^"); 00089 else if (row == _display_rows-1) lcd->printf("v"); 00090 else lcd->printf("|"); 00091 } 00092 } 00093 } 00094 00095 void Navigator::select() 00096 { 00097 // user ressed the select button 00098 Menu *lastMenu; 00099 00100 // are we waiting for a Select()? 00101 if (_wait_for_select) { 00102 _wait_for_select = false; 00103 // show the menu again 00104 printMenu(); 00105 printCursor(); 00106 00107 } else if (_wait_for_yesno) { 00108 // user selected a value 00109 _wait_for_yesno = false; 00110 // show the menu again 00111 printMenu(); 00112 printCursor(); 00113 } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_yes_no) { 00114 show_yes_no(activeMenu->selections[_cursorPos].menu_parameter->yes_no); 00115 _wait_for_yesno = true; 00116 } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) { 00117 show_longtext(); 00118 _wait_for_select = true; 00119 } else { 00120 // normal mneuItem 00121 if(activeMenu->selections[_cursorPos].userAction != NULL) { 00122 //execute function 00123 (activeMenu->selections[_cursorPos].userAction)(); 00124 // refresh the Menu 00125 //printMenu(); 00126 //printCursor(); 00127 } 00128 //change the menu? 00129 if(activeMenu->selections[_cursorPos].childMenu != NULL) { 00130 lastMenu = activeMenu; 00131 00132 //change to childMenu 00133 activeMenu = activeMenu->selections[_cursorPos].childMenu; 00134 00135 // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again 00136 if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) { 00137 //reset menuposition of submenu to zero 00138 lastMenu->CurrentSelection = 0; 00139 } 00140 00141 // return to last position from that menu, if we went up on level 00142 _cursorPos = activeMenu->CurrentSelection; 00143 00144 _cursorLine = 1; 00145 printMenu(); 00146 printCursor(); 00147 } 00148 // only accept select after showing this menu/user_action ? 00149 if ((activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_wait_select) || 00150 (activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext)) { 00151 _wait_for_select = true; 00152 } 00153 } 00154 } 00155 00156 void Navigator::moveUp() 00157 { 00158 if (_wait_for_yesno) { 00159 // change Yes/no Selection 00160 show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no); 00161 00162 } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) { 00163 // show a long text 00164 // can we scoll further up? 00165 if (_start_line >= 1) { 00166 _start_line--; 00167 show_longtext(); 00168 } 00169 } else 00170 // only if we don't wait for a select() 00171 if (! _wait_for_select) { 00172 // Show the MenuItems 00173 // allready on TOP of Display? 00174 if(_cursorLine > 1) { 00175 // scroll up cursor one line 00176 _cursorLine--; 00177 } 00178 00179 if(_cursorPos > 0) { 00180 //scroll up one item 00181 _cursorPos--; 00182 activeMenu->CurrentSelection = _cursorPos; 00183 00184 } 00185 printMenu(); 00186 printCursor(); 00187 } 00188 } 00189 00190 void Navigator::moveDown() 00191 { 00192 if (_wait_for_yesno) { 00193 // change Yes/no Selection 00194 show_yes_no( ! activeMenu->selections[_cursorPos].menu_parameter->yes_no); 00195 } else if(activeMenu->selections[_cursorPos].itemMode == MenuItem::mode_show_longtext) { 00196 // show a long text 00197 // can we scoll further down? 00198 if ((_start_line+_display_rows)*(_display_cols-1) < strlen(activeMenu->selections[_cursorPos].menu_parameter->text)) { 00199 _start_line++; 00200 show_longtext(); 00201 } 00202 } else 00203 // only if we don't wait for a select() 00204 if (! _wait_for_select) { 00205 //Show the menuItem 00206 // allready on last line of display? 00207 if (_cursorPos == activeMenu->selections.size()-1) { 00208 //stay on this line 00209 } else { 00210 // move down 00211 if(_cursorLine < _display_rows) { 00212 // Only move down cursor 00213 _cursorLine++; 00214 _cursorPos++; 00215 } else { 00216 // on last Display-Line scroll down Menu 00217 _cursorPos++; 00218 } 00219 // save currentPosition in Menu 00220 activeMenu->CurrentSelection = _cursorPos; 00221 00222 } 00223 00224 printMenu(); 00225 printCursor(); 00226 } 00227 }
Generated on Fri Jul 15 2022 06:41:56 by
1.7.2
