X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Fcommon%2Fmenu.c;h=97e365d75379979101794f048e5642a944b2c8fd;hb=0b49a8f782ef178d5aa22f189e275cfbc43967f3;hp=cf31610705a9d9468a06f65a4b70187da60dc1f3;hpb=51f77282d6cb4bc06248395cc1e712ee298910af;p=pcsx_rearmed.git diff --git a/frontend/common/menu.c b/frontend/common/menu.c index cf316107..97e365d7 100644 --- a/frontend/common/menu.c +++ b/frontend/common/menu.c @@ -1,5 +1,5 @@ /* - * (C) Gražvydas "notaz" Ignotas, 2006-2010 + * (C) Gražvydas "notaz" Ignotas, 2006-2011 * * This work is licensed under the terms of any of these licenses * (at your option): @@ -12,6 +12,8 @@ #include #include #include +#include +#include // savestate date #include "menu.h" #include "fonts.h" @@ -309,6 +311,9 @@ void menu_init(void) } fclose(f); } + + // use user's locale for savestate date display + setlocale(LC_TIME, ""); } static void menu_draw_begin(int need_bg) @@ -372,6 +377,28 @@ static int me_count(const menu_entry *ent) return ret; } +static unsigned int me_read_onoff(const menu_entry *ent) +{ + // guess var size based on mask to avoid reading too much + if (ent->mask & 0xffff0000) + return *(unsigned int *)ent->var & ent->mask; + else if (ent->mask & 0xff00) + return *(unsigned short *)ent->var & ent->mask; + else + return *(unsigned char *)ent->var & ent->mask; +} + +static void me_toggle_onoff(menu_entry *ent) +{ + // guess var size based on mask to avoid reading too much + if (ent->mask & 0xffff0000) + *(unsigned int *)ent->var ^= ent->mask; + else if (ent->mask & 0xff00) + *(unsigned short *)ent->var ^= ent->mask; + else + *(unsigned char *)ent->var ^= ent->mask; +} + static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void)) { const menu_entry *ent, *ent_sel = entries; @@ -460,7 +487,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void)) for (ent = entries; ent->name; ent++) { const char **names; - int len; + int len, leftname_end = 0; if (!ent->enabled) continue; @@ -470,14 +497,16 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void)) if (ent->generate_name) name = ent->generate_name(ent->id, &offs); } - if (name != NULL) + if (name != NULL) { text_out16(x, y, name); + leftname_end = x + (strlen(name) + 1) * me_mfont_w; + } switch (ent->beh) { case MB_NONE: break; case MB_OPT_ONOFF: - text_out16(x + col2_offs, y, (*(int *)ent->var & ent->mask) ? "ON" : "OFF"); + text_out16(x + col2_offs, y, me_read_onoff(ent) ? "ON" : "OFF"); break; case MB_OPT_RANGE: text_out16(x + col2_offs, y, "%i", *(int *)ent->var); @@ -494,13 +523,15 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void)) break; case MB_OPT_ENUM: names = (const char **)ent->data; - offs = 0; for (i = 0; names[i] != NULL; i++) { + offs = x + col2_offs; len = strlen(names[i]); if (len > 10) - offs = 10 - len - 2; + offs += (10 - len - 2) * me_mfont_w; + if (offs < leftname_end) + offs = leftname_end; if (i == *(unsigned char *)ent->var) { - text_out16(x + col2_offs + offs * me_mfont_w, y, "%s", names[i]); + text_out16(offs, y, "%s", names[i]); break; } } @@ -545,7 +576,7 @@ static int me_process(menu_entry *entry, int is_next, int is_lr) { case MB_OPT_ONOFF: case MB_OPT_CUSTONOFF: - *(int *)entry->var ^= entry->mask; + me_toggle_onoff(entry); return 1; case MB_OPT_RANGE: case MB_OPT_CUSTRANGE: @@ -939,7 +970,10 @@ rescan: // ------------ savestate loader ------------ +#define STATE_SLOT_COUNT 10 + static int state_slot_flags = 0; +static int state_slot_times[STATE_SLOT_COUNT]; static void state_check_slots(void) { @@ -947,8 +981,9 @@ static void state_check_slots(void) state_slot_flags = 0; - for (slot = 0; slot < 10; slot++) { - if (emu_check_save_file(slot)) + for (slot = 0; slot < STATE_SLOT_COUNT; slot++) { + state_slot_times[slot] = 0; + if (emu_check_save_file(slot, &state_slot_times[slot])) state_slot_flags |= 1 << slot; } } @@ -958,12 +993,13 @@ static void draw_savestate_bg(int slot); static void draw_savestate_menu(int menu_sel, int is_loading) { int i, x, y, w, h; + char time_buf[32]; if (state_slot_flags & (1 << menu_sel)) draw_savestate_bg(menu_sel); w = (13 + 2) * me_mfont_w; - h = (1+2+10+1) * me_mfont_h; + h = (1+2+STATE_SLOT_COUNT+1) * me_mfont_h; x = g_menuscreen_w / 2 - w / 2; if (x < 0) x = 0; y = g_menuscreen_h / 2 - h / 2; @@ -978,12 +1014,23 @@ static void draw_savestate_menu(int menu_sel, int is_loading) text_out16(x, y, is_loading ? "Load state" : "Save state"); y += 3 * me_mfont_h; - menu_draw_selection(x - me_mfont_w * 2, y + menu_sel * me_mfont_h, (13 + 2) * me_mfont_w + 4); + menu_draw_selection(x - me_mfont_w * 2, y + menu_sel * me_mfont_h, (23 + 2) * me_mfont_w + 4); - /* draw all 10 slots */ - for (i = 0; i < 10; i++, y += me_mfont_h) + /* draw all slots */ + for (i = 0; i < STATE_SLOT_COUNT; i++, y += me_mfont_h) { - text_out16(x, y, "SLOT %i (%s)", i, (state_slot_flags & (1 << i)) ? "USED" : "free"); + if (!(state_slot_flags & (1 << i))) + strcpy(time_buf, "free"); + else { + strcpy(time_buf, "USED"); + if (state_slot_times[i] != 0) { + time_t time = state_slot_times[i]; + struct tm *t = localtime(&time); + strftime(time_buf, sizeof(time_buf), "%x %R", t); + } + } + + text_out16(x, y, "SLOT %i (%s)", i, time_buf); } text_out16(x, y, "back"); @@ -992,8 +1039,8 @@ static void draw_savestate_menu(int menu_sel, int is_loading) static int menu_loop_savestate(int is_loading) { - static int menu_sel = 10; - int menu_sel_max = 10; + static int menu_sel = STATE_SLOT_COUNT; + int menu_sel_max = STATE_SLOT_COUNT; unsigned long inp = 0; int ret = 0; @@ -1021,7 +1068,7 @@ static int menu_loop_savestate(int is_loading) } while (!(state_slot_flags & (1 << menu_sel)) && menu_sel != menu_sel_max && is_loading); } if (inp & PBTN_MOK) { // save/load - if (menu_sel < 10) { + if (menu_sel < STATE_SLOT_COUNT) { state_slot = menu_sel; if (emu_save_load_game(is_loading, 0)) { me_update_msg(is_loading ? "Load failed" : "Save failed");