changeset 1499:756f8616d1bf nuklear_ui

Refactor basic settings dropdowns
author Michael Pavone <pavone@retrodev.com>
date Fri, 08 Dec 2017 23:24:21 -0800
parents 050a5b032bc5
children 39a199dca772
files nuklear_ui/blastem_nuklear.c
diffstat 1 files changed, 38 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- 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();