# HG changeset patch # User Michael Pavone # Date 1556389415 25200 # Node ID 92532eb6986dcbbe041584e445aeb6af07069330 # Parent 58b6f5d918f4e1220b48fb4ab40acbc1cc4fe2f9 Make combo boxes keyboard navigable diff -r 58b6f5d918f4 -r 92532eb6986d nuklear_ui/blastem_nuklear.c --- a/nuklear_ui/blastem_nuklear.c Thu Apr 25 21:54:47 2019 -0700 +++ b/nuklear_ui/blastem_nuklear.c Sat Apr 27 11:23:35 2019 -0700 @@ -2080,6 +2080,7 @@ .r = 255, .g = 128, .b = 0, .a = 255 }; context->style.property.dec_button.text_hover = context->style.property.inc_button.text_hover; + context->style.combo.button.text_hover = context->style.property.inc_button.text_hover; } static void context_created(void) diff -r 58b6f5d918f4 -r 92532eb6986d nuklear_ui/nuklear.h --- a/nuklear_ui/nuklear.h Thu Apr 25 21:54:47 2019 -0700 +++ b/nuklear_ui/nuklear.h Sat Apr 27 11:23:35 2019 -0700 @@ -20375,7 +20375,7 @@ win = ctx->current; style = &ctx->style; layout = win->layout; - state = nk_widget(bounds, ctx); + state = nk_keynav_widget(bounds, ctx); panel_padding = nk_panel_get_padding(style, layout->type); if (layout->row.index == 1) { @@ -22776,8 +22776,11 @@ body.y = (panel->at_y + panel->footer_height + panel->border + padding.y + panel->row.height); body.h = (panel->bounds.y + panel->bounds.h) - body.y; } + int selected = ctx->input.selected_widget; + ctx->input.selected_widget = -1; {int pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT); int in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body); + ctx->input.selected_widget = selected; if (pressed && in_body) popup->flags |= NK_WINDOW_HIDDEN; } @@ -22850,7 +22853,7 @@ win = ctx->current; style = &ctx->style; - s = nk_widget(&header, ctx); + s = nk_keynav_widget(&header, ctx); if (s == NK_WIDGET_INVALID) return 0; @@ -23411,11 +23414,21 @@ size.y = NK_MIN(size.y, (float)max_height); if (nk_combo_begin_label(ctx, items[selected], size)) { nk_layout_row_dynamic(ctx, (float)item_height, 1); + int main_item_widget = ctx->input.widget_counter; for (i = 0; i < count; ++i) { - if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT)) + if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT)) { selected = i; + ctx->input.selected_widget = main_item_widget; + //prevent below code from advancing selected widget + main_item_widget--; + } } nk_combo_end(ctx); + if (ctx->input.selected_widget <= main_item_widget) { + ctx->input.selected_widget = main_item_widget + 1; + } else if (ctx->input.selected_widget > main_item_widget + count) { + ctx->input.selected_widget = main_item_widget + count; + } } return selected; }