more convergence / fixes relating to searching/queries/filters

This commit is contained in:
Ryan Fleury
2025-02-21 16:33:57 -08:00
parent 9b636568fd
commit 1b4a5e529f
5 changed files with 141 additions and 102 deletions
+12 -4
View File
@@ -819,12 +819,20 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out)
op_info->sep, op_info->sep,
op_info->post, op_info->post,
}; };
U64 idx = 0; U64 sep_idx = 0;
for(E_Expr *child = expr->first;; child = child->next, idx += 1) for(E_Expr *child = expr->first;; child = child->next)
{ {
if(seps[idx].size != 0) if(seps[sep_idx].size != 0)
{ {
str8_list_push(arena, out, seps[idx]); if(sep_idx == 1 && child == &e_expr_nil)
{
sep_idx += 1;
}
str8_list_push(arena, out, seps[sep_idx]);
if(sep_idx == 0)
{
sep_idx += 1;
}
} }
if(child == &e_expr_nil) if(child == &e_expr_nil)
{ {
+74 -64
View File
@@ -1443,6 +1443,8 @@ rd_cfg_newf(RD_Cfg *parent, char *fmt, ...)
internal RD_Cfg * internal RD_Cfg *
rd_cfg_new_replace(RD_Cfg *parent, String8 string) rd_cfg_new_replace(RD_Cfg *parent, String8 string)
{ {
Temp scratch = scratch_begin(0, 0);
string = push_str8_copy(scratch.arena, string);
for(RD_Cfg *child = parent->first->next, *next = &rd_nil_cfg; child != &rd_nil_cfg; child = next) for(RD_Cfg *child = parent->first->next, *next = &rd_nil_cfg; child != &rd_nil_cfg; child = next)
{ {
next = child->next; next = child->next;
@@ -1454,6 +1456,7 @@ rd_cfg_new_replace(RD_Cfg *parent, String8 string)
} }
RD_Cfg *child = parent->first; RD_Cfg *child = parent->first;
rd_cfg_equip_string(child, string); rd_cfg_equip_string(child, string);
scratch_end(scratch);
return child; return child;
} }
@@ -3354,7 +3357,7 @@ rd_view_ui(Rng2F32 rect)
RD_Cfg *input_root = rd_cfg_child_from_string(query_root, str8_lit("input")); RD_Cfg *input_root = rd_cfg_child_from_string(query_root, str8_lit("input"));
RD_Cfg *cmd_root = rd_cfg_child_from_string(query_root, str8_lit("cmd")); RD_Cfg *cmd_root = rd_cfg_child_from_string(query_root, str8_lit("cmd"));
String8 current_input = input_root->first->string; String8 current_input = input_root->first->string;
B32 search_row_is_open = (vs->query_is_selected || current_input.size != 0); B32 search_row_is_open = (vs->query_is_selected);
F32 search_row_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "search_row_open_%p", view), (F32)!!search_row_is_open, .initial = (F32)!!search_row_is_open); F32 search_row_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "search_row_open_%p", view), (F32)!!search_row_is_open, .initial = (F32)!!search_row_is_open);
if(search_row_open_t > 0.001f) if(search_row_open_t > 0.001f)
{ {
@@ -3412,11 +3415,14 @@ rd_view_ui(Rng2F32 rect)
params.edit_buffer_size = sizeof(vs->query_buffer); params.edit_buffer_size = sizeof(vs->query_buffer);
params.pre_edit_value = current_input; params.pre_edit_value = current_input;
} }
UI_Signal sig = rd_line_editf(&params, "###search"); UI_Transparency(1-search_row_open_t)
if(ui_pressed(sig))
{ {
vs->query_is_selected = 1; UI_Signal sig = rd_line_editf(&params, "###search");
rd_cmd(RD_CmdKind_FocusPanel); if(ui_pressed(sig))
{
vs->query_is_selected = 1;
rd_cmd(RD_CmdKind_FocusPanel);
}
} }
} }
@@ -5389,7 +5395,7 @@ rd_view_ui(Rng2F32 rect)
} }
} }
// rjf: can't edit, but has cfg location info? -> find // rjf: can't edit, but has cfg? -> find or select
else if(cell_info.eval.space.kind == RD_EvalSpaceKind_MetaCfg) else if(cell_info.eval.space.kind == RD_EvalSpaceKind_MetaCfg)
{ {
RD_Cfg *cfg = rd_cfg_from_eval_space(cell_info.eval.space); RD_Cfg *cfg = rd_cfg_from_eval_space(cell_info.eval.space);
@@ -5403,6 +5409,24 @@ rd_view_ui(Rng2F32 rect)
U64 value = e_value_from_string(loc.expr).u64; U64 value = e_value_from_string(loc.expr).u64;
rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = value); rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = value);
} }
else if(str8_match(cfg->string, str8_lit("target"), 0) && sig.event_flags & OS_Modifier_Ctrl)
{
rd_cmd(RD_CmdKind_EnableCfg, .cfg = cfg->id);
}
else if(str8_match(cfg->string, str8_lit("target"), 0))
{
rd_cmd(RD_CmdKind_SelectCfg, .cfg = cfg->id);
}
}
// rjf: can't edit, but has thread? -> select
else if(cell_info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
{
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(cell_info.eval.space);
if(entity->kind == CTRL_EntityKind_Thread)
{
rd_cmd(RD_CmdKind_SelectThread, .thread = entity->handle);
}
} }
} }
@@ -11515,23 +11539,6 @@ rd_set_autocomp_lister_query_(RD_Regs *regs)
ws->autocomp_lister_last_frame_idx = rd_state->frame_index; ws->autocomp_lister_last_frame_idx = rd_state->frame_index;
} }
////////////////////////////////
//~ rjf: Search Strings
internal void
rd_set_search_string(String8 string)
{
arena_clear(rd_state->string_search_arena);
rd_state->string_search_string = push_str8_copy(rd_state->string_search_arena, string);
}
internal String8
rd_push_search_string(Arena *arena)
{
String8 result = push_str8_copy(arena, rd_state->string_search_string);
return result;
}
//////////////////////////////// ////////////////////////////////
//~ rjf: Colors, Fonts, Config //~ rjf: Colors, Fonts, Config
@@ -12244,7 +12251,6 @@ rd_init(CmdLine *cmdln)
rd_state->popup_arena = arena_alloc(); rd_state->popup_arena = arena_alloc();
rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("top_level_ctx_menu")); rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("top_level_ctx_menu"));
rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit("drop_completion_ctx_menu")); rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit("drop_completion_ctx_menu"));
rd_state->string_search_arena = arena_alloc();
rd_state->bind_change_arena = arena_alloc(); rd_state->bind_change_arena = arena_alloc();
rd_state->drag_drop_arena = arena_alloc(); rd_state->drag_drop_arena = arena_alloc();
rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1); rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1);
@@ -14059,25 +14065,6 @@ rd_frame(void)
} }
}break; }break;
//- rjf: code navigation
case RD_CmdKind_Search:
case RD_CmdKind_SearchBackwards:
case RD_CmdKind_FindTextForward:
case RD_CmdKind_FindTextBackward:
{
rd_set_search_string(rd_regs()->string);
}break;
//- rjf: find next and find prev
case RD_CmdKind_FindNext:
{
rd_cmd(RD_CmdKind_Search, .string = rd_push_search_string(scratch.arena));
}break;
case RD_CmdKind_FindPrev:
{
rd_cmd(RD_CmdKind_SearchBackwards, .string = rd_push_search_string(scratch.arena));
}break;
//- rjf: font sizes //- rjf: font sizes
case RD_CmdKind_IncUIFontScale: case RD_CmdKind_IncUIFontScale:
{ {
@@ -15854,6 +15841,7 @@ Z(getting_started)
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);
// rjf: floating queries -> set up window to build immediate-mode top-level query // rjf: floating queries -> set up window to build immediate-mode top-level query
RD_Cfg *view = &rd_nil_cfg;
if(cmd_kind_info->query.flags & RD_QueryFlag_Floating) if(cmd_kind_info->query.flags & RD_QueryFlag_Floating)
{ {
RD_Cfg *window = rd_cfg_from_id(rd_regs()->window); RD_Cfg *window = rd_cfg_from_id(rd_regs()->window);
@@ -15865,31 +15853,54 @@ Z(getting_started)
ws->query_cmd_name = push_str8_copy(ws->query_arena, cmd_name); ws->query_cmd_name = push_str8_copy(ws->query_arena, cmd_name);
ws->query_regs = rd_regs_copy(ws->query_arena, rd_regs()); ws->query_regs = rd_regs_copy(ws->query_arena, rd_regs());
} }
RD_Cfg *window_query = rd_immediate_cfg_from_keyf("window_query_%p", window);
view = rd_cfg_child_from_string_or_alloc(window_query, str8_lit("watch"));
} }
// rjf: non-floating -> embed in tab parameter // rjf: non-floating -> embed in tab parameter
else else
{ {
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); view = rd_cfg_from_id(rd_regs()->view);
RD_Cfg *query = rd_cfg_child_from_string_or_alloc(view, str8_lit("query")); }
RD_Cfg *cmd = rd_cfg_child_from_string_or_alloc(query, str8_lit("cmd"));
RD_Cfg *input = rd_cfg_child_from_string_or_alloc(query, str8_lit("input")); // rjf: unpack view's query info
String8 current_query_cmd_name = cmd->first->string; RD_Cfg *query = rd_cfg_child_from_string_or_alloc(view, str8_lit("query"));
RD_ViewState *vs = rd_view_state_from_cfg(view); RD_Cfg *cmd = rd_cfg_child_from_string_or_alloc(query, str8_lit("cmd"));
if(!str8_match(current_query_cmd_name, cmd_name, 0)) RD_Cfg *input = rd_cfg_child_from_string_or_alloc(query, str8_lit("input"));
{
rd_cfg_new_replace(cmd, cmd_name); // rjf: choose initial input string
if(!vs->query_is_selected) String8 initial_input = {0};
{ if(cmd_kind_info->query.slot == RD_RegSlot_FilePath)
vs->query_cursor = txt_pt(1, 1+input->first->string.size); {
vs->query_mark = txt_pt(1, 1); initial_input = rd_state->current_path;
} }
vs->query_is_selected = 1; else if(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput)
} {
else initial_input = input->first->string;
{ }
vs->query_is_selected ^= 1;
} // rjf: build query state
rd_cfg_new_replace(input, initial_input);
rd_cfg_new_replace(cmd, cmd_name);
String8 current_query_cmd_name = cmd->first->string;
RD_ViewState *vs = rd_view_state_from_cfg(view);
if(!vs->query_is_selected && cmd_kind_info->query.flags & RD_QueryFlag_SelectOldInput)
{
vs->query_cursor = txt_pt(1, 1+input->first->string.size);
vs->query_mark = txt_pt(1, 1);
}
else
{
vs->query_cursor = txt_pt(1, 1+input->first->string.size);
vs->query_mark = vs->query_cursor;
}
if(!str8_match(current_query_cmd_name, cmd_name, 0))
{
vs->query_is_selected = 1;
}
else
{
vs->query_is_selected ^= 1;
} }
}break; }break;
case RD_CmdKind_CompleteQuery: case RD_CmdKind_CompleteQuery:
@@ -15914,7 +15925,6 @@ Z(getting_started)
RD_ViewState *vs = rd_view_state_from_cfg(view); RD_ViewState *vs = rd_view_state_from_cfg(view);
vs->query_is_selected = 0; vs->query_is_selected = 0;
vs->query_string_size = 0; vs->query_string_size = 0;
rd_cfg_release(rd_cfg_child_from_string(view, str8_lit("query")));
} }
}break; }break;
case RD_CmdKind_CancelQuery: case RD_CmdKind_CancelQuery:
-10
View File
@@ -792,10 +792,6 @@ struct RD_State
// rjf: text editing mode state // rjf: text editing mode state
B32 text_edit_mode; B32 text_edit_mode;
// rjf: string search state
Arena *string_search_arena;
String8 string_search_string;
// rjf: contextual hover info // rjf: contextual hover info
RD_Regs *hover_regs; RD_Regs *hover_regs;
RD_RegSlot hover_regs_slot; RD_RegSlot hover_regs_slot;
@@ -1146,12 +1142,6 @@ internal void rd_set_autocomp_lister_query_(RD_ListerParams *params);
internal void rd_set_autocomp_lister_query_(RD_Regs *regs); internal void rd_set_autocomp_lister_query_(RD_Regs *regs);
#define rd_set_autocomp_lister_query(...) rd_set_autocomp_lister_query_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) #define rd_set_autocomp_lister_query(...) rd_set_autocomp_lister_query_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__})
////////////////////////////////
//~ rjf: Search Strings
internal void rd_set_search_string(String8 string);
internal String8 rd_push_search_string(Arena *arena);
//////////////////////////////// ////////////////////////////////
//~ rjf: Colors, Fonts, Config //~ rjf: Colors, Fonts, Config
+47 -16
View File
@@ -83,6 +83,18 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
arena_clear(cv->find_text_arena); arena_clear(cv->find_text_arena);
cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->regs->string); cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->regs->string);
}break; }break;
case RD_CmdKind_FindNext:
{
String8 string = rd_view_query_input();
arena_clear(cv->find_text_arena);
cv->find_text_fwd = push_str8_copy(cv->find_text_arena, string);
}break;
case RD_CmdKind_FindPrev:
{
String8 string = rd_view_query_input();
arena_clear(cv->find_text_arena);
cv->find_text_bwd = push_str8_copy(cv->find_text_arena, string);
}break;
case RD_CmdKind_ToggleWatchExpressionAtMouse: case RD_CmdKind_ToggleWatchExpressionAtMouse:
{ {
cv->watch_expr_at_mouse = 1; cv->watch_expr_at_mouse = 1;
@@ -136,6 +148,29 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
} }
TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range); TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range);
//////////////////////////////
//- rjf: selection on single line, no query? -> set search text
//
if(rd_regs()->cursor.line == rd_regs()->mark.line)
{
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view);
RD_ViewState *vs = rd_view_state_from_cfg(view);
if(!vs->query_is_selected)
{
RD_Cfg *query = rd_cfg_child_from_string_or_alloc(view, str8_lit("query"));
RD_Cfg *input = rd_cfg_child_from_string_or_alloc(query, str8_lit("input"));
String8 text = txt_string_from_info_data_txt_rng(text_info, text_data, txt_rng(rd_regs()->cursor, rd_regs()->mark));
if(text.size < 256)
{
rd_cfg_new_replace(input, text);
}
else
{
rd_cfg_new_replace(input, str8_zero());
}
}
}
////////////////////////////// //////////////////////////////
//- rjf: get active search query //- rjf: get active search query
// //
@@ -428,9 +463,10 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
U64 needle_pos = str8_find_needle(line_string, search_start, cv->find_text_fwd, StringMatchFlag_CaseInsensitive); U64 needle_pos = str8_find_needle(line_string, search_start, cv->find_text_fwd, StringMatchFlag_CaseInsensitive);
if(needle_pos < line_string.size) if(needle_pos < line_string.size)
{ {
rd_regs()->cursor.line = line_num; rd_regs()->mark.line = line_num;
rd_regs()->cursor.column = needle_pos+1; rd_regs()->mark.column = needle_pos+1;
rd_regs()->mark = rd_regs()->cursor; rd_regs()->cursor = rd_regs()->mark;
rd_regs()->cursor.column += cv->find_text_fwd.size;
found = 1; found = 1;
break; break;
} }
@@ -460,15 +496,16 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
{ {
B32 found = 0; B32 found = 0;
B32 first = 1; B32 first = 1;
S64 line_num_start = rd_regs()->cursor.line; TxtRng rng = txt_rng(rd_regs()->cursor, rd_regs()->mark);
S64 line_num_start = rng.min.line;
S64 line_num_last = (S64)text_info->lines_count; S64 line_num_last = (S64)text_info->lines_count;
for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0) for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0)
{ {
// rjf: gather line info // rjf: gather line info
String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]); String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]);
if(rd_regs()->cursor.line == line_num && first) if(rng.min.line == line_num && first)
{ {
line_string = str8_prefix(line_string, rd_regs()->cursor.column-1); line_string = str8_prefix(line_string, rng.min.column-1);
} }
// rjf: search string // rjf: search string
@@ -484,9 +521,10 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
} }
if(next_needle_pos < line_string.size) if(next_needle_pos < line_string.size)
{ {
rd_regs()->cursor.line = line_num; rd_regs()->mark.line = line_num;
rd_regs()->cursor.column = next_needle_pos+1; rd_regs()->mark.column = next_needle_pos+1;
rd_regs()->mark = rd_regs()->cursor; rd_regs()->cursor = rd_regs()->mark;
rd_regs()->cursor.column += cv->find_text_bwd.size;
found = 1; found = 1;
break; break;
} }
@@ -588,13 +626,6 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
cv->watch_expr_at_mouse = 0; cv->watch_expr_at_mouse = 0;
rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng)); rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng));
} }
//- rjf: selected text on single line, no query? -> set search text
if(!txt_pt_match(rd_regs()->cursor, rd_regs()->mark) && rd_regs()->cursor.line == rd_regs()->mark.line && search_query.size == 0)
{
String8 text = txt_string_from_info_data_txt_rng(text_info, text_data, txt_rng(rd_regs()->cursor, rd_regs()->mark));
rd_set_search_string(text);
}
} }
////////////////////////////// //////////////////////////////
+8 -8
View File
@@ -1960,6 +1960,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
////////////////////////////// //////////////////////////////
//- rjf: interact with margin box & text box //- rjf: interact with margin box & text box
// //
B32 search_query_invalidated = 0;
UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box);
UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box);
UI_Signal text_container_sig = ui_signal_from_box(text_container_box); UI_Signal text_container_sig = ui_signal_from_box(text_container_box);
@@ -2010,6 +2011,12 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
*preferred_column = cursor->column; *preferred_column = cursor->column;
} }
//- rjf: dragging will invalidate the search string, so we don't want to draw it while dragging/releasing
if(ui_dragging(text_container_sig) || ui_released(text_container_sig))
{
search_query_invalidated = 1;
}
//- rjf: right-click => code context menu //- rjf: right-click => code context menu
if(ui_right_clicked(text_container_sig)) if(ui_right_clicked(text_container_sig))
{ {
@@ -2371,7 +2378,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
ui_box_equip_display_fstrs(line_box, &line_fstrs); ui_box_equip_display_fstrs(line_box, &line_fstrs);
// rjf: extra rendering for strings that are currently being searched for // rjf: extra rendering for strings that are currently being searched for
if(params->search_query.size != 0) if(!search_query_invalidated && params->search_query.size != 0)
{ {
for(U64 needle_pos = 0; needle_pos < line_string.size;) for(U64 needle_pos = 0; needle_pos < line_string.size;)
{ {
@@ -2392,13 +2399,6 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
line_box->rect.y1, line_box->rect.y1,
}; };
Vec4F32 color = pop_color; Vec4F32 color = pop_color;
if(cursor->line == line_num && needle_pos+1 <= cursor->column && cursor->column < needle_pos+params->search_query.size+1)
{
color.x += (1.f - color.x) * 0.5f;
color.y += (1.f - color.y) * 0.5f;
color.z += (1.f - color.z) * 0.5f;
color.w += (1.f - color.w) * 0.5f;
}
if(!is_focused) if(!is_focused)
{ {
color.w *= 0.5f; color.w *= 0.5f;