From 7f0d3c3e38c9afda677890ffa7f2460f1fa45f70 Mon Sep 17 00:00:00 2001 From: Toad King Date: Mon, 16 Jul 2012 17:57:43 -0400 Subject: [PATCH] (Wii) initial code for a settings menu --- wii/frontend/main.c | 4 ++ wii/frontend/rgui.c | 139 +++++++++++++++++++++++++++++++++++++++++--- wii/frontend/rgui.h | 13 ++++- 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/wii/frontend/main.c b/wii/frontend/main.c index c3805f9ca7..bddfa439d4 100644 --- a/wii/frontend/main.c +++ b/wii/frontend/main.c @@ -87,6 +87,7 @@ static bool get_rom_path(rgui_handle_t *rgui) { uint16_t old_input_state = 0; bool can_quit = false; + bool first = true; for (;;) { @@ -118,6 +119,8 @@ static bool get_rom_path(rgui_handle_t *rgui) action = RGUI_ACTION_UP; else if (trigger_state & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) action = RGUI_ACTION_DOWN; + else if (trigger_state & (1 << RETRO_DEVICE_ID_JOYPAD_SELECT) && !first) // don't catch start+select+l+r when exiting + action = RGUI_ACTION_SETTINGS; const char *ret = rgui_iterate(rgui, action); video_wii.frame(NULL, menu_framebuf, @@ -133,6 +136,7 @@ static bool get_rom_path(rgui_handle_t *rgui) } old_input_state = input_state; + first = false; rarch_sleep(10); } } diff --git a/wii/frontend/rgui.c b/wii/frontend/rgui.c index be446ff4cf..f495f8b37f 100644 --- a/wii/frontend/rgui.c +++ b/wii/frontend/rgui.c @@ -44,6 +44,7 @@ struct rgui_handle rgui_list_t *folder_buf; size_t directory_ptr; bool need_refresh; + rgui_mode_t mode; char path_buf[PATH_MAX]; @@ -163,7 +164,7 @@ static void blit_line(rgui_handle_t *rgui, } } -static void render_text(rgui_handle_t *rgui, size_t begin, size_t end) +static void render_background(rgui_handle_t *rgui) { fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, 0, 0, RGUI_WIDTH, RGUI_HEIGHT, gray_filler); @@ -179,11 +180,23 @@ static void render_text(rgui_handle_t *rgui, size_t begin, size_t end) fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, RGUI_WIDTH - 10, 5, 5, RGUI_HEIGHT - 10, green_filler); +} - char title[TERM_WIDTH - 1]; - const char *dir; - rgui_list_back(rgui->path_stack, &dir, NULL, NULL); - snprintf(title, sizeof(title), "FILE BROWSER: %s", dir); +static void render_text(rgui_handle_t *rgui, size_t begin, size_t end) +{ + render_background(rgui); + + char title[TERM_WIDTH]; + if (rgui->mode == RGUI_FILEBROWSER) + { + const char *dir; + rgui_list_back(rgui->path_stack, &dir, NULL, NULL); + snprintf(title, sizeof(title), "FILE BROWSER: %s", dir); + } + else + { + snprintf(title, sizeof(title), "SETTINGS"); + } blit_line(rgui, TERM_START_X + 15, 15, title, true); unsigned x = TERM_START_X; @@ -197,22 +210,35 @@ static void render_text(rgui_handle_t *rgui, size_t begin, size_t end) char message[TERM_WIDTH + 1]; char *type_str; + int w; switch (type) { case RGUI_FILE_PLAIN: type_str = "(FILE)"; + w = 6; break; case RGUI_FILE_DIRECTORY: type_str = "(DIR)"; + w = 5; break; case RGUI_FILE_DEVICE: type_str = "(DEV)"; + w = 5; + break; + case RGUI_SETTINGS_VIDEO_FILTER: + type_str = g_settings.video.smooth ? "Bilinear" : "None"; + w = 8; + break; + default: + type_str = ""; + w = 0; break; } - snprintf(message, sizeof(message), "%c %-*s %6s\n", + snprintf(message, sizeof(message), "%c %-*s %-*s\n", i == rgui->directory_ptr ? '>' : ' ', - TERM_WIDTH - (6 + 1 + 2), + TERM_WIDTH - (w + 1 + 2), path, + w, type_str); blit_line(rgui, x, y, message, i == rgui->directory_ptr); @@ -257,8 +283,102 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) free(msg); } +static void rgui_settings_toggle_setting(rgui_file_type_t setting) +{ + switch (setting) + { + /*case RGUI_SETTINGS_VIDEO_STRETCH: + + break;*/ + + case RGUI_SETTINGS_VIDEO_FILTER: + g_settings.video.smooth = !g_settings.video.smooth; + break; + + default: + break; + } +} + +static void rgui_settings_populate_entries(rgui_handle_t *rgui) +{ + rgui_list_clear(rgui->folder_buf); + + rgui_list_push(rgui->folder_buf, "Filter", RGUI_SETTINGS_VIDEO_FILTER, 0); +} + +static bool rgui_settings_iterate(rgui_handle_t *rgui, rgui_action_t action) +{ + switch (action) + { + case RGUI_ACTION_UP: + if (rgui->directory_ptr > 0) + rgui->directory_ptr--; + else + rgui->directory_ptr = rgui_list_size(rgui->folder_buf) - 1; + break; + + case RGUI_ACTION_DOWN: + if (rgui->directory_ptr + 1 < rgui_list_size(rgui->folder_buf)) + rgui->directory_ptr++; + else + rgui->directory_ptr = 0; + break; + + case RGUI_ACTION_LEFT: + case RGUI_ACTION_CANCEL: + case RGUI_ACTION_SETTINGS: + rgui->mode = RGUI_FILEBROWSER; + return true; + break; + + case RGUI_ACTION_RIGHT: + case RGUI_ACTION_OK: + { + rgui_file_type_t type; + rgui_list_at(rgui->folder_buf, rgui->directory_ptr, NULL, &type, NULL); + rgui_settings_toggle_setting(type); + break; + } + + case RGUI_ACTION_REFRESH: + rgui_settings_populate_entries(rgui); + rgui->directory_ptr = 0; + break; + + default: + break; + } + + size_t begin = rgui->directory_ptr >= TERM_HEIGHT / 2 ? + rgui->directory_ptr - TERM_HEIGHT / 2 : 0; + size_t end = rgui->directory_ptr + TERM_HEIGHT <= rgui_list_size(rgui->folder_buf) ? + rgui->directory_ptr + TERM_HEIGHT : rgui_list_size(rgui->folder_buf); + + if (end - begin > TERM_HEIGHT) + end = begin + TERM_HEIGHT; + + render_text(rgui, begin, end); + + return false; +} + const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) { + start: + if (rgui->mode == RGUI_SETTINGS) + { + if (rgui_settings_iterate(rgui, action)) + { + action = RGUI_ACTION_REFRESH; + goto start; + } + else + { + return NULL; + } + } + bool found = false; switch (action) { @@ -340,6 +460,11 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) rgui->need_refresh = true; break; + case RGUI_ACTION_SETTINGS: + rgui->mode = RGUI_SETTINGS; + action = RGUI_ACTION_REFRESH; + goto start; + default: break; } diff --git a/wii/frontend/rgui.h b/wii/frontend/rgui.h index ed06f12b04..ed58623d31 100644 --- a/wii/frontend/rgui.h +++ b/wii/frontend/rgui.h @@ -29,7 +29,11 @@ typedef enum { RGUI_FILE_PLAIN, RGUI_FILE_DIRECTORY, - RGUI_FILE_DEVICE + RGUI_FILE_DEVICE, + + // settings options are done here too + //RGUI_SETTINGS_VIDEO_STRETCH, + RGUI_SETTINGS_VIDEO_FILTER } rgui_file_type_t; typedef enum @@ -41,11 +45,18 @@ typedef enum RGUI_ACTION_OK, RGUI_ACTION_CANCEL, RGUI_ACTION_REFRESH, + RGUI_ACTION_SETTINGS, RGUI_ACTION_NOOP } rgui_action_t; typedef struct rgui_handle rgui_handle_t; +typedef enum +{ + RGUI_FILEBROWSER = 0, + RGUI_SETTINGS +} rgui_mode_t; + typedef void (*rgui_file_enum_cb_t)(void *ctx, const char *path, rgui_file_type_t file_type, size_t directory_ptr); typedef bool (*rgui_folder_enum_cb_t)(const char *directory,