# HG changeset patch # User Michael Pavone # Date 1512804261 28800 # Node ID 756f8616d1bf828a3dc2b1f9bf02c4449995d7f4 # Parent 050a5b032bc5b2cf2d1c90c5823108c734532694 Refactor basic settings dropdowns diff -r 050a5b032bc5 -r 756f8616d1bf nuklear_ui/blastem_nuklear.c --- a/nuklear_ui/blastem_nuklear.c Fri Dec 08 09:43:05 2017 -0800 +++ b/nuklear_ui/blastem_nuklear.c Fri Dec 08 23:24:21 2017 -0800 @@ -414,6 +414,40 @@ nk_end(context); } } + +int32_t find_match(const char **options, uint32_t num_options, char *path, char *def) +{ + char *setting = tern_find_path_default(config, path, (tern_val){.ptrval = def}, TVAL_PTR).ptrval; + int32_t selected = -1; + for (uint32_t i = 0; i < num_options; i++) + { + if (!strcmp(setting, options[i])) { + selected = i; + break; + } + } + if (selected == -1) { + for (uint32_t i = 0; i < num_options; i++) + { + if (!strcmp(def, options[i])) { + selected = i; + break; + } + } + } + return selected; +} + +int32_t settings_dropdown(struct nk_context *context, char *label, const char **options, uint32_t num_options, int32_t current, char *path) +{ + nk_label(context, label, NK_TEXT_LEFT); + int32_t next = nk_combo(context, options, num_options, current, 30, nk_vec2(300, 300)); + if (next != current) { + config = tern_insert_path(config, path, (tern_val){.ptrval = strdup(options[next])}, TVAL_PTR); + } + return next; +} + void view_audio_settings(struct nk_context *context) { const char *rates[] = { @@ -435,47 +469,15 @@ static int32_t selected_rate = -1; static int32_t selected_size = -1; if (selected_rate < 0 || selected_size < 0) { - char *rate = tern_find_path_default(config, "audio\0rate\0", (tern_val){.ptrval = "48000"}, TVAL_PTR).ptrval; - for (uint32_t i = 0; i < num_rates; i++) - { - if (!strcmp(rate, rates[i])) { - selected_rate = i; - break; - } - } - if (selected_rate < 0) { - //better solution would be to add the custom rate to the rate list, but this is probably sufficient for now - selected_rate = 2; - } - char *size = tern_find_path_default(config, "audio\0buffer\0", (tern_val){.ptrval = "512"}, TVAL_PTR).ptrval; - for (uint32_t i = 0; i < num_sizes; i++) - { - if (!strcmp(size, sizes[i])) { - selected_size = i; - break; - } - } - if (selected_size < 0) { - //better solution would be to add the custom rate to the rate list, but this is probably sufficient for now - selected_size = 2; - } + selected_rate = find_match(rates, num_rates, "autio\0rate\0", "48000"); + selected_size = find_match(sizes, num_sizes, "audio\0buffer\0", "512"); } uint32_t width = render_width(); uint32_t height = render_height(); if (nk_begin(context, "Audio Settings", nk_rect(0, 0, width, height), 0)) { nk_layout_row_static(context, 30, width > 300 ? 300 : width, 2); - nk_label(context, "Rate in Hz", NK_TEXT_LEFT); - int32_t next_selected = nk_combo(context, rates, num_rates, selected_rate, 30, nk_vec2(300, 300)); - if (next_selected != selected_rate) { - config = tern_insert_path(config, "audio\0rate\0", (tern_val){.ptrval = strdup(rates[next_selected])}, TVAL_PTR); - selected_rate = next_selected; - } - nk_label(context, "Buffer Samples", NK_TEXT_LEFT); - next_selected = nk_combo(context, sizes, num_sizes, selected_size, 30, nk_vec2(300, 300)); - if (next_selected != selected_size) { - config = tern_insert_path(config, "audio\0buffer\0", (tern_val){.ptrval = strdup(sizes[next_selected])}, TVAL_PTR); - selected_size = next_selected; - } + selected_rate = settings_dropdown(context, "Rate in Hz", rates, num_rates, selected_rate, "audio\0rate\0"); + selected_size = settings_dropdown(context, "Buffer Samples", sizes, num_sizes, selected_size, "audio\0buffer\0"); settings_int_input(context, "Lowpass Cutoff Hz", "audio\0lowpass_cutoff\0", "3390"); if (nk_button_label(context, "Back")) { pop_view();