X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=menu.c;h=2e97f0640229ad96605564a76de20b1fb57871c4;hb=1bc471ebf1c85cf78f1862f5596a76f051e7112d;hp=3796f45bcee7563295c3de2b6e8c296ea9708b3e;hpb=8a0998fb31e440f7f7566510128049142bc3ad74;p=libpicofe.git diff --git a/menu.c b/menu.c index 3796f45..2e97f06 100644 --- a/menu.c +++ b/menu.c @@ -31,10 +31,10 @@ void *g_menuscreen_ptr; void *g_menubg_src_ptr; void *g_menubg_ptr; -#if !MSCREEN_SIZE_FIXED int g_menuscreen_w; int g_menuscreen_h; -#endif + +int g_autostateld_opt; static unsigned char *menu_font_data = NULL; static int menu_text_color = 0xfffe; // default to white @@ -898,10 +898,16 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, snprintf(buff, sizeof(buff), "%s - select, %s - back", in_get_key_name(-1, -PBTN_MOK), in_get_key_name(-1, -PBTN_MBACK)); - smalltext_out16(x, g_menuscreen_h - me_sfont_h * 2 - 2, buff, 0xe78c); + smalltext_out16(x, g_menuscreen_h - me_sfont_h * 3 - 2, buff, 0xe78c); + snprintf(buff, sizeof(buff), g_menu_filter_off ? "%s - hide unknown files" : "%s - show all files", in_get_key_name(-1, -PBTN_MA3)); + smalltext_out16(x, g_menuscreen_h - me_sfont_h * 2 - 2, buff, 0xe78c); + + snprintf(buff, sizeof(buff), g_autostateld_opt ? + "%s - autoload save is ON" : "%s - autoload save is OFF", + in_get_key_name(-1, -PBTN_MA2)); smalltext_out16(x, g_menuscreen_h - me_sfont_h * 1 - 2, buff, 0xe78c); } @@ -922,8 +928,11 @@ static int scandir_cmp(const void *p1, const void *p2) return alphasort(d1, d2); } +static const char **filter_exts_internal; + static int scandir_filter(const struct dirent *ent) { + const char **filter = filter_exts_internal; const char *ext; int i; @@ -938,8 +947,8 @@ static int scandir_filter(const struct dirent *ent) return 0; ext++; - for (i = 0; i < array_size(filter_exts); i++) - if (strcasecmp(ext, filter_exts[i]) == 0) + for (i = 0; filter[i] != NULL; i++) + if (strcasecmp(ext, filter[i]) == 0) return 1; return 0; @@ -950,9 +959,11 @@ static int dirent_seek_char(struct dirent **namelist, int len, int sel, char c) int i; sel++; - for (i = sel + 1; i != sel; i++) { + for (i = sel + 1; ; i++) { if (i >= len) i = 1; + if (i == sel) + break; if (tolower_simple(namelist[i]->d_name[0]) == c) break; @@ -961,7 +972,8 @@ static int dirent_seek_char(struct dirent **namelist, int len, int sel, char c) return i - 1; } -static char *menu_loop_romsel(char *curr_path, int len, +static const char *menu_loop_romsel(char *curr_path, int len, + const char **filter_exts, int (*extra_filter)(struct dirent **namelist, int count, const char *basedir)) { @@ -971,21 +983,23 @@ static char *menu_loop_romsel(char *curr_path, int len, struct dirent **namelist = NULL; int n = 0, inp = 0, sel = 0, show_help = 0; char *curr_path_restore = NULL; - char *ret = NULL; + const char *ret = NULL; char cinp; + filter_exts_internal = filter_exts; sel_fname[0] = 0; // is this a dir or a full path? if (!plat_is_dir(curr_path)) { - char *p = curr_path + strlen(curr_path) - 1; - for (; p > curr_path && *p != '/'; p--) - ; - *p = 0; - curr_path_restore = p; - snprintf(sel_fname, sizeof(sel_fname), "%s", p + 1); + char *p = strrchr(curr_path, '/'); + if (p != NULL) { + *p = 0; + curr_path_restore = p; + snprintf(sel_fname, sizeof(sel_fname), "%s", p + 1); + } - show_help = 2; + if (rom_fname_reload[0] == 0) + show_help = 2; } rescan: @@ -1045,19 +1059,19 @@ rescan: inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT | PBTN_L|PBTN_R|PBTN_MA2|PBTN_MA3|PBTN_MOK|PBTN_MBACK | PBTN_MENU|PBTN_CHAR, &cinp, 33); - if (inp & PBTN_UP ) { sel--; if (sel < 0) sel = n-2; } - if (inp & PBTN_DOWN) { sel++; if (sel > n-2) sel = 0; } - if (inp & PBTN_LEFT) { sel-=10; if (sel < 0) sel = 0; } - if (inp & PBTN_L) { sel-=24; if (sel < 0) sel = 0; } - if (inp & PBTN_RIGHT) { sel+=10; if (sel > n-2) sel = n-2; } - if (inp & PBTN_R) { sel+=24; if (sel > n-2) sel = n-2; } - if (inp & PBTN_CHAR) sel = dirent_seek_char(namelist, n, sel, cinp); if (inp & PBTN_MA3) { g_menu_filter_off = !g_menu_filter_off; snprintf(sel_fname, sizeof(sel_fname), "%s", namelist[sel+1]->d_name); goto rescan; } + if (inp & PBTN_UP ) { sel--; if (sel < 0) sel = n-2; } + if (inp & PBTN_DOWN) { sel++; if (sel > n-2) sel = 0; } + if (inp & PBTN_LEFT) { sel-=10; if (sel < 0) sel = 0; } + if (inp & PBTN_L) { sel-=24; if (sel < 0) sel = 0; } + if (inp & PBTN_RIGHT) { sel+=10; if (sel > n-2) sel = n-2; } + if (inp & PBTN_R) { sel+=24; if (sel > n-2) sel = n-2; } + if ((inp & PBTN_MOK) || (inp & (PBTN_MENU|PBTN_MA2)) == (PBTN_MENU|PBTN_MA2)) { again: @@ -1096,7 +1110,7 @@ rescan: strcat(newdir, "/"); strcat(newdir, namelist[sel+1]->d_name); } - ret = menu_loop_romsel(newdir, newlen, extra_filter); + ret = menu_loop_romsel(newdir, newlen, filter_exts, extra_filter); free(newdir); break; } @@ -1117,6 +1131,15 @@ rescan: } } } + else if (inp & PBTN_MA2) { + g_autostateld_opt = !g_autostateld_opt; + show_help = 3; + } + else if (inp & PBTN_CHAR) { + // must be last + sel = dirent_seek_char(namelist, n, sel, cinp); + } + if (inp & PBTN_MBACK) break;