int selectFile(char *filename, const char *extension) { int skip = 0; char key; int selected = 0; font=&Font_7x8; while(1){ char files[PERPAGE][FLEN]; int count = getFiles(files, PERPAGE, skip, extension); if(!count){ lcdPrintln("No Files?"); lcdRefresh(); getInputWait(); getInputWaitRelease(); return -1; }; if(count<PERPAGE && selected==count){ skip--; continue; }; redraw: lcdClear(); lcdPrintln("Select file:"); for(int i=0; i<count; i++){ if( selected == i ) lcdPrint("*"); else lcdPrint(" "); lcdSetCrsrX(14); int dot=-1; for(int j=0;files[j];j++) if(files[i][j]=='.'){ files[i][j]=0; dot=j; break; }; lcdPrintln(files[i]); if(dot>0) files[i][dot]='.'; } lcdRefresh(); key=getInputWaitRepeat(); switch(key){ case BTN_DOWN: if( selected < count-1 ){ selected++; goto redraw; }else{ skip++; } break; case BTN_UP: if( selected > 0 ){ selected--; goto redraw; }else{ if( skip > 0 ){ skip--; } } break; case BTN_LEFT: return -1; case BTN_ENTER: case BTN_RIGHT: strcpy(filename, files[selected]); getInputWaitRelease(); // catch this event so the app does not get it return 0; } } }
void handleMenu(const struct MENU *the_menu) { uint8_t back = 0; int8_t menuselection = 0; uint8_t numentries; uint8_t visible_lines = 0; uint8_t current_offset = 0; if (the_menu == NULL) return; setSystemFont(); for (numentries = 0; the_menu->entries[numentries].text != NULL ; numentries++); if(the_menu->entries[numentries-1].text[0]=='|' && !GLOBAL(develmode)) numentries--; visible_lines = lcdGetVisibleLines()-1; // subtract title line if(menuflags&MENU_BIG) visible_lines/=2; #ifdef SAFETY if (visible_lines < 2) return; #endif while (!back) { // Display current menu page lcdClear(); lcdPrintln(the_menu->title); for (uint8_t i = current_offset; i < (visible_lines + current_offset) && i < numentries; i++) { if(menuflags&MENU_BIG) lcdNl(); if (i == menuselection) { lcdPrint("*"); } lcdSetCrsrX(14); lcdPrintln(the_menu->entries[i].text); } lcdRefresh(); switch (getInputWaitTimeout((menuflags&MENU_TIMEOUT)?15000:0)) { case BTN_UP: menuselection--; if (menuselection < current_offset) { if (menuselection < 0) { menuselection = numentries-1; current_offset = ((numentries-1)/visible_lines) * visible_lines; } else { current_offset -= visible_lines; } } break; case BTN_DOWN: menuselection++; if (menuselection > (current_offset + visible_lines-1) || menuselection >= numentries) { if (menuselection >= numentries) { menuselection = 0; current_offset = 0; } else { current_offset += visible_lines; } } break; case BTN_LEFT: return; case BTN_RIGHT: if (the_menu->entries[menuselection].callback!=NULL) the_menu->entries[menuselection].callback(); if (menuflags&MENU_JUSTONCE) return; break; case BTN_ENTER: lcdClear(); // lcdPrintln("Called..."); // lcdRefresh(); getInputWaitRelease(); if (the_menu->entries[menuselection].callback!=NULL) the_menu->entries[menuselection].callback(); lcdRefresh(); if (menuflags&MENU_JUSTONCE) return; // getInputWait(); break; case BTN_NONE: /* timeout */ return; default: /* NOTREACHED */ break; } getInputWaitRelease(); } return; }
//# MENU config void ram(void){ uint8_t numentries = 0; signed char menuselection = 0; uint8_t visible_lines = 0; uint8_t current_offset = 0; for (int i=0;the_config[i].name!=NULL;i++){ if(!the_config[i].disabled) numentries++; }; visible_lines = ((RESY/getFontHeight())-1)/2; while (1) { // Display current menu page lcdClear(); lcdPrint("Config"); lcdSetCrsrX(60); lcdPrint("["); lcdPrint(IntToStr((current_offset/visible_lines)+1,1,0)); lcdPrint("/"); lcdPrint(IntToStr(((numentries-1)/visible_lines)+1,1,0)); lcdPrint("]"); lcdNl(); lcdNl(); uint8_t j=0; for (uint8_t i=0;i<current_offset;i++) while (the_config[++j].disabled); uint8_t t=0; for (uint8_t i=0;i<menuselection;i++) while (the_config[++t].disabled); for (uint8_t i = current_offset; i < (visible_lines + current_offset) && i < numentries; i++,j++) { while(the_config[j].disabled)j++; if(i==0){ lcdPrintln("Save changes:"); if (i == t) lcdPrint("*"); lcdSetCrsrX(14); if (i == t) lcdPrintln("YES"); else lcdPrintln("no"); }else{ lcdPrintln(the_config[j].name); if (j == t) lcdPrint("*"); lcdSetCrsrX(14); lcdPrint("<"); lcdPrint(IntToStr(the_config[j].value,3,F_LONG)); lcdPrintln(">"); }; lcdRefresh(); } switch (getInputWaitRepeat()) { case BTN_UP: menuselection--; if (menuselection < current_offset) { if (menuselection < 0) { menuselection = numentries-1; current_offset = ((numentries-1)/visible_lines) * visible_lines; } else { current_offset -= visible_lines; } } break; case BTN_DOWN: menuselection++; if (menuselection > (current_offset + visible_lines-1) || menuselection >= numentries) { if (menuselection >= numentries) { menuselection = 0; current_offset = 0; } else { current_offset += visible_lines; } } break; case BTN_LEFT: if(the_config[t].value > the_config[t].min) the_config[t].value--; if(the_config[t].value > the_config[t].max) the_config[t].value= the_config[t].max; applyConfig(); break; case BTN_RIGHT: if(the_config[t].value < the_config[t].max) the_config[t].value++; if(the_config[t].value < the_config[t].min) the_config[t].value= the_config[t].min; applyConfig(); break; case BTN_ENTER: if(menuselection==0) saveConfig(); return; } } /* NOTREACHED */ }
int selectFile(char *filename, char *extension) { int skip = 0; int selected = 0; char pwd[FLEN]; memset(pwd, 0, FLEN); font=&Font_7x8; while(1) { int total; char files[PERPAGE][FLEN+2]; int count = retrieve_files(files, PERPAGE, skip, extension, pwd, &total); if (selected >= count) { selected = count - 1; } /* optimization: don't reload filelist if only redraw needed */ redraw: lcdClear(); lcdPrint("["); lcdPrint(pwd); lcdPrintln("]"); for (int i = 0; i < 98; i++) { lcdSetPixel(i, 9, 1); } lcdSetCrsr(0, 12); if (!count) { lcdPrintln("- empty"); } else { for (int i = 0; i < count; i++) { if (selected == i) { lcdPrint("*"); } else { lcdPrint(" "); } lcdSetCrsrX(14); lcdPrintln(files[i]); } } lcdRefresh(); char key = getInputWaitRepeat(); switch (key) { case BTN_DOWN: if (selected < count - 1) { selected++; goto redraw; } else { if (skip < total - PERPAGE) { skip++; } else { skip = 0; selected = 0; continue; } } break; case BTN_UP: if (selected > 0) { selected--; goto redraw; } else { if (skip > 0) { skip--; } else { skip = total - PERPAGE; if (skip < 0) { skip = 0; } selected = PERPAGE - 1; continue; } } break; case BTN_LEFT: if (pwd[0] == 0) { return -1; } else { pwd[0] = 0; continue; } case BTN_ENTER: case BTN_RIGHT: if (count) { if (files[selected][strlen(files[selected]) - 1] == '/') { /* directory selected */ strcpy(pwd, files[selected]); continue; } else { strcpy(filename, pwd); strcpy(filename + strlen(pwd), files[selected]); getInputWaitRelease(); /* ?! */ return 0; } } } } }