extend autocompletion lister to support path autocompletion; use in cases where a watch window view is editing a path-tagged type

This commit is contained in:
Ryan Fleury
2024-10-09 11:18:46 -07:00
parent b960935315
commit bd87c109b5
4 changed files with 164 additions and 127 deletions
+2 -5
View File
@@ -1692,11 +1692,8 @@ raw_from_escaped_str8(Arena *arena, String8 string)
} }
String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1)); String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1));
str8_list_push(scratch.arena, &strs, replace_string); str8_list_push(scratch.arena, &strs, replace_string);
if(replace_byte == '\\' || replace_byte == '"' || replace_byte == '\'') idx += 1;
{ start += 1;
idx += 1;
start += 1;
}
} }
} }
String8 result = str8_list_join(arena, &strs, 0); String8 result = str8_list_join(arena, &strs, 0);
+151 -114
View File
@@ -2425,15 +2425,24 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string)
direct_type_kind == E_TypeKind_UChar8 || direct_type_kind == E_TypeKind_UChar8 ||
e_type_kind_is_integer(direct_type_kind)) e_type_kind_is_integer(direct_type_kind))
{ {
B32 is_quoted = 0;
if(string.size >= 1 && string.str[0] == '"') if(string.size >= 1 && string.str[0] == '"')
{ {
string = str8_skip(string, 1); string = str8_skip(string, 1);
is_quoted = 1;
} }
if(string.size >= 1 && string.str[string.size-1] == '"') if(string.size >= 1 && string.str[string.size-1] == '"')
{ {
string = str8_chop(string, 1); string = str8_chop(string, 1);
} }
commit_data = raw_from_escaped_str8(scratch.arena, string); if(is_quoted)
{
commit_data = raw_from_escaped_str8(scratch.arena, string);
}
else
{
commit_data = push_str8_copy(scratch.arena, string);
}
commit_data.size += 1; commit_data.size += 1;
if(type_kind == E_TypeKind_Ptr) if(type_kind == E_TypeKind_Ptr)
{ {
@@ -4325,9 +4334,11 @@ rd_window_frame(RD_Window *ws)
//- rjf: build auto-complete lister //- rjf: build auto-complete lister
// //
ProfScope("build autocomplete lister") ProfScope("build autocomplete lister")
if(!ws->autocomp_force_closed && !ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= rd_state->frame_index) if(!ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= rd_state->frame_index)
{ {
String8 query = str8(ws->autocomp_lister_query_buffer, ws->autocomp_lister_query_size); String8 input = str8(ws->autocomp_lister_input_buffer, ws->autocomp_lister_input_size);
String8 query_word = rd_autocomp_query_word_from_input_string_off(input, ws->autocomp_cursor_off);
String8 query_path = rd_autocomp_query_path_from_input_string_off(input, ws->autocomp_cursor_off);
UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key);
if(!ui_box_is_nil(autocomp_root_box)) if(!ui_box_is_nil(autocomp_root_box))
{ {
@@ -4371,9 +4382,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = n->string; item.string = n->string;
item.kind_string = str8_lit("Local"); item.kind_string = str8_lit("Local");
item.matches = fuzzy_match_find(scratch.arena, query, n->string); item.matches = fuzzy_match_find(scratch.arena, query_word, n->string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4384,9 +4395,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = n->string; item.string = n->string;
item.kind_string = str8_lit("Local (Member)"); item.kind_string = str8_lit("Local (Member)");
item.matches = fuzzy_match_find(scratch.arena, query, n->string); item.matches = fuzzy_match_find(scratch.arena, query_word, n->string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4409,9 +4420,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = reg_names[idx]; item.string = reg_names[idx];
item.kind_string = str8_lit("Register"); item.kind_string = str8_lit("Register");
item.matches = fuzzy_match_find(scratch.arena, query, reg_names[idx]); item.matches = fuzzy_match_find(scratch.arena, query_word, reg_names[idx]);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4425,9 +4436,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = alias_names[idx]; item.string = alias_names[idx];
item.kind_string = str8_lit("Reg. Alias"); item.kind_string = str8_lit("Reg. Alias");
item.matches = fuzzy_match_find(scratch.arena, query, alias_names[idx]); item.matches = fuzzy_match_find(scratch.arena, query_word, alias_names[idx]);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4446,9 +4457,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = spec->info.string; item.string = spec->info.string;
item.kind_string = str8_lit("View Rule"); item.kind_string = str8_lit("View Rule");
item.matches = fuzzy_match_find(scratch.arena, query, spec->info.string); item.matches = fuzzy_match_find(scratch.arena, query_word, spec->info.string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4463,7 +4474,7 @@ rd_window_frame(RD_Window *ws)
} }
//- rjf: gather globals //- rjf: gather globals
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Globals && query.size != 0) if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Globals && query_word.size != 0)
{ {
U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_globals_fzy_key"))}; U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_globals_fzy_key"))};
FZY_Params fzy_params = FZY_Params fzy_params =
@@ -4472,7 +4483,7 @@ rd_window_frame(RD_Window *ws)
dbgi_keys, dbgi_keys,
}; };
B32 is_stale = 0; B32 is_stale = 0;
FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query, 0, &is_stale); FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query_word, 0, &is_stale);
for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1)
{ {
// rjf: determine dbgi/rdi to which this item belongs // rjf: determine dbgi/rdi to which this item belongs
@@ -4510,7 +4521,7 @@ rd_window_frame(RD_Window *ws)
} }
//- rjf: gather thread locals //- rjf: gather thread locals
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_ThreadLocals && query.size != 0) if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_ThreadLocals && query_word.size != 0)
{ {
U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_tvars_fzy_key"))}; U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_tvars_fzy_key"))};
FZY_Params fzy_params = FZY_Params fzy_params =
@@ -4519,7 +4530,7 @@ rd_window_frame(RD_Window *ws)
dbgi_keys, dbgi_keys,
}; };
B32 is_stale = 0; B32 is_stale = 0;
FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query, 0, &is_stale); FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query_word, 0, &is_stale);
for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1)
{ {
// rjf: determine dbgi/rdi to which this item belongs // rjf: determine dbgi/rdi to which this item belongs
@@ -4557,7 +4568,7 @@ rd_window_frame(RD_Window *ws)
} }
//- rjf: gather procedures //- rjf: gather procedures
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Procedures && query.size != 0) if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Procedures && query_word.size != 0)
{ {
U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_procedures_fzy_key"))}; U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_procedures_fzy_key"))};
FZY_Params fzy_params = FZY_Params fzy_params =
@@ -4566,7 +4577,7 @@ rd_window_frame(RD_Window *ws)
dbgi_keys, dbgi_keys,
}; };
B32 is_stale = 0; B32 is_stale = 0;
FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query, 0, &is_stale); FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query_word, 0, &is_stale);
for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1)
{ {
// rjf: determine dbgi/rdi to which this item belongs // rjf: determine dbgi/rdi to which this item belongs
@@ -4604,7 +4615,7 @@ rd_window_frame(RD_Window *ws)
} }
//- rjf: gather types //- rjf: gather types
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Types && query.size != 0) if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Types && query_word.size != 0)
{ {
U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_types_fzy_key"))}; U128 fzy_key = {d_hash_from_string(str8_lit("autocomp_types_fzy_key"))};
FZY_Params fzy_params = FZY_Params fzy_params =
@@ -4613,7 +4624,7 @@ rd_window_frame(RD_Window *ws)
dbgi_keys, dbgi_keys,
}; };
B32 is_stale = 0; B32 is_stale = 0;
FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query, 0, &is_stale); FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fzy_key, &fzy_params, query_word, 0, &is_stale);
for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1)
{ {
// rjf: determine dbgi/rdi to which this item belongs // rjf: determine dbgi/rdi to which this item belongs
@@ -4659,9 +4670,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = txt_extension_from_lang_kind(lang); item.string = txt_extension_from_lang_kind(lang);
item.kind_string = str8_lit("Language"); item.kind_string = str8_lit("Language");
item.matches = fuzzy_match_find(scratch.arena, query, item.string); item.matches = fuzzy_match_find(scratch.arena, query_word, item.string);
} }
if(item.string.size != 0 && (query.size == 0 || item.matches.count != 0)) if(item.string.size != 0 && (query_word.size == 0 || item.matches.count != 0))
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4677,9 +4688,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = string_from_arch(arch); item.string = string_from_arch(arch);
item.kind_string = str8_lit("Arch"); item.kind_string = str8_lit("Arch");
item.matches = fuzzy_match_find(scratch.arena, query, item.string); item.matches = fuzzy_match_find(scratch.arena, query_word, item.string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4695,9 +4706,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]); item.string = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]);
item.kind_string = str8_lit("Format"); item.kind_string = str8_lit("Format");
item.matches = fuzzy_match_find(scratch.arena, query, item.string); item.matches = fuzzy_match_find(scratch.arena, query_word, item.string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4714,9 +4725,9 @@ rd_window_frame(RD_Window *ws)
{ {
item.string = string; item.string = string;
item.kind_string = str8_lit("Parameter"); item.kind_string = str8_lit("Parameter");
item.matches = fuzzy_match_find(scratch.arena, query, item.string); item.matches = fuzzy_match_find(scratch.arena, query_word, item.string);
} }
if(query.size == 0 || item.matches.count != 0) if(query_word.size == 0 || item.matches.count != 0)
{ {
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
} }
@@ -4724,83 +4735,79 @@ rd_window_frame(RD_Window *ws)
} }
//- rjf: gather files //- rjf: gather files
if(0) if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Files)
{ {
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Files) // rjf: find containing directory in query_path
String8 dir_str_in_input = {0};
for(U64 i = 0; i < query_path.size; i += 1)
{ {
// rjf: find containing directory in query String8 substr1 = str8_substr(query_path, r1u64(i, i+1));
String8 dir_str_in_input = {0}; String8 substr2 = str8_substr(query_path, r1u64(i, i+2));
for(U64 i = 0; i < query.size; i += 1) String8 substr3 = str8_substr(query_path, r1u64(i, i+3));
if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive))
{ {
String8 substr1 = str8_substr(query, r1u64(i, i+1)); dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size));
String8 substr2 = str8_substr(query, r1u64(i, i+2)); }
String8 substr3 = str8_substr(query, r1u64(i, i+3)); else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive))
if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) {
{ dir_str_in_input = str8_substr(query_path, r1u64(i-1, query_path.size));
dir_str_in_input = str8_substr(query, r1u64(i, query.size)); }
} else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive))
else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) {
{ dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size));
dir_str_in_input = str8_substr(query, r1u64(i-1, query.size)); }
} else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive))
else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) {
{ dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size));
dir_str_in_input = str8_substr(query, r1u64(i, query.size));
}
else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive))
{
dir_str_in_input = str8_substr(query, r1u64(i, query.size));
}
if(dir_str_in_input.size != 0)
{
break;
}
} }
// rjf: use query string to form various parts of search space
String8 prefix = {0};
String8 path = {0};
String8 search = {0};
if(dir_str_in_input.size != 0) if(dir_str_in_input.size != 0)
{ {
String8 dir = dir_str_in_input; break;
String8 search = {0};
U64 one_past_last_slash = dir.size;
for(U64 i = 0; i < dir_str_in_input.size; i += 1)
{
if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\')
{
one_past_last_slash = i+1;
}
}
dir.size = one_past_last_slash;
search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size));
path = dir;
search = search;
prefix = str8_substr(query, r1u64(0, path.str - query.str));
} }
// rjf: get current files, filtered
B32 dir_selection = 1;
OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0);
for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);)
{
FuzzyMatchRangeList match_ranges = fuzzy_match_find(scratch.arena, search, info.name);
B32 fits_search = (search.size == 0 || match_ranges.count == match_ranges.needle_part_count);
B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection;
if(fits_search && fits_dir_only)
{
RD_AutoCompListerItem item = {0};
{
item.string = info.name;
item.kind_string = str8_lit("File");
item.matches = match_ranges;
}
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
}
}
os_file_iter_end(it);
} }
// rjf: use query_path string to form various parts of search space
String8 prefix = {0};
String8 path = {0};
String8 search = {0};
if(dir_str_in_input.size != 0)
{
String8 dir = dir_str_in_input;
U64 one_past_last_slash = dir.size;
for(U64 i = 0; i < dir_str_in_input.size; i += 1)
{
if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\')
{
one_past_last_slash = i+1;
}
}
dir.size = one_past_last_slash;
path = dir;
search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size));
prefix = str8_substr(query_path, r1u64(0, path.str - query_path.str));
}
// rjf: get current files, filtered
B32 allow_dirs = 1;
OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0);
for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);)
{
FuzzyMatchRangeList match_ranges = fuzzy_match_find(scratch.arena, search, info.name);
B32 fits_search = (search.size == 0 || match_ranges.count == match_ranges.needle_part_count);
B32 fits_dir_only = (allow_dirs || !(info.props.flags & FilePropertyFlag_IsFolder));
if(fits_search && fits_dir_only)
{
RD_AutoCompListerItem item = {0};
{
item.string = info.props.flags & FilePropertyFlag_IsFolder ? push_str8f(scratch.arena, "%S/", info.name) : info.name;
item.kind_string = info.props.flags & FilePropertyFlag_IsFolder ? str8_lit("Folder") : str8_lit("File");
item.matches = match_ranges;
item.is_non_code = 1;
}
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
}
}
os_file_iter_end(it);
} }
} }
@@ -4868,9 +4875,9 @@ rd_window_frame(RD_Window *ws)
UI_BoxFlag_DrawDropShadow| UI_BoxFlag_DrawDropShadow|
UI_BoxFlag_DrawBackground, UI_BoxFlag_DrawBackground,
"autocomp_box"); "autocomp_box");
if(ws->autocomp_query_dirty) if(ws->autocomp_input_dirty)
{ {
ws->autocomp_query_dirty = 0; ws->autocomp_input_dirty = 0;
autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero(); autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero();
} }
} }
@@ -4889,9 +4896,9 @@ rd_window_frame(RD_Window *ws)
UI_Box *item_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects|UI_BoxFlag_MouseClickable, "autocomp_%I64x", idx); UI_Box *item_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects|UI_BoxFlag_MouseClickable, "autocomp_%I64x", idx);
UI_Parent(item_box) UI_Padding(ui_em(1.f, 1.f)) UI_Parent(item_box) UI_Padding(ui_em(1.f, 1.f))
{ {
UI_WidthFill UI_WidthFill RD_Font(item->is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code)
{ {
UI_Box *box = rd_code_label(1.f, 0, ui_top_palette()->text, item->string); UI_Box *box = item->is_non_code ? ui_label(item->string).box : rd_code_label(1.f, 0, ui_top_palette()->text, item->string);
ui_box_equip_fuzzy_match_ranges(box, &item->matches); ui_box_equip_fuzzy_match_ranges(box, &item->matches);
} }
RD_Font(RD_FontSlot_Main) RD_Font(RD_FontSlot_Main)
@@ -4905,7 +4912,7 @@ rd_window_frame(RD_Window *ws)
UI_Event move_back_evt = zero_struct; UI_Event move_back_evt = zero_struct;
move_back_evt.kind = UI_EventKind_Navigate; move_back_evt.kind = UI_EventKind_Navigate;
move_back_evt.flags = UI_EventFlag_KeepMark; move_back_evt.flags = UI_EventFlag_KeepMark;
move_back_evt.delta_2s32.x = -(S32)query.size; move_back_evt.delta_2s32.x = -(S32)query_word.size;
ui_event_list_push(ui_build_arena(), &ws->ui_events, &move_back_evt); ui_event_list_push(ui_build_arena(), &ws->ui_events, &move_back_evt);
UI_Event paste_evt = zero_struct; UI_Event paste_evt = zero_struct;
paste_evt.kind = UI_EventKind_Text; paste_evt.kind = UI_EventKind_Text;
@@ -9245,6 +9252,40 @@ rd_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off)
return query; return query;
} }
internal String8
rd_autocomp_query_path_from_input_string_off(String8 input, U64 cursor_off)
{
// rjf: find start of path
U64 path_start_off = 0;
{
B32 single_quoted = 0;
B32 double_quoted = 0;
for(U64 off = 0; off < input.size && off < cursor_off; off += 1)
{
if(input.str[off] == '\'')
{
single_quoted ^= 1;
}
if(input.str[off] == '\"')
{
double_quoted ^= 1;
}
if(char_is_space(input.str[off]) && !single_quoted && !double_quoted)
{
path_start_off = off+1;
}
}
}
// rjf: form path
String8 path = str8_skip(str8_prefix(input, cursor_off), path_start_off);
if(path.size >= 1 && path.str[0] == '"') { path = str8_skip(path, 1); }
if(path.size >= 1 && path.str[0] == '\'') { path = str8_skip(path, 1); }
if(path.size >= 1 && path.str[path.size-1] == '"') { path = str8_chop(path, 1); }
if(path.size >= 1 && path.str[path.size-1] == '\'') { path = str8_chop(path, 1); }
return path;
}
internal RD_AutoCompListerParams internal RD_AutoCompListerParams
rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off) rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off)
{ {
@@ -9391,26 +9432,18 @@ internal void
rd_set_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off) rd_set_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off)
{ {
RD_Window *window = rd_window_from_handle(rd_regs()->window); RD_Window *window = rd_window_from_handle(rd_regs()->window);
String8 query = rd_autocomp_query_word_from_input_string_off(input, cursor_off);
String8 current_query = str8(window->autocomp_lister_query_buffer, window->autocomp_lister_query_size);
if(cursor_off != window->autocomp_cursor_off) if(cursor_off != window->autocomp_cursor_off)
{ {
window->autocomp_query_dirty = 1; window->autocomp_input_dirty = 1;
window->autocomp_cursor_off = cursor_off; window->autocomp_cursor_off = cursor_off;
} }
if(!str8_match(query, current_query, 0))
{
window->autocomp_force_closed = 0;
}
if(!ui_key_match(window->autocomp_root_key, root_key)) if(!ui_key_match(window->autocomp_root_key, root_key))
{ {
window->autocomp_force_closed = 0;
window->autocomp_num_visible_rows_t = 0; window->autocomp_num_visible_rows_t = 0;
window->autocomp_open_t = 0; window->autocomp_open_t = 0;
} }
if(window->autocomp_last_frame_idx+1 < rd_state->frame_index) if(window->autocomp_last_frame_idx+1 < rd_state->frame_index)
{ {
window->autocomp_force_closed = 0;
window->autocomp_num_visible_rows_t = 0; window->autocomp_num_visible_rows_t = 0;
window->autocomp_open_t = 0; window->autocomp_open_t = 0;
} }
@@ -9418,8 +9451,8 @@ rd_set_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, S
arena_clear(window->autocomp_lister_params_arena); arena_clear(window->autocomp_lister_params_arena);
MemoryCopyStruct(&window->autocomp_lister_params, params); MemoryCopyStruct(&window->autocomp_lister_params, params);
window->autocomp_lister_params.strings = str8_list_copy(window->autocomp_lister_params_arena, &window->autocomp_lister_params.strings); window->autocomp_lister_params.strings = str8_list_copy(window->autocomp_lister_params_arena, &window->autocomp_lister_params.strings);
window->autocomp_lister_query_size = Min(query.size, sizeof(window->autocomp_lister_query_buffer)); window->autocomp_lister_input_size = Min(input.size, sizeof(window->autocomp_lister_input_buffer));
MemoryCopy(window->autocomp_lister_query_buffer, query.str, window->autocomp_lister_query_size); MemoryCopy(window->autocomp_lister_input_buffer, input.str, window->autocomp_lister_input_size);
window->autocomp_last_frame_idx = rd_state->frame_index; window->autocomp_last_frame_idx = rd_state->frame_index;
} }
@@ -13150,6 +13183,10 @@ rd_frame(void)
if(ws->focused_panel == panel) if(ws->focused_panel == panel)
{ {
ws->focused_panel = next; ws->focused_panel = next;
for(RD_Panel *grandchild = ws->focused_panel; !rd_panel_is_nil(grandchild); grandchild = grandchild->first)
{
ws->focused_panel = grandchild;
}
} }
for(RD_Panel *child = parent->first; !rd_panel_is_nil(child); child = child->next) for(RD_Panel *child = parent->first; !rd_panel_is_nil(child); child = child->next)
{ {
+5 -4
View File
@@ -595,6 +595,7 @@ struct RD_AutoCompListerItem
String8 kind_string; String8 kind_string;
FuzzyMatchRangeList matches; FuzzyMatchRangeList matches;
U64 group; U64 group;
B32 is_non_code;
}; };
typedef struct RD_AutoCompListerItemChunkNode RD_AutoCompListerItemChunkNode; typedef struct RD_AutoCompListerItemChunkNode RD_AutoCompListerItemChunkNode;
@@ -675,14 +676,13 @@ struct RD_Window
// rjf: autocomplete lister state // rjf: autocomplete lister state
U64 autocomp_last_frame_idx; U64 autocomp_last_frame_idx;
B32 autocomp_force_closed; B32 autocomp_input_dirty;
B32 autocomp_query_dirty;
UI_Key autocomp_root_key; UI_Key autocomp_root_key;
Arena *autocomp_lister_params_arena; Arena *autocomp_lister_params_arena;
RD_AutoCompListerParams autocomp_lister_params; RD_AutoCompListerParams autocomp_lister_params;
U64 autocomp_cursor_off; U64 autocomp_cursor_off;
U8 autocomp_lister_query_buffer[1024]; U8 autocomp_lister_input_buffer[1024];
U64 autocomp_lister_query_size; U64 autocomp_lister_input_size;
F32 autocomp_open_t; F32 autocomp_open_t;
F32 autocomp_num_visible_rows_t; F32 autocomp_num_visible_rows_t;
S64 autocomp_cursor_num; S64 autocomp_cursor_num;
@@ -1333,6 +1333,7 @@ internal int rd_autocomp_lister_item_qsort_compare(RD_AutoCompListerItem *a, RD_
internal void rd_autocomp_lister_item_array_sort__in_place(RD_AutoCompListerItemArray *array); internal void rd_autocomp_lister_item_array_sort__in_place(RD_AutoCompListerItemArray *array);
internal String8 rd_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off); internal String8 rd_autocomp_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 RD_AutoCompListerParams rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); internal RD_AutoCompListerParams rd_view_rule_autocomp_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_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off);
+6 -4
View File
@@ -2735,8 +2735,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
RD_AutoCompListerFlag_Procedures| RD_AutoCompListerFlag_Procedures|
RD_AutoCompListerFlag_Globals| RD_AutoCompListerFlag_Globals|
RD_AutoCompListerFlag_ThreadLocals| RD_AutoCompListerFlag_ThreadLocals|
RD_AutoCompListerFlag_Types| RD_AutoCompListerFlag_Types);
RD_AutoCompListerFlag_Files);
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};
@@ -2790,8 +2789,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
RD_AutoCompListerFlag_Procedures| RD_AutoCompListerFlag_Procedures|
RD_AutoCompListerFlag_Globals| RD_AutoCompListerFlag_Globals|
RD_AutoCompListerFlag_ThreadLocals| RD_AutoCompListerFlag_ThreadLocals|
RD_AutoCompListerFlag_Types| RD_AutoCompListerFlag_Types);
RD_AutoCompListerFlag_Files); if(row_type->flags & E_TypeFlag_IsPathText)
{
cell_autocomp_flags = RD_AutoCompListerFlag_Files;
}
if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell) if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell)
{ {
cell_ui_hook = ui_view_rule_info->ui; cell_ui_hook = ui_view_rule_info->ui;