changeset 1602:b452887f85b4

Basic UI for selecting layout variants + minor fix to SDL2 mapping generation UI
author Michael Pavone <pavone@retrodev.com>
date Tue, 31 Jul 2018 22:19:56 -0700
parents da04dd9c89ad
children c0727712d529
files nuklear_ui/blastem_nuklear.c
diffstat 1 files changed, 98 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/nuklear_ui/blastem_nuklear.c	Tue Jul 31 09:07:23 2018 -0700
+++ b/nuklear_ui/blastem_nuklear.c	Tue Jul 31 22:19:56 2018 -0700
@@ -716,9 +716,11 @@
 	mapping_string[mapping_pos++] = ':';
 }
 
+#define QUIET_FRAMES 5
 static void view_controller_mappings(struct nk_context *context)
 {
 	char buffer[512];
+	static int quiet;
 	uint8_t added_mapping = 0;
 	if (nk_begin(context, "Controllers", nk_rect(0, 0, render_width(), render_height()), NK_WINDOW_NO_SCROLLBAR)) {
 		nk_layout_row_static(context, render_height() - context->style.font->height, render_width() - context->style.font->height, 1);
@@ -728,36 +730,42 @@
 			snprintf(buffer, sizeof(buffer), "Move Axis %s", get_axis_label(&selected_controller_info, current_axis));
 		}
 		nk_label(context, buffer, NK_TEXT_CENTERED);
-		if (button_pressed >= 0 && button_pressed != last_button) {
-			start_mapping();
-			mapping_string[mapping_pos++] = 'b';
-			if (button_pressed > 9) {
-				mapping_string[mapping_pos++] = '0' + button_pressed / 10;
+		if (quiet) {
+			--quiet;
+		} else {
+			if (button_pressed >= 0 && button_pressed != last_button) {
+				start_mapping();
+				mapping_string[mapping_pos++] = 'b';
+				if (button_pressed > 9) {
+					mapping_string[mapping_pos++] = '0' + button_pressed / 10;
+				}
+				mapping_string[mapping_pos++] = '0' + button_pressed % 10;
+				added_mapping = 1;
+				last_button = button_pressed;
+			} else if (hat_moved >= 0 && hat_value && (hat_moved != last_hat || hat_value != last_hat_value)) {
+				start_mapping();
+				mapping_string[mapping_pos++] = 'h';
+				mapping_string[mapping_pos++] = '0' + hat_moved;
+				mapping_string[mapping_pos++] = '.';
+				mapping_string[mapping_pos++] = '0' + hat_value;
+				added_mapping = 1;
+				
+				last_hat = hat_moved;
+				last_hat_value = hat_value;
+			} else if (axis_moved >= 0 && abs(axis_value) > 1000 && axis_moved != last_axis) {
+				start_mapping();
+				mapping_string[mapping_pos++] = 'a';
+				if (axis_moved > 9) {
+					mapping_string[mapping_pos++] = '0' + axis_moved / 10;
+				}
+				mapping_string[mapping_pos++] = '0' + axis_moved % 10;
+				added_mapping = 1;
+				last_axis = axis_moved;
 			}
-			mapping_string[mapping_pos++] = '0' + button_pressed % 10;
-			added_mapping = 1;
-			last_button = button_pressed;
-		} else if (hat_moved >= 0 && hat_value && (hat_moved != last_hat || hat_value != last_hat_value)) {
-			start_mapping();
-			mapping_string[mapping_pos++] = 'h';
-			mapping_string[mapping_pos++] = '0' + hat_moved;
-			mapping_string[mapping_pos++] = '.';
-			mapping_string[mapping_pos++] = '0' + hat_value;
-			added_mapping = 1;
+		}
 			
-			last_hat = hat_moved;
-			last_hat_value = hat_value;
-		} else if (axis_moved >= 0 && abs(axis_value) > 1000 && axis_moved != last_axis) {
-			start_mapping();
-			mapping_string[mapping_pos++] = 'a';
-			if (axis_moved > 9) {
-				mapping_string[mapping_pos++] = '0' + axis_moved / 10;
-			}
-			mapping_string[mapping_pos++] = '0' + axis_moved % 10;
-			added_mapping = 1;
-			last_axis = axis_moved;
-		}
 		if (added_mapping) {
+			quiet = QUIET_FRAMES;
 			if (current_button < SDL_CONTROLLER_BUTTON_MAX) {
 				current_button++;
 				if (current_button == SDL_CONTROLLER_BUTTON_MAX) {
@@ -781,7 +789,67 @@
 	}
 }
 
-void controller_type_group(struct nk_context *context, char *name, int type_id, int first_subtype_id, const char **types, uint32_t num_types)
+static void view_controller_variant(struct nk_context *context)
+{
+	uint8_t selected = 0;
+	if (nk_begin(context, "Controller Type", nk_rect(0, 0, render_width(), render_height()), 0)) {
+		nk_layout_row_static(context, context->style.font->height*1.25, render_width() - context->style.font->height * 2, 1);
+		nk_label(context, "", NK_TEXT_CENTERED);
+		nk_label(context, "Select the layout that", NK_TEXT_CENTERED);
+		nk_label(context, "best matches your controller", NK_TEXT_CENTERED);
+		nk_label(context, "", NK_TEXT_CENTERED);
+		if (nk_button_label(context, "4 face buttons")) {
+			selected_controller_info.variant = VARIANT_NORMAL;
+			selected = 1;
+		}
+		char buffer[512];
+		snprintf(buffer, sizeof(buffer), "6 face buttons including %s and %s", 
+			get_button_label(&selected_controller_info, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), 
+			get_axis_label(&selected_controller_info, SDL_CONTROLLER_AXIS_TRIGGERRIGHT)
+		);
+		if (nk_button_label(context, buffer)) {
+			selected_controller_info.variant = VARIANT_6B_RIGHT;
+			selected = 1;
+		}
+		snprintf(buffer, sizeof(buffer), "6 face buttons including %s and %s", 
+			get_button_label(&selected_controller_info, SDL_CONTROLLER_BUTTON_LEFTSHOULDER), 
+			get_button_label(&selected_controller_info, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)
+		);
+		if (nk_button_label(context, buffer)) {
+			selected_controller_info.variant = VARIANT_6B_BUMPERS;
+			selected = 1;
+		}
+		nk_end(context);
+	}
+	if (selected) {
+		save_controller_info(selected_controller, &selected_controller_info);
+		pop_view();
+		SDL_GameController *controller = render_get_controller(selected_controller);
+		if (controller) {
+			push_view(view_controller_bindings);
+			SDL_GameControllerClose(controller);
+		} else {
+			current_button = SDL_CONTROLLER_BUTTON_A;
+			button_pressed = -1;
+			last_button = -1;
+			last_hat = -1;
+			axis_moved = -1;
+			last_axis = -1;
+			SDL_Joystick *joy = render_get_joystick(selected_controller);
+			const char *name = SDL_JoystickName(joy);
+			size_t namesz = strlen(name);
+			mapping_string = malloc(512 + namesz);
+			SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joy), mapping_string, 33);
+			mapping_string[32] = ',';
+			memcpy(mapping_string + 33, name, namesz);
+			mapping_pos = 33+namesz;
+			
+			push_view(view_controller_mappings);
+		}
+	}
+}
+
+static void controller_type_group(struct nk_context *context, char *name, int type_id, int first_subtype_id, const char **types, uint32_t num_types)
 {
 	nk_layout_row_static(context, (context->style.font->height + 3) * num_types + context->style.font->height, render_width() - 80, 1);
 	if (nk_group_begin(context, name, NK_WINDOW_TITLE)) {
@@ -789,32 +857,10 @@
 		for (int i = 0; i < num_types; i++)
 		{
 			if (nk_button_label(context, types[i])) {
+				selected_controller_info.type = type_id;
 				selected_controller_info.subtype = first_subtype_id + i;
-				save_controller_info(selected_controller, &selected_controller_info);
-				selected_controller_info = get_controller_info(selected_controller);
 				pop_view();
-				SDL_GameController *controller = render_get_controller(selected_controller);
-				if (controller) {
-					push_view(view_controller_bindings);
-					SDL_GameControllerClose(controller);
-				} else {
-					current_button = SDL_CONTROLLER_BUTTON_A;
-					button_pressed = -1;
-					last_button = -1;
-					last_hat = -1;
-					axis_moved = -1;
-					last_axis = -1;
-					SDL_Joystick *joy = render_get_joystick(selected_controller);
-					const char *name = SDL_JoystickName(joy);
-					size_t namesz = strlen(name);
-					mapping_string = malloc(512 + namesz);
-					SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joy), mapping_string, 33);
-					mapping_string[32] = ',';
-					memcpy(mapping_string + 33, name, namesz);
-					mapping_pos = 33+namesz;
-					
-					push_view(view_controller_mappings);
-				}
+				push_view(view_controller_variant);
 			}
 		}
 		nk_group_end(context);