diff --git a/src/os/gfx/os_gfx.c b/src/os/gfx/os_gfx.c index 30d09d74..c5800b57 100644 --- a/src/os/gfx/os_gfx.c +++ b/src/os/gfx/os_gfx.c @@ -45,6 +45,24 @@ os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers) return result; } +internal String8 +os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key) +{ + String8 result = {0}; + if(key != OS_Key_Null) + { + Temp scratch = scratch_begin(&arena, 1); + String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers); + String8 key_string = os_g_key_display_string_table[key]; + str8_list_push(scratch.arena, &mods, key_string); + StringJoin join = {0}; + join.sep = str8_lit(" + "); + result = str8_list_join(arena, &mods, &join); + scratch_end(scratch); + } + return result; +} + internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) { diff --git a/src/os/gfx/os_gfx.h b/src/os/gfx/os_gfx.h index 9c50c5d3..edb4217b 100644 --- a/src/os/gfx/os_gfx.h +++ b/src/os/gfx/os_gfx.h @@ -112,6 +112,7 @@ internal B32 frame(void); internal String8 os_string_from_event_kind(OS_EventKind kind); internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); +internal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key); internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); internal void os_eat_event(OS_EventList *events, OS_Event *event); internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 9245ca2a..26bed2db 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2546,7 +2546,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) { ui_labelf("use"); - UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string); + UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, str8_zero()); ui_labelf("to search for commands and options"); } } @@ -4464,6 +4464,13 @@ rd_view_ui(Rng2F32 rect) cell_params.flags |= RD_CellFlag_Slider; cell_params.slider_value_out = &next_cell_slider_value; } + + // rjf: apply bindings + if(cell->px == 0 && cell->eval.space.kind == RD_EvalSpaceKind_MetaCmd) + { + cell_params.flags |= RD_CellFlag_Bindings; + cell_params.bindings_name = rd_cmd_name_from_eval(cell->eval); + } } // rjf: build @@ -6908,7 +6915,7 @@ rd_window_frame(void) ui_labelf("Search for commands and options by pressing "); UI_Flags(UI_BoxFlag_DrawBorder) UI_TextAlignment(UI_TextAlign_Center) - rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string); + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, str8_zero()); } ui_spacer(ui_em(1.f, 1.f)); UI_TagF("pop") diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 9c6113a1..0d796539 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -38,9 +38,22 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, filter, description); FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, display_name); FuzzyMatchRangeList tags_matches = fuzzy_match_find(scratch.arena, filter, search_tags); + B32 binding_matches_good = 0; + RD_KeyMapNodePtrList bindings = rd_key_map_node_ptr_list_from_name(scratch.arena, code_name); + for(RD_KeyMapNodePtr *n = bindings.first; n != 0; n = n->next) + { + String8 binding_text = os_string_from_modifiers_key(scratch.arena, n->v->binding.modifiers, n->v->binding.key); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, binding_text); + if(matches.count == matches.needle_part_count) + { + binding_matches_good = 1; + break; + } + } if(name_matches.count == name_matches.needle_part_count || desc_matches.count == desc_matches.needle_part_count || - tags_matches.count == tags_matches.needle_part_count) + tags_matches.count == tags_matches.needle_part_count || + binding_matches_good) { str8_list_push(scratch.arena, &cmd_names, code_name); } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 2ef83523..6f0b6bd8 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -775,7 +775,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla { for(UI_Event *evt = 0; ui_next_event(&evt);) { - if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl) + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl && evt->modifiers & OS_Modifier_Shift) { ui_eat_event(evt); if(evt->delta_2f32.y < 0) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 2b7ea1d2..90e79d52 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -699,7 +699,7 @@ rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_t //~ rjf: UI Widgets: Fancy Buttons internal void -rd_cmd_binding_buttons(String8 name) +rd_cmd_binding_buttons(String8 name, String8 filter) { Temp scratch = scratch_begin(0, 0); RD_KeyMapNodePtrList key_map_nodes = rd_key_map_node_ptr_list_from_name(scratch.arena, name); @@ -731,12 +731,7 @@ rd_cmd_binding_buttons(String8 name) { if(binding.key != OS_Key_Null) { - String8List mods = os_string_list_from_modifiers(scratch.arena, binding.modifiers); - String8 key = os_g_key_display_string_table[binding.key]; - str8_list_push(scratch.arena, &mods, key); - StringJoin join = {0}; - join.sep = str8_lit(" + "); - keybinding_str = str8_list_join(scratch.arena, &mods, &join); + keybinding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); } else { @@ -744,6 +739,13 @@ rd_cmd_binding_buttons(String8 name) } } + //- rjf: compute fuzzy matches + FuzzyMatchRangeList matches = {0}; + if(filter.size != 0) + { + matches = fuzzy_match_find(scratch.arena, filter, keybinding_str); + } + //- rjf: build box ui_set_next_tag(has_conflicts ? str8_lit("bad_pop") : rebinding_active_for_this_binding ? str8_lit("pop") : str8_zero()); ui_set_next_text_alignment(UI_TextAlign_Center); @@ -756,6 +758,7 @@ rd_cmd_binding_buttons(String8 name) UI_BoxFlag_DrawBorder| UI_BoxFlag_DrawBackground, "%S###bind_btn_%S_%x_%x", keybinding_str, name, binding.key, binding.modifiers); + ui_box_equip_fuzzy_match_ranges(box, &matches); //- rjf: interaction UI_Signal sig = ui_signal_from_box(box); @@ -895,7 +898,7 @@ rd_cmd_spec_button(String8 name) UI_TagF("weak") UI_FastpathCodepoint(0) { - rd_cmd_binding_buttons(name); + rd_cmd_binding_buttons(name, str8_zero()); } } } @@ -3180,6 +3183,7 @@ rd_cell(RD_CellParams *params, String8 string) // B32 build_toggle_switch = !!(params->flags & RD_CellFlag_ToggleSwitch) && !is_focus_active; B32 build_slider = !!(params->flags & RD_CellFlag_Slider) && !is_focus_active; + B32 build_bindings = !!(params->flags & RD_CellFlag_Bindings) && !is_focus_active; B32 build_lhs_name_desc = (params->meta_fstrs.node_count != 0 || params->description.size != 0); DR_FStrList lhs_name_fstrs = params->meta_fstrs; DR_FStrList value_name_fstrs = params->value_fstrs; @@ -3438,6 +3442,20 @@ rd_cell(RD_CellParams *params, String8 string) } } + ////////////////////////////// + //- rjf: build bindings + // + if(build_bindings) UI_Parent(box) RD_Font(RD_FontSlot_Main) + { + UI_PrefWidth(ui_children_sum(1)) UI_Column UI_Padding(ui_em(1.f, 1.f)) UI_HeightFill + { + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_Padding(ui_em(1.f, 1.f)) + { + rd_cmd_binding_buttons(params->bindings_name, params->search_needle); + } + } + } + ////////////////////////////// //- rjf: do non-textual edits (delete, copy, cut) // diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 293f115e..d0622470 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -21,18 +21,21 @@ enum //- rjf: slider extension RD_CellFlag_Slider = (1<<4), + //- rjf: bindings extension + RD_CellFlag_Bindings = (1<<5), + //- rjf: behavior - RD_CellFlag_DisableEdit = (1<<5), - RD_CellFlag_KeyboardClickable = (1<<6), - RD_CellFlag_SingleClickActivate = (1<<7), + RD_CellFlag_DisableEdit = (1<<6), + RD_CellFlag_KeyboardClickable = (1<<7), + RD_CellFlag_SingleClickActivate = (1<<8), //- rjf: contents description - RD_CellFlag_CodeContents = (1<<8), + RD_CellFlag_CodeContents = (1<<9), //- rjf: appearance - RD_CellFlag_Border = (1<<9), - RD_CellFlag_NoBackground = (1<<10), - RD_CellFlag_Button = (1<<11), + RD_CellFlag_Border = (1<<10), + RD_CellFlag_NoBackground = (1<<11), + RD_CellFlag_Button = (1<<12), }; typedef struct RD_CellParams RD_CellParams; @@ -56,6 +59,9 @@ struct RD_CellParams //- rjf: slider info r/w info F32 *slider_value_out; + //- rjf: bindings name w info + String8 bindings_name; + //- rjf: text editing r/w info TxtPt *cursor; TxtPt *mark; @@ -134,7 +140,7 @@ internal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U6 //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons -internal void rd_cmd_binding_buttons(String8 name); +internal void rd_cmd_binding_buttons(String8 name, String8 filter); internal UI_Signal rd_menu_bar_button(String8 string); internal UI_Signal rd_cmd_spec_button(String8 name); internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 1f4f5df3..53e68765 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -557,11 +557,11 @@ ui_next_event(UI_Event **ev) { good = 0; } - if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers & OS_Modifier_Shift)) + if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers == OS_Modifier_Shift)) { good = 0; } - if(!(perms & UI_PermissionFlag_ScrollY) && (n->v.kind == UI_EventKind_Scroll) && n->v.delta_2f32.y != 0 && !(n->v.modifiers & OS_Modifier_Shift)) + if(!(perms & UI_PermissionFlag_ScrollY) && (n->v.kind == UI_EventKind_Scroll) && n->v.delta_2f32.y != 0 && n->v.modifiers == 0) { good = 0; } @@ -2878,7 +2878,7 @@ ui_signal_from_box(UI_Box *box) //- rjf: scrolling if(box->flags & UI_BoxFlag_Scroll && evt->kind == UI_EventKind_Scroll && - evt->modifiers != OS_Modifier_Ctrl && + (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) && evt_mouse_in_bounds) { Vec2F32 delta = evt->delta_2f32; @@ -2899,7 +2899,7 @@ ui_signal_from_box(UI_Box *box) //- rjf: view scrolling if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && evt->kind == UI_EventKind_Scroll && - evt->modifiers != OS_Modifier_Ctrl && + (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) && evt_mouse_in_bounds) { Vec2F32 delta = evt->delta_2f32;