comparison nuklear_ui/blastem_nuklear.c @ 1521:a51721408c15 nuklear_ui

More fleshed out keyboard bindings view
author Michael Pavone <pavone@retrodev.com>
date Mon, 05 Feb 2018 23:39:14 -0800
parents cb3c6395b28c
children 63659fb92db4
comparison
equal deleted inserted replaced
1520:cb3c6395b28c 1521:a51721408c15
233 } 233 }
234 tern_node **binding_lookup = data; 234 tern_node **binding_lookup = data;
235 *binding_lookup = tern_insert_ptr(*binding_lookup, val.ptrval, strdup(key)); 235 *binding_lookup = tern_insert_ptr(*binding_lookup, val.ptrval, strdup(key));
236 } 236 }
237 237
238 void binding_group(struct nk_context *context, char *name, const char **binds, uint32_t num_binds, tern_node *binding_lookup) 238 static const char *set_binding;
239 { 239 char *set_label;
240 nk_layout_row_static(context, 34*num_binds+30, render_width() - 80, 1); 240 void binding_group(struct nk_context *context, char *name, const char **binds, const char **bind_names, uint32_t num_binds, tern_node *binding_lookup)
241 {
242 nk_layout_row_static(context, 34*num_binds+60, render_width() - 80, 1);
241 if (nk_group_begin(context, name, NK_WINDOW_TITLE)) { 243 if (nk_group_begin(context, name, NK_WINDOW_TITLE)) {
242 nk_layout_row_static(context, 30, render_width()/2 - 80, 2); 244 nk_layout_row_static(context, 30, render_width()/2 - 80, 2);
243 245
244 for (int i = 0; i < num_binds; i++) 246 for (int i = 0; i < num_binds; i++)
245 { 247 {
246 char *label_alloc = path_extension(binds[i]); 248 char *label_alloc = bind_names ? NULL : path_extension(binds[i]);
247 const char *label = label_alloc; 249 const char *label = label_alloc;
248 if (!label) { 250 if (!label) {
249 label = binds[i]; 251 label = bind_names ? bind_names[i] : binds[i];
250 } 252 }
251 nk_label(context, label, NK_TEXT_LEFT); 253 nk_label(context, label, NK_TEXT_LEFT);
254 if (nk_button_label(context, tern_find_ptr_default(binding_lookup, binds[i], "Not Set"))) {
255 set_binding = binds[i];
256 set_label = strdup(label);
257 }
252 if (label_alloc) { 258 if (label_alloc) {
253 free(label_alloc); 259 free(label_alloc);
254 } 260 }
255 nk_button_label(context, tern_find_ptr_default(binding_lookup, binds[i], "Not Set"));
256 } 261 }
257 nk_group_end(context); 262 nk_group_end(context);
258 } 263 }
259 } 264 }
260 265
261 void view_key_bindings(struct nk_context *context) 266 void view_key_bindings(struct nk_context *context)
262 { 267 {
263 const char *controller1_binds[] = { 268 const char *controller1_binds[] = {
264 "gamepads.1.up", "gamepads.1.down", "gamepads.1.left", "gamepads.1.right" 269 "gamepads.1.up", "gamepads.1.down", "gamepads.1.left", "gamepads.1.right",
265 "gamepads.1.a", "gamepads.1.b", "gamepads.1.c", 270 "gamepads.1.a", "gamepads.1.b", "gamepads.1.c",
266 "gamepads.1.x", "gamepads.1.y", "gamepads.1.z", 271 "gamepads.1.x", "gamepads.1.y", "gamepads.1.z",
267 "gamepads.1.start", "gamepads.1.mode" 272 "gamepads.1.start", "gamepads.1.mode"
268 }; 273 };
269 const char *controller2_binds[] = { 274 const char *controller2_binds[] = {
270 "gamepads.2.up", "gamepads.2.down", "gamepads.2.left", "gamepads.2.right" 275 "gamepads.2.up", "gamepads.2.down", "gamepads.2.left", "gamepads.2.right",
271 "gamepads.2.a", "gamepads.2.b", "gamepads.2.c", 276 "gamepads.2.a", "gamepads.2.b", "gamepads.2.c",
272 "gamepads.2.x", "gamepads.2.y", "gamepads.2.z", 277 "gamepads.2.x", "gamepads.2.y", "gamepads.2.z",
273 "gamepads.2.start", "gamepads.2.mode" 278 "gamepads.2.start", "gamepads.2.mode"
279 };
280 const char *general_binds[] = {
281 "ui.exit", "ui.save_state", "ui.toggle_fullscreen", "ui.soft_reset", "ui.reload",
282 "ui.screenshot", "ui.sms_pause", "ui.toggle_keyboard_cpatured", "ui.release_mouse"
283 };
284 const char *general_names[] = {
285 "Show Menu", "Quick Save", "Toggle Fullscreen", "Soft Reset", "Reload Media"
286 "Internal Screenshot", "SMS Pause", "Capture Keyboard", "Release Mouse"
274 }; 287 };
275 const char *speed_binds[] = { 288 const char *speed_binds[] = {
276 "ui.next_speed", "ui.prev_speed", 289 "ui.next_speed", "ui.prev_speed",
277 "ui.set_speed.0", "ui.set_speed.1", "ui.set_speed.2" ,"ui.set_speed.3", "ui.set_speed.4", 290 "ui.set_speed.0", "ui.set_speed.1", "ui.set_speed.2" ,"ui.set_speed.3", "ui.set_speed.4",
278 "ui.set_speed.5", "ui.set_speed.6", "ui.set_speed.7" ,"ui.set_speed.8", "ui.set_speed.9", 291 "ui.set_speed.5", "ui.set_speed.6", "ui.set_speed.7" ,"ui.set_speed.8", "ui.set_speed.9",
279 }; 292 };
293 const char *speed_names[] = {
294 "Next", "Previous",
295 "Default Speed", "Set Speed 1", "Set Speed 2", "Set Speed 3", "Set Speed 4",
296 "Set Speed 5", "Set Speed 6", "Set Speed 7", "Set Speed 8", "Set Speed 9"
297 };
298 const char *debug_binds[] = {
299 "ui.enter_debugger", "ui.vdp_debug_mode", "ui.vdp_debug_pal"
300 };
301 const char *debug_names[] = {
302 "Enter Debugger", "VDP Debug Mode", "Debug Palette"
303 };
280 const uint32_t NUM_C1_BINDS = sizeof(controller1_binds)/sizeof(*controller1_binds); 304 const uint32_t NUM_C1_BINDS = sizeof(controller1_binds)/sizeof(*controller1_binds);
281 const uint32_t NUM_C2_BINDS = sizeof(controller2_binds)/sizeof(*controller2_binds); 305 const uint32_t NUM_C2_BINDS = sizeof(controller2_binds)/sizeof(*controller2_binds);
282 const uint32_t NUM_SPEED_BINDS = sizeof(speed_binds)/sizeof(*speed_binds); 306 const uint32_t NUM_SPEED_BINDS = sizeof(speed_binds)/sizeof(*speed_binds);
307 const uint32_t NUM_GEN_BINDS = sizeof(general_binds)/sizeof(*general_binds);
308 const uint32_t NUM_DBG_BINDS = sizeof(debug_binds)/sizeof(*debug_binds);
283 static tern_node *binding_lookup; 309 static tern_node *binding_lookup;
284 if (!binding_lookup) { 310 if (!binding_lookup) {
285 tern_node *bindings = tern_find_path(config, "bindings\0keys\0", TVAL_NODE).ptrval; 311 tern_node *bindings = tern_find_path(config, "bindings\0keys\0", TVAL_NODE).ptrval;
286 if (bindings) { 312 if (bindings) {
287 tern_foreach(bindings, binding_loop, &binding_lookup); 313 tern_foreach(bindings, binding_loop, &binding_lookup);
288 } 314 }
289 } 315 }
290 uint32_t width = render_width(); 316 uint32_t width = render_width();
291 uint32_t height = render_height(); 317 uint32_t height = render_height();
292 if (nk_begin(context, "Keyboard Bindings", nk_rect(0, 0, width, height), 0)) { 318 if (nk_begin(context, "Keyboard Bindings", nk_rect(0, 0, width, height), 0)) {
293 binding_group(context, "Controller 1", controller1_binds, NUM_C1_BINDS, binding_lookup); 319 binding_group(context, "Controller 1", controller1_binds, NULL, NUM_C1_BINDS, binding_lookup);
294 binding_group(context, "Controller 2", controller2_binds, NUM_C2_BINDS, binding_lookup); 320 binding_group(context, "Controller 2", controller2_binds, NULL, NUM_C2_BINDS, binding_lookup);
295 binding_group(context, "Speed Control", speed_binds, NUM_SPEED_BINDS, binding_lookup); 321 binding_group(context, "General", general_binds, general_names, NUM_GEN_BINDS, binding_lookup);
322 binding_group(context, "Speed Control", speed_binds, speed_names, NUM_SPEED_BINDS, binding_lookup);
323 binding_group(context, "Debug", debug_binds, debug_names, NUM_DBG_BINDS, binding_lookup);
296 324
325 nk_end(context);
326 }
327 if (set_binding && nk_begin(context, "Set Binding", nk_rect(width/4, height/4, width/2/*width*3/4*/, height/2), NK_WINDOW_TITLE | NK_WINDOW_BORDER)) {
328 nk_layout_row_static(context, 30, width/2-30, 1);
329 nk_label(context, "Press new key for", NK_TEXT_CENTERED);
330 nk_label(context, set_label, NK_TEXT_CENTERED);
331 if (nk_button_label(context, "Cancel")) {
332 free(set_label);
333 set_binding = set_label = NULL;
334 }
297 nk_end(context); 335 nk_end(context);
298 } 336 }
299 } 337 }
300 void view_controllers(struct nk_context *context) 338 void view_controllers(struct nk_context *context)
301 { 339 {