plug rebindings back in

This commit is contained in:
Ryan Fleury
2025-02-21 09:25:26 -08:00
parent c7da3e8a13
commit 2f2bb0d797
7 changed files with 83 additions and 105 deletions
@@ -399,7 +399,7 @@ ev_expand_rule_from_string(String8 string)
////////////////////////////////
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (dynamic type resolution)
internal E_Expr *
ev_resolved_from_expr(Arena *arena, E_Expr *expr)
{
@@ -325,7 +325,7 @@ internal EV_ExpandRule *ev_expand_rule_from_string(String8 string);
////////////////////////////////
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (dynamic type resolution)
internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr);
#endif
+63 -76
View File
@@ -3984,7 +3984,7 @@ rd_view_ui(Rng2F32 rect)
// rjf: loop through X selections and perform operations for each
for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1)
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (multicursor watch window press operations)
//- rjf: determine operation for this cell
typedef enum OpKind
{
@@ -5186,7 +5186,7 @@ rd_view_ui(Rng2F32 rect)
{
ui_pop_background_color();
}
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (autocompletion)
if(ui_is_focus_active() &&
selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y &&
txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark))
@@ -5830,6 +5830,21 @@ rd_tex2dformat_from_eval_tag(E_Eval eval, E_Expr *tag)
return fmt;
}
internal E_Value
rd_value_from_eval_tag_key(E_Eval eval, E_Expr *tag, String8 key)
{
E_Value value = zero_struct;
for(E_Expr *arg = tag->first->next; arg != &e_expr_nil; arg = arg->next)
{
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, key, 0))
{
value = e_value_from_expr(arg->first->next);
break;
}
}
return value;
}
//- rjf: pushing/attaching view resources
internal void *
@@ -6847,7 +6862,7 @@ rd_window_frame(void)
//
case RD_RegSlot_View:
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (context menus)
RD_Cfg *tab = rd_cfg_from_id(regs->view);
RD_RegsScope(.view = regs->view)
{
@@ -10471,7 +10486,7 @@ rd_lister_item_array_from_regs_needle_cursor_off(Arena *arena, RD_Regs *regs, St
DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena);
DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list);
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (lister)
//////////////////////////
//- rjf: determine all ctx filters
@@ -10836,7 +10851,7 @@ rd_lister_item_array_from_regs_needle_cursor_off(Arena *arena, RD_Regs *regs, St
}
//- rjf: gather view rule params
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (lister)
if(flags & RD_ListerFlag_ViewRuleParams)
{
for(String8Node *n = strings.first; n != 0; n = n->next)
@@ -10979,7 +10994,7 @@ rd_lister_item_array_from_regs_needle_cursor_off(Arena *arena, RD_Regs *regs, St
//- rjf: gather settings
if(flags & RD_ListerFlag_Settings)
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (lister)
String8List schema_strings = {0};
// rjf: push schema for view
@@ -11112,7 +11127,7 @@ rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off)
return path;
}
#if 0 // TODO(rjf): @cfg_lister
#if 0 // TODO(rjf): @cfg (lister)
internal RD_ListerParams
rd_view_rule_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off)
@@ -12539,7 +12554,7 @@ rd_frame(void)
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))
{
rd_request_frame();
// TODO(rjf): @cfg_bindchange rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
rd_cfg_release(rd_cfg_from_id(rd_state->bind_change_binding_id));
rd_state->bind_change_active = 0;
}
for(OS_Event *event = events.first, *next = 0; event != 0; event = next)
@@ -12557,13 +12572,19 @@ rd_frame(void)
event->key != OS_Key_Shift)
{
rd_state->bind_change_active = 0;
RD_Binding binding = zero_struct;
RD_Cfg *binding = rd_cfg_from_id(rd_state->bind_change_binding_id);
if(binding == &rd_nil_cfg)
{
binding.key = event->key;
binding.modifiers = event->modifiers;
RD_Cfg *user = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user"));
RD_Cfg *keybindings = rd_cfg_child_from_string_or_alloc(user, str8_lit("keybindings"));
binding = rd_cfg_new(keybindings, str8_lit(""));
}
// TODO(rjf): @cfg_bindchange rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
// TODO(rjf): @cfg_bindchange rd_bind_name(rd_state->bind_change_cmd_name, binding);
rd_cfg_release_all_children(binding);
rd_cfg_new(binding, rd_state->bind_change_cmd_name);
rd_cfg_new(binding, os_g_key_cfg_string_table[event->key]);
if(event->modifiers & OS_Modifier_Ctrl) { rd_cfg_new(binding, str8_lit("ctrl")); }
if(event->modifiers & OS_Modifier_Shift) { rd_cfg_new(binding, str8_lit("shift")); }
if(event->modifiers & OS_Modifier_Alt) { rd_cfg_new(binding, str8_lit("alt")); }
U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key);
os_text(&events, event->window, codepoint);
os_eat_event(&events, event);
@@ -12636,7 +12657,7 @@ rd_frame(void)
U64 name_slot_idx = name_hash%key_map->name_slots_count;
U64 binding_slot_idx = binding_hash%key_map->binding_slots_count;
RD_KeyMapNode *n = push_array(rd_frame_arena(), RD_KeyMapNode, 1);
n->cfg = keybinding;
n->cfg_id = keybinding->id;
n->name = push_str8_copy(rd_frame_arena(), name);
n->binding = binding;
SLLQueuePush_N(key_map->name_slots[name_slot_idx].first, key_map->name_slots[name_slot_idx].last, n, name_hash_next);
@@ -12644,39 +12665,6 @@ rd_frame(void)
}
}
}
//- rjf: iterate default bindings - if their commands are not found in the
// map, then use the default binding.
//
// TODO(rjf): @dynamic_cmds
//
for EachElement(idx, rd_default_binding_table)
{
String8 name = rd_default_binding_table[idx].string;
B32 name_was_mapped = 0;
U64 name_hash = d_hash_from_string(name);
U64 name_slot_idx = name_hash%key_map->name_slots_count;
for(RD_KeyMapNode *n = key_map->name_slots[name_slot_idx].first; n != 0; n = n->name_hash_next)
{
if(str8_match(n->name, name, 0))
{
name_was_mapped = 1;
break;
}
}
if(!name_was_mapped)
{
RD_Binding binding = rd_default_binding_table[idx].binding;
U64 binding_hash = d_hash_from_string(str8_struct(&binding));
U64 binding_slot_idx = binding_hash%key_map->binding_slots_count;
RD_KeyMapNode *n = push_array(rd_frame_arena(), RD_KeyMapNode, 1);
n->cfg = &rd_nil_cfg;
n->name = push_str8_copy(rd_frame_arena(), name);
n->binding = binding;
SLLQueuePush_N(key_map->name_slots[name_slot_idx].first, key_map->name_slots[name_slot_idx].last, n, name_hash_next);
SLLQueuePush_N(key_map->binding_slots[binding_slot_idx].first, key_map->binding_slots[binding_slot_idx].last, n, binding_hash_next);
}
}
}
//////////////////////////////
@@ -13539,7 +13527,7 @@ rd_frame(void)
}
// rjf: try to open tabs for "view driver" commands
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (tab opening)
RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_string(cmd->name);
if(view_rule_info != &rd_nil_view_rule_info)
{
@@ -13783,6 +13771,27 @@ rd_frame(void)
}
}
//- rjf: if config did not define any keybindings for the user, then we need to build a sensible default
if(file_is_okay && kind == RD_CmdKind_OpenUser)
{
RD_CfgList all_keybindings = rd_cfg_child_list_from_string(scratch.arena, file_root, str8_lit("keybindings"));
if(all_keybindings.count == 0)
{
RD_Cfg *keybindings = rd_cfg_new(file_root, str8_lit("keybindings"));
for EachElement(idx, rd_default_binding_table)
{
String8 name = rd_default_binding_table[idx].string;
RD_Binding binding = rd_default_binding_table[idx].binding;
RD_Cfg *binding_root = rd_cfg_new(keybindings, str8_zero());
rd_cfg_new(binding_root, name);
rd_cfg_new(binding_root, os_g_key_cfg_string_table[binding.key]);
if(binding.modifiers & OS_Modifier_Ctrl) {rd_cfg_newf(binding_root, "ctrl");}
if(binding.modifiers & OS_Modifier_Shift) {rd_cfg_newf(binding_root, "shift");}
if(binding.modifiers & OS_Modifier_Alt) {rd_cfg_newf(binding_root, "alt");}
}
}
}
//- rjf: record recently-opened projects in the user
if(file_is_okay && kind == RD_CmdKind_OpenProject)
{
@@ -14539,7 +14548,7 @@ rd_frame(void)
}break;
case RD_CmdKind_OpenTab:
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (tab opening)
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *view = rd_view_alloc();
String8 query = rd_regs()->string;
@@ -14626,7 +14635,7 @@ rd_frame(void)
if(props.created != 0)
{
rd_cmd(RD_CmdKind_RecordFileInProject);
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (opening file)
rd_cmd(RD_CmdKind_OpenTab,
.string = rd_eval_string_from_file_path(scratch.arena, path),
.params_tree = md_tree_from_string(scratch.arena, rd_view_rule_kind_info_table[RD_ViewRuleKind_PendingFile].string)->first);
@@ -14639,7 +14648,7 @@ rd_frame(void)
}break;
case RD_CmdKind_Switch:
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (opening recent files)
RD_Window *ws = rd_window_from_handle(rd_regs()->window);
RD_Panel *src_panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *src_view = rd_view_from_handle(rd_regs()->view);
@@ -14686,7 +14695,7 @@ rd_frame(void)
}break;
case RD_CmdKind_SwitchToPartnerFile:
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (opening partner files)
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *view = rd_selected_tab_from_panel(panel);
{
@@ -15623,28 +15632,6 @@ Z(getting_started)
}
}break;
//- rjf: search operations
#if 0 // TODO(rjf): @cfg
case RD_CmdKind_ClearFilter:
{
RD_View *view = rd_view_from_handle(rd_regs()->view);
if(!rd_view_is_nil(view))
{
view->query_string_size = 0;
view->is_filtering = 0;
view->query_cursor = view->query_mark = txt_pt(1, 1);
}
}break;
case RD_CmdKind_ApplyFilter:
{
RD_View *view = rd_view_from_handle(rd_regs()->view);
if(!rd_view_is_nil(view))
{
view->is_filtering = 0;
}
}break;
#endif
//- rjf: queries
case RD_CmdKind_PushQuery:
{
@@ -15686,7 +15673,7 @@ Z(getting_started)
}break;
case RD_CmdKind_CompleteQuery:
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (query completion)
RD_Window *ws = rd_window_from_handle(rd_regs()->window);
String8 query_cmd_name = ws->query_cmd_name;
RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(query_cmd_name);
@@ -15939,7 +15926,7 @@ Z(getting_started)
RD_Cfg *view_rule = rd_cfg_new(wp, str8_lit("view_rule"));
rd_cfg_new(expr, expr_string);
rd_cfg_new(view_rule, view_rule_string);
rd_cmd(RD_CmdKind_RelocateCfg, .cfg = wp->id);
rd_cmd(RD_CmdKind_RelocateCfg, .cfg = wp->id, .expr = str8_zero());
}
}break;
+4 -11
View File
@@ -39,7 +39,7 @@ struct RD_KeyMapNode
{
RD_KeyMapNode *name_hash_next;
RD_KeyMapNode *binding_hash_next;
struct RD_Cfg *cfg;
RD_CfgID cfg_id;
String8 name;
RD_Binding binding;
};
@@ -840,19 +840,11 @@ struct RD_State
RD_ViewStateSlot *view_state_slots;
RD_ViewState *free_view_state;
//-
// TODO(rjf): TO BE ELIMINATED OR REPLACED VVVVVVVVVVVVVVVV
//-
// rjf: bind change
Arena *bind_change_arena;
B32 bind_change_active;
RD_CfgID bind_change_binding_id;
String8 bind_change_cmd_name;
RD_Binding bind_change_binding;
//-
// TODO(rjf): TO BE ELIMINATED OR REPLACED ^^^^^^^^^^^^^^^^^^
//-
};
////////////////////////////////
@@ -1094,6 +1086,7 @@ internal TXT_LangKind rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag);
internal Arch rd_arch_from_eval_tag(E_Eval eval, E_Expr *tag);
internal Vec2S32 rd_dim2s32_from_eval_tag(E_Eval eval, E_Expr *tag);
internal R_Tex2DFormat rd_tex2dformat_from_eval_tag(E_Eval eval, E_Expr *tag);
internal E_Value rd_value_from_eval_tag_key(E_Eval eval, E_Expr *tag, String8 key);
//- rjf: pushing/attaching view resources
internal void *rd_view_state_by_size(U64 size);
@@ -1143,7 +1136,7 @@ internal U64 rd_hash_from_lister_item(RD_ListerItem *item);
internal String8 rd_lister_query_word_from_input_string_off(String8 input, U64 cursor_off);
internal String8 rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off);
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg (lister)
internal RD_ListerParams rd_view_rule_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off);
internal void rd_set_autocomp_lister_query_(RD_ListerParams *params);
#define rd_set_autocomp_lister_query(...) rd_set_autocomp_lister_query_(&(RD_ListerParams){.flags = 0, __VA_ARGS__})
+8 -8
View File
@@ -451,7 +451,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
cv->center_cursor = found;
if(found == 0)
{
log_user_errorf("Could not find \"%S\"", cv->find_text_fwd);
log_user_errorf("Could not find `%S`", cv->find_text_fwd);
}
}
@@ -507,7 +507,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
cv->center_cursor = found;
if(found == 0)
{
log_user_errorf("Could not find \"%S\"", cv->find_text_bwd);
log_user_errorf("Could not find `%S`", cv->find_text_bwd);
}
}
@@ -3340,12 +3340,12 @@ RD_VIEW_UI_FUNCTION_DEF(geo3d)
//////////////////////////////
//- rjf: unpack parameters
//
U64 count = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("count")).u64;
U64 vtx_base_off = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("vtx")).u64;
U64 vtx_size = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("vtx_size")).u64;
F32 yaw_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("yaw")).f32;
F32 pitch_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("pitch")).f32;
F32 zoom_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("zoom")).f32;
U64 count = rd_value_from_eval_tag_key(eval, tag, str8_lit("count")).u64;
U64 vtx_base_off = rd_value_from_eval_tag_key(eval, tag, str8_lit("vtx")).u64;
U64 vtx_size = rd_value_from_eval_tag_key(eval, tag, str8_lit("vtx_size")).u64;
F32 yaw_target = rd_view_cfg_value_from_string(str8_lit("yaw")).f32;
F32 pitch_target = rd_view_cfg_value_from_string(str8_lit("pitch")).f32;
F32 zoom_target = rd_view_cfg_value_from_string(str8_lit("zoom")).f32;
//////////////////////////////
//- rjf: evaluate & unpack expression
+1 -1
View File
@@ -235,7 +235,7 @@ internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_Wat
////////////////////////////////
//~ rjf: View Hooks
// TODO(rjf): @cfg eliminate once we are predeclaring these with metacode
// TODO(rjf): eliminate once we are predeclaring these with metacode
RD_VIEW_UI_FUNCTION_DEF(null);
+5 -7
View File
@@ -672,8 +672,7 @@ rd_cmd_binding_buttons(String8 name)
RD_Binding binding = n->v->binding;
B32 rebinding_active_for_this_binding = (rd_state->bind_change_active &&
str8_match(rd_state->bind_change_cmd_name, name, 0) &&
rd_state->bind_change_binding.key == binding.key &&
rd_state->bind_change_binding.modifiers == binding.modifiers);
n->v->cfg_id == rd_state->bind_change_binding_id);
//- rjf: grab all conflicts
B32 has_conflicts = 0;
@@ -736,7 +735,7 @@ rd_cmd_binding_buttons(String8 name)
arena_clear(rd_state->bind_change_arena);
rd_state->bind_change_active = 1;
rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name);
rd_state->bind_change_binding = binding;
rd_state->bind_change_binding_id = n->v->cfg_id;
}
}
else if(rd_state->bind_change_active && ui_clicked(sig))
@@ -768,7 +767,7 @@ rd_cmd_binding_buttons(String8 name)
UI_Signal sig = rd_icon_button(RD_IconKind_X, 0, str8_lit("###delete_binding"));
if(ui_clicked(sig))
{
// TODO(rjf): @cfg rd_unbind_name(name, binding);
rd_cfg_release(rd_cfg_from_id(rd_state->bind_change_binding_id));
rd_state->bind_change_active = 0;
}
}
@@ -780,8 +779,7 @@ rd_cmd_binding_buttons(String8 name)
//- rjf: build "add new binding" button
B32 adding_new_binding = (rd_state->bind_change_active &&
str8_match(rd_state->bind_change_cmd_name, name, 0) &&
rd_state->bind_change_binding.key == OS_Key_Null &&
rd_state->bind_change_binding.modifiers == 0);
rd_state->bind_change_binding_id == 0);
RD_Font(RD_FontSlot_Icons) UI_TagF(adding_new_binding ? "pop" : "")
{
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
@@ -803,7 +801,7 @@ rd_cmd_binding_buttons(String8 name)
arena_clear(rd_state->bind_change_arena);
rd_state->bind_change_active = 1;
rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name);
MemoryZeroStruct(&rd_state->bind_change_binding);
rd_state->bind_change_binding_id = 0;
}
else if(rd_state->bind_change_active && ui_clicked(sig))
{