void main_menu( void ) { static int pageno = 0; char status; char ch; file_menu( ); while ( 1 ) { ch = select_font( &pageno, &status ); switch ( status ) { case RET: edit( ch ); break; case 3: file_menu( ); } } }
/* * Root Menu */ int menu(unsigned int level, unsigned int n_menu, unsigned int select) { int s,ss=0; while(1){ frame(level,menus[n_menu].items,select); disp_menu(level,n_menu); s=select_menu(level,n_menu); switch(s){ case -1: case 999: return(s); break; default: switch(menus[n_menu].next[s]){ case 0: return(s); break; case 99: switch(file_menu(level+1, s)){ case -1: return(-1); break; case 999: break; default: return(s); break; } break; default: ss=menu(level+1,menus[n_menu].next[s],s); if(ss==-1){ return(ss); }else if(ss==999){ break; }else{ return(s*10+ss); } } break; } } return(-1); }
/* * File Select Menu */ int file_menu(unsigned int level, unsigned int select) { FRESULT f; unsigned int total,offset,num,i; unsigned char *items; BYTE *attrib; f=f_opendir(&dirs, "\0"); // current directory switch(f){ case FR_OK: total=0; offset=0; num=0; while((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0]){ total++; } break; case FR_INT_ERR: case FR_NOT_READY: default: return(-1); break; } f_readdir(&dirs, (FILINFO *)NULL); // rewind items=malloc(total*13); attrib=malloc(total*sizeof(BYTE)); for(i=0;i<total;i++){ f_readdir(&dirs, &finfo); memcpy(&items[i*13], finfo.fname, 13); attrib[i]=finfo.fattrib; } if(total>23){ frame(level,23,select); }else{ frame(level,total,select); } disp_files(level,&items[offset],total); MZ_disp(level*13+13,num+1,0x04); while(1){ if((z80_sts.status&S_FBTN)==0){ free(items); free(attrib); return(-1); } switch(get_key()){ case 0x08: // directory back MZ_disp(level*13+13,num+1,0x9a); f_chdir(".."); free(items); free(attrib); return(file_menu(level,select)); break; case 0x0d: // select MZ_disp(level*13+13,num+1,0x9a); if(attrib[offset+num]&AM_DIR){ f_chdir((TCHAR*)&items[(offset+num)*13]); free(items); free(attrib); return(file_menu(level,select)); }else{ memcpy(fname, &items[(offset+num)*13], 13); free(items); free(attrib); return(0); } break; case 0x1b: // escape select z80_sts.status&=~S_FBTN; break; case 0x1d: // back to menu MZ_disp(level*13+13,num+1,0x9a); free(items); free(attrib); return(999); break; case 0x1e: // up if(num>0){ MZ_disp(level*13+13,num,0x04); MZ_disp(level*13+13,num+1,0x9a); num--; }else{ if(offset>0){ offset--; disp_files(level,&items[offset*13],total); } } break; case 0x1f: // down if(total>23){ if(num<22){ MZ_disp(level*13+13,num+1,0x9a); MZ_disp(level*13+13,num+2,0x04); num++; }else{ if((num+offset)<(total-1)){ offset++; disp_files(level,&items[offset*13],total); } } }else{ if(num<(total-1)){ MZ_disp(level*13+13,num+1,0x9a); MZ_disp(level*13+13,num+2,0x04); num++; } } break; default: break; } } return(-1); }