# HG changeset patch # User Michael Pavone # Date 1651196476 25200 # Node ID 237068a2552318e19ba75c5ff120d97983b93584 # Parent c3ee42c89b2767cc3859d8d3ba4d8a82abe38422 Added UI for setting firmware paths diff -r c3ee42c89b27 -r 237068a25523 nuklear_ui/blastem_nuklear.c --- a/nuklear_ui/blastem_nuklear.c Wed Apr 06 21:44:46 2022 -0700 +++ b/nuklear_ui/blastem_nuklear.c Thu Apr 28 18:41:16 2022 -0700 @@ -72,20 +72,24 @@ } +static char *browser_cur_path; +static const char *browser_label; +static const char *browser_setting_path; +static const char **browser_ext_list; +static uint32_t browser_num_exts; void view_file_browser(struct nk_context *context, uint8_t normal_open) { - static char *current_path; static dir_entry *entries; static size_t num_entries; static int32_t selected_entry = -1; - static char **ext_list; + static const char **ext_list; static uint32_t num_exts; static uint8_t got_ext_list; - if (!current_path) { - get_initial_browse_path(¤t_path); + if (!browser_cur_path) { + get_initial_browse_path(&browser_cur_path); } if (!entries) { - entries = get_dir_list(current_path, &num_entries); + entries = get_dir_list(browser_cur_path, &num_entries); if (entries) { sort_dir_list(entries, num_entries); } @@ -99,16 +103,21 @@ num_entries = 1; } } - if (!got_ext_list) { - ext_list = get_extension_list(config, &num_exts); - got_ext_list = 1; + if (!browser_ext_list) { + if (!got_ext_list) { + ext_list = (const char **)get_extension_list(config, &num_exts); + got_ext_list = 1; + } + browser_ext_list = ext_list; + browser_num_exts = num_exts; } uint32_t width = render_width(); uint32_t height = render_height(); if (nk_begin(context, "Load ROM", nk_rect(0, 0, width, height), 0)) { nk_layout_row_static(context, height - context->style.font->height * 3, width - 60, 1); int32_t old_selected = selected_entry; - char *title = alloc_concat("Select ROM: ", current_path); + const char *parts[] = {browser_label, ": ", browser_cur_path}; + char *title = alloc_concat_m(3, parts); if (nk_group_begin(context, title, NK_WINDOW_BORDER | NK_WINDOW_TITLE)) { nk_layout_row_static(context, context->style.font->height - 2, width-100, 1); for (int32_t i = 0; i < num_entries; i++) @@ -116,7 +125,7 @@ if (entries[i].name[0] == '.' && entries[i].name[1] != '.') { continue; } - if (num_exts && !entries[i].is_dir && !path_matches_extensions(entries[i].name, ext_list, num_exts)) { + if (browser_num_exts && !entries[i].is_dir && !path_matches_extensions(entries[i].name, browser_ext_list, browser_num_exts)) { continue; } int selected = i == selected_entry; @@ -132,16 +141,17 @@ free(title); nk_layout_row_static(context, context->style.font->height * 1.75, width > 600 ? 300 : width / 2, 2); if (nk_button_label(context, "Back")) { + browser_ext_list = NULL; pop_view(); } if (nk_button_label(context, "Open") || (old_selected >= 0 && selected_entry < 0)) { if (selected_entry < 0) { selected_entry = old_selected; } - char *full_path = path_append(current_path, entries[selected_entry].name); + char *full_path = path_append(browser_cur_path, entries[selected_entry].name); if (entries[selected_entry].is_dir) { - free(current_path); - current_path = full_path; + free(browser_cur_path); + browser_cur_path = full_path; free_dir_list(entries, num_entries); entries = NULL; } else { @@ -153,12 +163,21 @@ init_system_with_media(full_path, SYSTEM_UNKNOWN); free(full_path); } + + clear_view_stack(); + show_play_view(); + } else if (browser_setting_path) { + config = tern_insert_path(config, browser_setting_path, (tern_val){.ptrval = full_path}, TVAL_PTR); + config_dirty = 1; + browser_ext_list = NULL; + pop_view(); } else { lockon_media(full_path); free(full_path); + + clear_view_stack(); + show_play_view(); } - clear_view_stack(); - show_play_view(); } selected_entry = -1; } @@ -168,11 +187,18 @@ void view_load(struct nk_context *context) { + browser_label = "Select ROM"; view_file_browser(context, 1); } void view_lock_on(struct nk_context *context) { + browser_label = "Select ROM"; + view_file_browser(context, 0); +} + +void view_file_settings(struct nk_context *context) +{ view_file_browser(context, 0); } @@ -1594,6 +1620,36 @@ free(buffer); } +void settings_path(struct nk_context *context, char *label, char *path, char *def, const char **exts, uint32_t num_exts) +{ + nk_label(context, label, NK_TEXT_LEFT); + char *curstr = tern_find_path_default(config, path, (tern_val){.ptrval = def}, TVAL_PTR).ptrval; + uint32_t len = strlen(curstr); + uint32_t buffer_len = len > 100 ? len + 1 : 101; + char *buffer = malloc(buffer_len); + memcpy(buffer, curstr, len); + memset(buffer+len, 0, buffer_len-len); + nk_edit_string(context, NK_EDIT_SIMPLE, buffer, &len, buffer_len-1, nk_filter_default); + buffer[len] = 0; + if (strcmp(buffer, curstr)) { + config_dirty = 1; + config = tern_insert_path(config, path, (tern_val){.ptrval = strdup(buffer)}, TVAL_PTR); + } + + nk_spacing(context, 1); + if (nk_button_label(context, "Browse")) { + browser_label = label; + browser_setting_path = path; + browser_ext_list = exts; + browser_num_exts = num_exts; + if (is_absolute_path(buffer)) { + browser_cur_path = path_dirname(buffer); + } + push_view(view_file_settings); + } + free(buffer); +} + void settings_int_property(struct nk_context *context, char *label, char *name, char *path, int def, int min, int max) { char *curstr = tern_find_path(config, path, TVAL_PTR).ptrval; @@ -2051,6 +2107,23 @@ } } +void view_bios_settings(struct nk_context *context) +{ + if (nk_begin(context, "Firmware", nk_rect(0, 0, render_width(), render_height()), 0)) { + uint32_t desired_width = context->style.font->height * 10; + nk_layout_row_static(context, context->style.font->height, desired_width, 2); + static const char* exts[] = {"md", "bin", "smd"}; + settings_path(context, "TMSS ROM", "ui\0save_path\0", "tmss.md", exts, 3); + settings_path(context, "US CD BIOS", "system\0scd_bios_us\0", "cdbios.md", exts, 3); + settings_path(context, "JP CD BIOS", "system\0scd_bios_jp\0", "cdbios.md", exts, 3); + settings_path(context, "EU CD BIOS", "system\0scd_bios_eu\0", "cdbios.md", exts, 3); + if (nk_button_label(context, "Back")) { + pop_view(); + } + nk_end(context); + } +} + void view_back(struct nk_context *context) { pop_view(); @@ -2066,6 +2139,7 @@ {"Video", view_video_settings}, {"Audio", view_audio_settings}, {"System", view_system_settings}, + {"Firmware", view_bios_settings}, {"Reset to Defaults", view_confirm_reset}, {"Back", view_back} }; diff -r c3ee42c89b27 -r 237068a25523 util.c --- a/util.c Wed Apr 06 21:44:46 2022 -0700 +++ b/util.c Thu Apr 28 18:41:16 2022 -0700 @@ -353,7 +353,7 @@ return strdup(lastdot+1); } -uint8_t path_matches_extensions(char *path, char **ext_list, uint32_t num_exts) +uint8_t path_matches_extensions(char *path, const char **ext_list, uint32_t num_exts) { char *ext = path_extension(path); if (!ext) { diff -r c3ee42c89b27 -r 237068a25523 util.h --- a/util.h Wed Apr 06 21:44:46 2022 -0700 +++ b/util.h Thu Apr 28 18:41:16 2022 -0700 @@ -49,7 +49,7 @@ //Returns the extension from a path or NULL if there is no extension char *path_extension(char const *path); //Returns true if the given path matches one of the extensions in the list -uint8_t path_matches_extensions(char *path, char **ext_list, uint32_t num_exts); +uint8_t path_matches_extensions(char *path, const char **ext_list, uint32_t num_exts); //Returns the directory portion of a path or NULL if there is no directory part char *path_dirname(const char *path); //Gets the smallest power of two that is >= a certain value, won't work for values > 0x80000000