ctrl + scroll -> adjust global font size by default, ctrl + shift + scroll -> adjust text view font size

This commit is contained in:
Ryan Fleury
2025-04-22 16:40:45 -07:00
parent fc728ea4e9
commit 4cbb03fbfe
8 changed files with 87 additions and 24 deletions
+18
View File
@@ -45,6 +45,24 @@ os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers)
return result; 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 internal U32
os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key)
{ {
+1
View File
@@ -112,6 +112,7 @@ internal B32 frame(void);
internal String8 os_string_from_event_kind(OS_EventKind kind); internal String8 os_string_from_event_kind(OS_EventKind kind);
internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); 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 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 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); internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key);
+9 -2
View File
@@ -2546,7 +2546,7 @@ rd_view_ui(Rng2F32 rect)
UI_Padding(ui_pct(1, 0)) UI_Padding(ui_pct(1, 0))
{ {
ui_labelf("use"); 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"); 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.flags |= RD_CellFlag_Slider;
cell_params.slider_value_out = &next_cell_slider_value; 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 // rjf: build
@@ -6908,7 +6915,7 @@ rd_window_frame(void)
ui_labelf("Search for commands and options by pressing "); ui_labelf("Search for commands and options by pressing ");
UI_Flags(UI_BoxFlag_DrawBorder) UI_Flags(UI_BoxFlag_DrawBorder)
UI_TextAlignment(UI_TextAlign_Center) 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_spacer(ui_em(1.f, 1.f));
UI_TagF("pop") UI_TagF("pop")
+14 -1
View File
@@ -38,9 +38,22 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands)
FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, filter, description); FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, filter, description);
FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, display_name); FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, display_name);
FuzzyMatchRangeList tags_matches = fuzzy_match_find(scratch.arena, filter, search_tags); 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 || if(name_matches.count == name_matches.needle_part_count ||
desc_matches.count == desc_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); str8_list_push(scratch.arena, &cmd_names, code_name);
} }
+1 -1
View File
@@ -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);) 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); ui_eat_event(evt);
if(evt->delta_2f32.y < 0) if(evt->delta_2f32.y < 0)
+26 -8
View File
@@ -699,7 +699,7 @@ rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_t
//~ rjf: UI Widgets: Fancy Buttons //~ rjf: UI Widgets: Fancy Buttons
internal void internal void
rd_cmd_binding_buttons(String8 name) rd_cmd_binding_buttons(String8 name, String8 filter)
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
RD_KeyMapNodePtrList key_map_nodes = rd_key_map_node_ptr_list_from_name(scratch.arena, name); 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) if(binding.key != OS_Key_Null)
{ {
String8List mods = os_string_list_from_modifiers(scratch.arena, binding.modifiers); keybinding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key);
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);
} }
else 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 //- 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_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); ui_set_next_text_alignment(UI_TextAlign_Center);
@@ -756,6 +758,7 @@ rd_cmd_binding_buttons(String8 name)
UI_BoxFlag_DrawBorder| UI_BoxFlag_DrawBorder|
UI_BoxFlag_DrawBackground, UI_BoxFlag_DrawBackground,
"%S###bind_btn_%S_%x_%x", keybinding_str, name, binding.key, binding.modifiers); "%S###bind_btn_%S_%x_%x", keybinding_str, name, binding.key, binding.modifiers);
ui_box_equip_fuzzy_match_ranges(box, &matches);
//- rjf: interaction //- rjf: interaction
UI_Signal sig = ui_signal_from_box(box); UI_Signal sig = ui_signal_from_box(box);
@@ -895,7 +898,7 @@ rd_cmd_spec_button(String8 name)
UI_TagF("weak") UI_TagF("weak")
UI_FastpathCodepoint(0) 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_toggle_switch = !!(params->flags & RD_CellFlag_ToggleSwitch) && !is_focus_active;
B32 build_slider = !!(params->flags & RD_CellFlag_Slider) && !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); 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 lhs_name_fstrs = params->meta_fstrs;
DR_FStrList value_name_fstrs = params->value_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) //- rjf: do non-textual edits (delete, copy, cut)
// //
+14 -8
View File
@@ -21,18 +21,21 @@ enum
//- rjf: slider extension //- rjf: slider extension
RD_CellFlag_Slider = (1<<4), RD_CellFlag_Slider = (1<<4),
//- rjf: bindings extension
RD_CellFlag_Bindings = (1<<5),
//- rjf: behavior //- rjf: behavior
RD_CellFlag_DisableEdit = (1<<5), RD_CellFlag_DisableEdit = (1<<6),
RD_CellFlag_KeyboardClickable = (1<<6), RD_CellFlag_KeyboardClickable = (1<<7),
RD_CellFlag_SingleClickActivate = (1<<7), RD_CellFlag_SingleClickActivate = (1<<8),
//- rjf: contents description //- rjf: contents description
RD_CellFlag_CodeContents = (1<<8), RD_CellFlag_CodeContents = (1<<9),
//- rjf: appearance //- rjf: appearance
RD_CellFlag_Border = (1<<9), RD_CellFlag_Border = (1<<10),
RD_CellFlag_NoBackground = (1<<10), RD_CellFlag_NoBackground = (1<<11),
RD_CellFlag_Button = (1<<11), RD_CellFlag_Button = (1<<12),
}; };
typedef struct RD_CellParams RD_CellParams; typedef struct RD_CellParams RD_CellParams;
@@ -56,6 +59,9 @@ struct RD_CellParams
//- rjf: slider info r/w info //- rjf: slider info r/w info
F32 *slider_value_out; F32 *slider_value_out;
//- rjf: bindings name w info
String8 bindings_name;
//- rjf: text editing r/w info //- rjf: text editing r/w info
TxtPt *cursor; TxtPt *cursor;
TxtPt *mark; 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 //~ 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_menu_bar_button(String8 string);
internal UI_Signal rd_cmd_spec_button(String8 name); internal UI_Signal rd_cmd_spec_button(String8 name);
internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints); internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints);
+4 -4
View File
@@ -557,11 +557,11 @@ ui_next_event(UI_Event **ev)
{ {
good = 0; 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; 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; good = 0;
} }
@@ -2878,7 +2878,7 @@ ui_signal_from_box(UI_Box *box)
//- rjf: scrolling //- rjf: scrolling
if(box->flags & UI_BoxFlag_Scroll && if(box->flags & UI_BoxFlag_Scroll &&
evt->kind == UI_EventKind_Scroll && evt->kind == UI_EventKind_Scroll &&
evt->modifiers != OS_Modifier_Ctrl && (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) &&
evt_mouse_in_bounds) evt_mouse_in_bounds)
{ {
Vec2F32 delta = evt->delta_2f32; Vec2F32 delta = evt->delta_2f32;
@@ -2899,7 +2899,7 @@ ui_signal_from_box(UI_Box *box)
//- rjf: view scrolling //- rjf: view scrolling
if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index &&
evt->kind == UI_EventKind_Scroll && evt->kind == UI_EventKind_Scroll &&
evt->modifiers != OS_Modifier_Ctrl && (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) &&
evt_mouse_in_bounds) evt_mouse_in_bounds)
{ {
Vec2F32 delta = evt->delta_2f32; Vec2F32 delta = evt->delta_2f32;