part 5: begin shifting autocompletion lister box to being unified lister/ctx-menu replacement

This commit is contained in:
Ryan Fleury
2025-01-13 14:18:34 -08:00
parent e9a10bbbd2
commit 1b52100361
4 changed files with 964 additions and 921 deletions
+885 -849
View File
File diff suppressed because it is too large Load Diff
+56 -53
View File
@@ -511,28 +511,28 @@ typedef enum RD_PaletteCode
RD_PaletteCode; RD_PaletteCode;
//////////////////////////////// ////////////////////////////////
//~ rjf: Auto-Complete Lister Types //~ rjf: Lister Types
typedef U32 RD_AutoCompListerFlags; typedef U32 RD_ListerFlags;
enum enum
{ {
RD_AutoCompListerFlag_Locals = (1<<0), RD_ListerFlag_Locals = (1<<0),
RD_AutoCompListerFlag_Registers = (1<<1), RD_ListerFlag_Registers = (1<<1),
RD_AutoCompListerFlag_ViewRules = (1<<2), RD_ListerFlag_ViewRules = (1<<2),
RD_AutoCompListerFlag_ViewRuleParams= (1<<3), RD_ListerFlag_ViewRuleParams= (1<<3),
RD_AutoCompListerFlag_Members = (1<<4), RD_ListerFlag_Members = (1<<4),
RD_AutoCompListerFlag_Globals = (1<<5), RD_ListerFlag_Globals = (1<<5),
RD_AutoCompListerFlag_ThreadLocals = (1<<6), RD_ListerFlag_ThreadLocals = (1<<6),
RD_AutoCompListerFlag_Procedures = (1<<7), RD_ListerFlag_Procedures = (1<<7),
RD_AutoCompListerFlag_Types = (1<<8), RD_ListerFlag_Types = (1<<8),
RD_AutoCompListerFlag_Languages = (1<<9), RD_ListerFlag_Languages = (1<<9),
RD_AutoCompListerFlag_Architectures = (1<<10), RD_ListerFlag_Architectures = (1<<10),
RD_AutoCompListerFlag_Tex2DFormats = (1<<11), RD_ListerFlag_Tex2DFormats = (1<<11),
RD_AutoCompListerFlag_Files = (1<<12), RD_ListerFlag_Files = (1<<12),
}; };
typedef struct RD_AutoCompListerItem RD_AutoCompListerItem; typedef struct RD_ListerItem RD_ListerItem;
struct RD_AutoCompListerItem struct RD_ListerItem
{ {
String8 string; String8 string;
String8 kind_string; String8 kind_string;
@@ -541,36 +541,42 @@ struct RD_AutoCompListerItem
B32 is_non_code; B32 is_non_code;
}; };
typedef struct RD_AutoCompListerItemChunkNode RD_AutoCompListerItemChunkNode; typedef struct RD_ListerItemChunkNode RD_ListerItemChunkNode;
struct RD_AutoCompListerItemChunkNode struct RD_ListerItemChunkNode
{ {
RD_AutoCompListerItemChunkNode *next; RD_ListerItemChunkNode *next;
RD_AutoCompListerItem *v; RD_ListerItem *v;
U64 count; U64 count;
U64 cap; U64 cap;
}; };
typedef struct RD_AutoCompListerItemChunkList RD_AutoCompListerItemChunkList; typedef struct RD_ListerItemChunkList RD_ListerItemChunkList;
struct RD_AutoCompListerItemChunkList struct RD_ListerItemChunkList
{ {
RD_AutoCompListerItemChunkNode *first; RD_ListerItemChunkNode *first;
RD_AutoCompListerItemChunkNode *last; RD_ListerItemChunkNode *last;
U64 chunk_count; U64 chunk_count;
U64 total_count; U64 total_count;
}; };
typedef struct RD_AutoCompListerItemArray RD_AutoCompListerItemArray; typedef struct RD_ListerItemArray RD_ListerItemArray;
struct RD_AutoCompListerItemArray struct RD_ListerItemArray
{ {
RD_AutoCompListerItem *v; RD_ListerItem *v;
U64 count; U64 count;
}; };
typedef struct RD_AutoCompListerParams RD_AutoCompListerParams; typedef struct RD_ListerParams RD_ListerParams;
struct RD_AutoCompListerParams struct RD_ListerParams
{ {
RD_AutoCompListerFlags flags; UI_Key anchor_key;
Vec2F32 anchor_off;
RD_ListerFlags flags;
String8List strings; String8List strings;
String8 input;
U64 cursor_off;
F32 squish;
F32 transparency;
}; };
//////////////////////////////// ////////////////////////////////
@@ -623,18 +629,15 @@ struct RD_WindowState
Arena *drop_completion_arena; Arena *drop_completion_arena;
String8List drop_completion_paths; String8List drop_completion_paths;
// rjf: autocomplete lister state // rjf: lister state
U64 autocomp_last_frame_idx; U64 lister_last_frame_idx;
B32 autocomp_input_dirty; B32 lister_input_dirty;
UI_Key autocomp_root_key; Arena *lister_params_arena;
Arena *autocomp_lister_params_arena; RD_ListerParams lister_params;
RD_AutoCompListerParams autocomp_lister_params; U8 lister_input_buffer[1024];
U64 autocomp_cursor_off; U64 lister_input_size;
U8 autocomp_lister_input_buffer[1024]; F32 lister_open_t;
U64 autocomp_lister_input_size; F32 lister_num_visible_rows_t;
F32 autocomp_open_t;
F32 autocomp_num_visible_rows_t;
S64 autocomp_cursor_num;
// rjf: query view stack // rjf: query view stack
U64 query_cmd_gen; U64 query_cmd_gen;
@@ -849,7 +852,6 @@ struct RD_State
RD_WindowStateSlot *window_state_slots; RD_WindowStateSlot *window_state_slots;
RD_WindowState *free_window_state; RD_WindowState *free_window_state;
RD_Handle last_focused_window; RD_Handle last_focused_window;
// TODO(rjf): @cfg must be nil-initialized
RD_WindowState *first_window_state; RD_WindowState *first_window_state;
RD_WindowState *last_window_state; RD_WindowState *last_window_state;
@@ -1267,17 +1269,18 @@ internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U
internal void rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 string); internal void rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 string);
//////////////////////////////// ////////////////////////////////
//~ rjf: Auto-Complete Lister //~ rjf: Lister
internal void rd_autocomp_lister_item_chunk_list_push(Arena *arena, RD_AutoCompListerItemChunkList *list, U64 cap, RD_AutoCompListerItem *item); internal void rd_lister_item_chunk_list_push(Arena *arena, RD_ListerItemChunkList *list, U64 cap, RD_ListerItem *item);
internal RD_AutoCompListerItemArray rd_autocomp_lister_item_array_from_chunk_list(Arena *arena, RD_AutoCompListerItemChunkList *list); internal RD_ListerItemArray rd_lister_item_array_from_chunk_list(Arena *arena, RD_ListerItemChunkList *list);
internal int rd_autocomp_lister_item_qsort_compare(RD_AutoCompListerItem *a, RD_AutoCompListerItem *b); internal int rd_lister_item_qsort_compare(RD_ListerItem *a, RD_ListerItem *b);
internal void rd_autocomp_lister_item_array_sort__in_place(RD_AutoCompListerItemArray *array); internal void rd_lister_item_array_sort__in_place(RD_ListerItemArray *array);
internal String8 rd_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off); internal String8 rd_lister_query_word_from_input_string_off(String8 input, U64 cursor_off);
internal String8 rd_autocomp_query_path_from_input_string_off(String8 input, U64 cursor_off); internal String8 rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off);
internal RD_AutoCompListerParams rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); 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(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off); internal void rd_set_lister_query_(RD_ListerParams *params);
#define rd_set_lister_query(...) rd_set_lister_query_(&(RD_ListerParams){.flags = 0, __VA_ARGS__})
//////////////////////////////// ////////////////////////////////
//~ rjf: Search Strings //~ rjf: Search Strings
+21 -17
View File
@@ -1704,7 +1704,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
if(autocomplete_hint_string.size != 0) if(autocomplete_hint_string.size != 0)
{ {
take_autocomplete = 1; take_autocomplete = 1;
String8 word_query = rd_autocomp_query_word_from_input_string_off(string, edit_state->cursor.column-1); String8 word_query = rd_lister_query_word_from_input_string_off(string, edit_state->cursor.column-1);
U64 word_off = (U64)(word_query.str - string.str); U64 word_off = (U64)(word_query.str - string.str);
String8 new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); String8 new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string);
new_string.size = Min(sizeof(edit_state->input_buffer), new_string.size); new_string.size = Min(sizeof(edit_state->input_buffer), new_string.size);
@@ -2892,7 +2892,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
String8 cell_inheritance_string = {0}; String8 cell_inheritance_string = {0};
String8 cell_error_string = {0}; String8 cell_error_string = {0};
String8 cell_error_tooltip_string = {0}; String8 cell_error_tooltip_string = {0};
RD_AutoCompListerFlags cell_autocomp_flags = 0; RD_ListerFlags cell_autocomp_flags = 0;
RD_ViewRuleUIFunctionType *cell_ui_hook = 0; RD_ViewRuleUIFunctionType *cell_ui_hook = 0;
MD_Node *cell_ui_params = &md_nil_node; MD_Node *cell_ui_params = &md_nil_node;
Vec4F32 cell_base_color = ui_top_palette()->text; Vec4F32 cell_base_color = ui_top_palette()->text;
@@ -2908,11 +2908,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{ {
cell_matches = fuzzy_match_find(scratch.arena, filter, ev_expr_string_from_row(scratch.arena, row, string_flags)); cell_matches = fuzzy_match_find(scratch.arena, filter, ev_expr_string_from_row(scratch.arena, row, string_flags));
} }
cell_autocomp_flags = (RD_AutoCompListerFlag_Locals| cell_autocomp_flags = (RD_ListerFlag_Locals|
RD_AutoCompListerFlag_Procedures| RD_ListerFlag_Procedures|
RD_AutoCompListerFlag_Globals| RD_ListerFlag_Globals|
RD_AutoCompListerFlag_ThreadLocals| RD_ListerFlag_ThreadLocals|
RD_AutoCompListerFlag_Types); RD_ListerFlag_Types);
if(row->member != 0 && row->member->inheritance_key_chain.first != 0) if(row->member != 0 && row->member->inheritance_key_chain.first != 0)
{ {
String8List inheritance_chain_type_names = {0}; String8List inheritance_chain_type_names = {0};
@@ -2964,14 +2964,14 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{ {
cell_error_tooltip_string = str8_lit("Could not read memory successfully."); cell_error_tooltip_string = str8_lit("Could not read memory successfully.");
} }
cell_autocomp_flags = (RD_AutoCompListerFlag_Locals| cell_autocomp_flags = (RD_ListerFlag_Locals|
RD_AutoCompListerFlag_Procedures| RD_ListerFlag_Procedures|
RD_AutoCompListerFlag_Globals| RD_ListerFlag_Globals|
RD_AutoCompListerFlag_ThreadLocals| RD_ListerFlag_ThreadLocals|
RD_AutoCompListerFlag_Types); RD_ListerFlag_Types);
if(cell_type->flags & E_TypeFlag_IsPathText) if(cell_type->flags & E_TypeFlag_IsPathText)
{ {
cell_autocomp_flags = RD_AutoCompListerFlag_Files; cell_autocomp_flags = RD_ListerFlag_Files;
} }
if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell) if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell)
{ {
@@ -2997,7 +2997,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
case RD_WatchViewColumnKind_ViewRule: case RD_WatchViewColumnKind_ViewRule:
{ {
cell_can_edit = 1; cell_can_edit = 1;
cell_autocomp_flags = RD_AutoCompListerFlag_ViewRules; cell_autocomp_flags = RD_ListerFlag_ViewRules;
if(cell_pre_edit_string.size == 0) if(cell_pre_edit_string.size == 0)
{ {
EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(scratch.arena, row_eval.type_key, 0, 1); EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(scratch.arena, row_eval.type_key, 0, 1);
@@ -3158,16 +3158,20 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark)) txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark))
{ {
String8 input = str8(cell_edit_state->input_buffer, cell_edit_state->input_size); String8 input = str8(cell_edit_state->input_buffer, cell_edit_state->input_size);
RD_AutoCompListerParams params = {cell_autocomp_flags}; RD_ListerParams params = {cell_autocomp_flags};
if(col->kind == RD_WatchViewColumnKind_ViewRule) if(col->kind == RD_WatchViewColumnKind_ViewRule)
{ {
params = rd_view_rule_autocomp_lister_params_from_input_cursor(scratch.arena, input, cell_edit_state->cursor.column-1); params = rd_view_rule_lister_params_from_input_cursor(scratch.arena, input, cell_edit_state->cursor.column-1);
if(params.flags == 0) if(params.flags == 0)
{ {
params.flags = cell_autocomp_flags; params.flags = cell_autocomp_flags;
} }
} }
rd_set_autocomp_lister_query(sig.box->key, &params, input, cell_edit_state->cursor.column-1); params.anchor_key = sig.box->key;
params.anchor_off = v2f32(0, dim_2f32(sig.box->rect).y);
params.input = input;
params.cursor_off = cell_edit_state->cursor.column-1;
rd_set_lister_query_(&params);
} }
} }
} }
+2 -2
View File
@@ -2575,7 +2575,7 @@ rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx
// rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op // rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op
if(autocomplete_hint_string.size != 0) if(autocomplete_hint_string.size != 0)
{ {
String8 word_query = rd_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); String8 word_query = rd_lister_query_word_from_input_string_off(edit_string, cursor->column-1);
U64 word_off = (U64)(word_query.str - edit_string.str); U64 word_off = (U64)(word_query.str - edit_string.str);
String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string);
new_string.size = Min(edit_buffer_size, new_string.size); new_string.size = Min(edit_buffer_size, new_string.size);
@@ -2678,7 +2678,7 @@ rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx
DR_FancyStringList code_fancy_strings = rd_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, ui_top_palette()->text, edit_string); DR_FancyStringList code_fancy_strings = rd_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, ui_top_palette()->text, edit_string);
if(autocomplete_hint_string.size != 0) if(autocomplete_hint_string.size != 0)
{ {
String8 query_word = rd_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); String8 query_word = rd_lister_query_word_from_input_string_off(edit_string, cursor->column-1);
String8 autocomplete_append_string = str8_skip(autocomplete_hint_string, query_word.size); String8 autocomplete_append_string = str8_skip(autocomplete_hint_string, query_word.size);
U64 off = 0; U64 off = 0;
U64 cursor_off = cursor->column-1; U64 cursor_off = cursor->column-1;