further progress on unified lister interface

This commit is contained in:
Ryan Fleury
2025-01-15 15:25:49 -08:00
parent 6fe9a14778
commit 62894c098a
2 changed files with 741 additions and 656 deletions
+186 -103
View File
@@ -3127,7 +3127,7 @@ rd_window_state_from_cfg(RD_Cfg *cfg)
ws->ctx_menu_input_buffer = push_array(ws->arena, U8, ws->ctx_menu_input_buffer_size); ws->ctx_menu_input_buffer = push_array(ws->arena, U8, ws->ctx_menu_input_buffer_size);
ws->drop_completion_arena = arena_alloc(); ws->drop_completion_arena = arena_alloc();
ws->hover_eval_arena = arena_alloc(); ws->hover_eval_arena = arena_alloc();
ws->lister_params_arena = arena_alloc(); ws->lister_arena = arena_alloc();
ws->query_cmd_arena = arena_alloc(); ws->query_cmd_arena = arena_alloc();
ws->last_dpi = os_dpi_from_window(ws->os); ws->last_dpi = os_dpi_from_window(ws->os);
for EachEnumVal(RD_SettingCode, code) for EachEnumVal(RD_SettingCode, code)
@@ -3137,6 +3137,7 @@ rd_window_state_from_cfg(RD_Cfg *cfg)
ws->setting_vals[code] = rd_setting_code_default_val_table[code]; ws->setting_vals[code] = rd_setting_code_default_val_table[code];
} }
} }
ws->lister_input_cursor = ws->lister_input_mark = txt_pt(1, 1);
ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ws->setting_vals[RD_SettingCode_MainFontSize].s32 * (ws->last_dpi / 96.f); ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ws->setting_vals[RD_SettingCode_MainFontSize].s32 * (ws->last_dpi / 96.f);
ws->setting_vals[RD_SettingCode_CodeFontSize].s32 = ws->setting_vals[RD_SettingCode_CodeFontSize].s32 * (ws->last_dpi / 96.f); ws->setting_vals[RD_SettingCode_CodeFontSize].s32 = ws->setting_vals[RD_SettingCode_CodeFontSize].s32 * (ws->last_dpi / 96.f);
ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ClampBot(ws->setting_vals[RD_SettingCode_MainFontSize].s32, rd_setting_code_default_val_table[RD_SettingCode_MainFontSize].s32); ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ClampBot(ws->setting_vals[RD_SettingCode_MainFontSize].s32, rd_setting_code_default_val_table[RD_SettingCode_MainFontSize].s32);
@@ -3206,14 +3207,14 @@ rd_window_frame(void)
RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window);
RD_WindowState *ws = rd_window_state_from_cfg(rd_cfg_from_handle(rd_regs()->window)); RD_WindowState *ws = rd_window_state_from_cfg(rd_cfg_from_handle(rd_regs()->window));
RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window);
B32 window_is_focused = os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc; B32 window_is_focused = (os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc);
B32 popup_open = rd_state->popup_active; B32 popup_is_open = (rd_state->popup_active);
B32 query_is_open = (ws->query_cmd_name.size != 0); B32 lister_is_open = (ws->lister_last_frame_idx+1 >= rd_state->frame_index);
B32 hover_eval_is_open = (!popup_open && B32 hover_eval_is_open = (!popup_is_open &&
ws->hover_eval_string.size != 0 && ws->hover_eval_string.size != 0 &&
ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx &&
rd_state->frame_index-ws->hover_eval_last_frame_idx < 20); rd_state->frame_index-ws->hover_eval_last_frame_idx < 20);
if(!window_is_focused || popup_open) if(!window_is_focused || popup_is_open)
{ {
ws->menu_bar_key_held = 0; ws->menu_bar_key_held = 0;
} }
@@ -3816,25 +3817,55 @@ rd_window_frame(void)
} }
} }
////////////////////////////
//- rjf: prepare for active query
//
if(ws->query_cmd_name.size != 0)
{
if(ui_slot_press(UI_EventActionSlot_Cancel))
{
rd_cmd(RD_CmdKind_CancelQuery);
}
if(ui_slot_press(UI_EventActionSlot_Accept))
{
Temp scratch = scratch_begin(0, 0);
RD_RegsScope()
{
//rd_regs_fill_slot_from_string(query->slot, str8(ws->query_input_buffer, ws->query_input_string_size));
rd_cmd(RD_CmdKind_CompleteQuery);
}
scratch_end(scratch);
}
rd_set_lister_query(.flags = 0xffffffff);
}
//////////////////////////// ////////////////////////////
//- rjf: build lister //- rjf: build lister
// //
ProfScope("build lister") ProfScope("build lister")
if(!ui_key_match(ws->lister_params.anchor_key, ui_key_zero()) && ws->lister_last_frame_idx+1 >= rd_state->frame_index) if(ws->lister_last_frame_idx+1 >= rd_state->frame_index)
{
String8 input = str8(ws->lister_input_buffer, ws->lister_input_size);
String8 query_word = rd_lister_query_word_from_input_string_off(input, ws->lister_params.cursor_off);
String8 query_path = rd_lister_query_path_from_input_string_off(input, ws->lister_params.cursor_off);
UI_Box *lister_root_box = ui_box_from_key(ws->lister_params.anchor_key);
if(!ui_box_is_nil(lister_root_box))
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
DI_Scope *di_scope = di_scope_open(); DI_Scope *di_scope = di_scope_open();
//////////////////////////
//- rjf: unpack
//
U64 input_cursor_off = ws->lister_params.cursor_off;
if(ws->lister_params.flags & RD_ListerFlag_LineEdit)
{
input_cursor_off = ws->lister_input_cursor.column-1;
}
String8 input = str8(ws->lister_input_buffer, ws->lister_input_size);
String8 query_word = rd_lister_query_word_from_input_string_off(input, input_cursor_off);
String8 query_path = rd_lister_query_path_from_input_string_off(input, input_cursor_off);
UI_Box *lister_anchor_box = ui_box_from_key(ws->lister_params.anchor_key);
DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); 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); DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list);
//////////////////////////
//- rjf: grab rdis //- rjf: grab rdis
//
U64 rdis_count = dbgi_keys.count; U64 rdis_count = dbgi_keys.count;
RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count);
{ {
@@ -3846,7 +3877,9 @@ rd_window_frame(void)
} }
} }
//////////////////////////
//- rjf: unpack lister params //- rjf: unpack lister params
//
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread);
U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_base_regs()->unwind_count); U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_base_regs()->unwind_count);
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);
@@ -3854,10 +3887,14 @@ rd_window_frame(void)
U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr);
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
//////////////////////////
//- rjf: gather lister items //- rjf: gather lister items
//
RD_ListerItemChunkList item_list = {0}; RD_ListerItemChunkList item_list = {0};
{ {
////////////////////////
//- rjf: gather locals //- rjf: gather locals
//
if(ws->lister_params.flags & RD_ListerFlag_Locals) if(ws->lister_params.flags & RD_ListerFlag_Locals)
{ {
E_String2NumMap *locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); E_String2NumMap *locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff);
@@ -3888,7 +3925,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather registers //- rjf: gather registers
//
if(ws->lister_params.flags & RD_ListerFlag_Registers) if(ws->lister_params.flags & RD_ListerFlag_Registers)
{ {
Arch arch = thread->arch; Arch arch = thread->arch;
@@ -3930,7 +3969,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather view rules //- rjf: gather view rules
//
if(ws->lister_params.flags & RD_ListerFlag_ViewRules) if(ws->lister_params.flags & RD_ListerFlag_ViewRules)
{ {
for(U64 slot_idx = 0; slot_idx < d_state->view_rule_spec_table_size; slot_idx += 1) for(U64 slot_idx = 0; slot_idx < d_state->view_rule_spec_table_size; slot_idx += 1)
@@ -3956,13 +3997,17 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather members //- rjf: gather members
//
if(ws->lister_params.flags & RD_ListerFlag_Members) if(ws->lister_params.flags & RD_ListerFlag_Members)
{ {
// TODO(rjf) // TODO(rjf)
} }
////////////////////////
//- rjf: gather globals //- rjf: gather globals
//
if(ws->lister_params.flags & RD_ListerFlag_Globals && query_word.size != 0) if(ws->lister_params.flags & RD_ListerFlag_Globals && query_word.size != 0)
{ {
U128 search_key = {d_hash_from_string(str8_lit("autocomp_globals_search_key")), d_hash_from_string(str8_lit("autocomp_globals_search_key"))}; U128 search_key = {d_hash_from_string(str8_lit("autocomp_globals_search_key")), d_hash_from_string(str8_lit("autocomp_globals_search_key"))};
@@ -3996,7 +4041,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather thread locals //- rjf: gather thread locals
//
if(ws->lister_params.flags & RD_ListerFlag_ThreadLocals && query_word.size != 0) if(ws->lister_params.flags & RD_ListerFlag_ThreadLocals && query_word.size != 0)
{ {
U128 search_key = {d_hash_from_string(str8_lit("autocomp_tvars_dis_key")), d_hash_from_string(str8_lit("autocomp_tvars_dis_key"))}; U128 search_key = {d_hash_from_string(str8_lit("autocomp_tvars_dis_key")), d_hash_from_string(str8_lit("autocomp_tvars_dis_key"))};
@@ -4030,7 +4077,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather procedures //- rjf: gather procedures
//
if(ws->lister_params.flags & RD_ListerFlag_Procedures && query_word.size != 0) if(ws->lister_params.flags & RD_ListerFlag_Procedures && query_word.size != 0)
{ {
U128 search_key = {d_hash_from_string(str8_lit("autocomp_procedures_search_key")), d_hash_from_string(str8_lit("autocomp_procedures_search_key"))}; U128 search_key = {d_hash_from_string(str8_lit("autocomp_procedures_search_key")), d_hash_from_string(str8_lit("autocomp_procedures_search_key"))};
@@ -4064,7 +4113,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather types //- rjf: gather types
//
if(ws->lister_params.flags & RD_ListerFlag_Types && query_word.size != 0) if(ws->lister_params.flags & RD_ListerFlag_Types && query_word.size != 0)
{ {
U128 search_key = {d_hash_from_string(str8_lit("autocomp_types_search_key")), d_hash_from_string(str8_lit("autocomp_types_search_key"))}; U128 search_key = {d_hash_from_string(str8_lit("autocomp_types_search_key")), d_hash_from_string(str8_lit("autocomp_types_search_key"))};
@@ -4098,7 +4149,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather languages //- rjf: gather languages
//
if(ws->lister_params.flags & RD_ListerFlag_Languages) if(ws->lister_params.flags & RD_ListerFlag_Languages)
{ {
for EachNonZeroEnumVal(TXT_LangKind, lang) for EachNonZeroEnumVal(TXT_LangKind, lang)
@@ -4119,7 +4172,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather architectures //- rjf: gather architectures
//
if(ws->lister_params.flags & RD_ListerFlag_Architectures) if(ws->lister_params.flags & RD_ListerFlag_Architectures)
{ {
for EachNonZeroEnumVal(Arch, arch) for EachNonZeroEnumVal(Arch, arch)
@@ -4137,7 +4192,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather tex2dformats //- rjf: gather tex2dformats
//
if(ws->lister_params.flags & RD_ListerFlag_Tex2DFormats) if(ws->lister_params.flags & RD_ListerFlag_Tex2DFormats)
{ {
for EachEnumVal(R_Tex2DFormat, fmt) for EachEnumVal(R_Tex2DFormat, fmt)
@@ -4155,7 +4212,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather view rule params //- rjf: gather view rule params
//
if(ws->lister_params.flags & RD_ListerFlag_ViewRuleParams) if(ws->lister_params.flags & RD_ListerFlag_ViewRuleParams)
{ {
for(String8Node *n = ws->lister_params.strings.first; n != 0; n = n->next) for(String8Node *n = ws->lister_params.strings.first; n != 0; n = n->next)
@@ -4173,7 +4232,9 @@ rd_window_frame(void)
} }
} }
////////////////////////
//- rjf: gather files //- rjf: gather files
//
if(ws->lister_params.flags & RD_ListerFlag_Files) if(ws->lister_params.flags & RD_ListerFlag_Files)
{ {
// rjf: find containing directory in query_path // rjf: find containing directory in query_path
@@ -4248,7 +4309,9 @@ rd_window_frame(void)
os_file_iter_end(it); os_file_iter_end(it);
} }
////////////////////////
//- rjf: gather commands //- rjf: gather commands
//
if(ws->lister_params.flags & RD_ListerFlag_Commands) if(ws->lister_params.flags & RD_ListerFlag_Commands)
{ {
for EachNonZeroEnumVal(RD_CmdKind, k) for EachNonZeroEnumVal(RD_CmdKind, k)
@@ -4280,66 +4343,67 @@ rd_window_frame(void)
} }
} }
//////////////////////////
//- rjf: lister item list -> sorted array //- rjf: lister item list -> sorted array
//
RD_ListerItemArray item_array = rd_lister_item_array_from_chunk_list(scratch.arena, &item_list); RD_ListerItemArray item_array = rd_lister_item_array_from_chunk_list(scratch.arena, &item_list);
rd_lister_item_array_sort__in_place(&item_array); rd_lister_item_array_sort__in_place(&item_array);
//- rjf: animate //////////////////////////
{ //- rjf: animate values
// rjf: animate target # of rows //
{ F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt));
F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? (1 - pow_f32(2, (-60.f * rd_state->frame_dt))) : 1.f; F32 lister_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "lister_open"), 1.f);
F32 target = Min((F32)item_array.count, 16.f); F32 lister_num_of_rows_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "lister_num_of_rows"), (F32)item_array.count);
if(abs_f32(target - ws->lister_num_visible_rows_t) > 0.01f) ws->lister_scroll_pt.off -= ws->lister_scroll_pt.off*fast_rate;
{
rd_request_frame();
}
ws->lister_num_visible_rows_t += (target - ws->lister_num_visible_rows_t) * rate;
if(abs_f32(target - ws->lister_num_visible_rows_t) <= 0.02f)
{
ws->lister_num_visible_rows_t = target;
}
}
// rjf: animate open //////////////////////////
{ //- rjf: unpack build parameters
F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; //
F32 diff = 1.f-ws->lister_open_t; F32 squish = ((ws->lister_params.squish != 0.f) ? ws->lister_params.squish : (0.25f - 0.25f*lister_open_t));
ws->lister_open_t += diff*rate; F32 transparency = ((ws->lister_params.transparency != 0.f) ? ws->lister_params.transparency : 1.f-lister_open_t);
if(abs_f32(diff) < 0.05f)
{
ws->lister_open_t = 1.f;
}
else
{
rd_request_frame();
}
}
}
//- rjf: build
if(item_array.count != 0)
{
F32 squish = ws->lister_params.squish;
F32 transparency = ws->lister_params.transparency;
if(squish == 0.f)
{
squish = 0.25f - 0.25f*ws->lister_open_t;
}
if(transparency == 0.f)
{
transparency = 1.f-ws->lister_open_t;
}
F32 width_px = ui_box_is_nil(lister_root_box) ? (ui_top_font_size()*30.f) : dim_2f32(lister_root_box->rect).x;
F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f);
if(ws->lister_params.flags & RD_ListerFlag_Descriptions) if(ws->lister_params.flags & RD_ListerFlag_Descriptions)
{ {
row_height_px += floor_f32(ui_top_font_size()*3.5f); row_height_px += floor_f32(ui_top_font_size()*3.5f);
} }
ui_set_next_fixed_x(lister_root_box->rect.x0 + ws->lister_params.anchor_off.x); Vec2F32 content_rect_dim = dim_2f32(content_rect);
ui_set_next_fixed_y(lister_root_box->rect.y0 + ws->lister_params.anchor_off.y); Vec2F32 content_rect_center = center_2f32(content_rect);
ui_set_next_pref_width(ui_px(width_px, 1.f)); F32 line_edit_height_px = 0;
ui_set_next_pref_height(ui_px(row_height_px*ws->lister_num_visible_rows_t + ui_top_font_size()*2.f, 1.f)); if(ws->lister_params.flags & RD_ListerFlag_LineEdit)
{
line_edit_height_px = floor_f32(ui_top_font_size()*3.f);
}
F32 lister_height_max = content_rect_dim.y*0.9f;
Vec2F32 lister_dim_px =
{
content_rect_dim.x*0.5f,
line_edit_height_px + lister_num_of_rows_t*row_height_px,
};
if(!ui_box_is_nil(lister_anchor_box))
{
lister_dim_px.x = dim_2f32(lister_anchor_box->rect).x;
}
lister_dim_px.x = Max(lister_dim_px.x, ui_top_font_size()*30.f);
lister_dim_px.y = Min(lister_dim_px.y, lister_height_max);
Vec2F32 lister_pos_px =
{
content_rect_center.x - lister_dim_px.x/2,
content_rect_center.y - content_rect_dim.y*0.9f/2,
};
if(!ui_box_is_nil(lister_anchor_box))
{
lister_pos_px = v2f32(lister_anchor_box->rect.x0 + ws->lister_params.anchor_off.x,
lister_anchor_box->rect.y0 + ws->lister_params.anchor_off.y);
}
//////////////////////////
//- rjf: build top-level lister box
//
ui_set_next_fixed_x(lister_pos_px.x);
ui_set_next_fixed_y(lister_pos_px.y);
ui_set_next_pref_width(ui_px(lister_dim_px.x, 1.f));
ui_set_next_pref_height(ui_px(lister_dim_px.y, 1.f));
ui_set_next_child_layout_axis(Axis2_Y); ui_set_next_child_layout_axis(Axis2_Y);
ui_set_next_corner_radius_01(ui_top_font_size()*0.25f); ui_set_next_corner_radius_01(ui_top_font_size()*0.25f);
ui_set_next_corner_radius_11(ui_top_font_size()*0.25f); ui_set_next_corner_radius_11(ui_top_font_size()*0.25f);
@@ -4348,8 +4412,7 @@ rd_window_frame(void)
UI_Transparency(transparency) UI_Transparency(transparency)
RD_Palette(RD_PaletteCode_Floating) RD_Palette(RD_PaletteCode_Floating)
{ {
lister_box = ui_build_box_from_stringf(UI_BoxFlag_DefaultFocusNavY| lister_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|
UI_BoxFlag_Clickable|
UI_BoxFlag_Clip| UI_BoxFlag_Clip|
UI_BoxFlag_RoundChildrenByParent| UI_BoxFlag_RoundChildrenByParent|
UI_BoxFlag_DisableFocusOverlay| UI_BoxFlag_DisableFocusOverlay|
@@ -4358,21 +4421,54 @@ rd_window_frame(void)
UI_BoxFlag_DrawDropShadow| UI_BoxFlag_DrawDropShadow|
UI_BoxFlag_DrawBackground, UI_BoxFlag_DrawBackground,
"lister_box"); "lister_box");
if(ws->lister_input_dirty)
{
ws->lister_input_dirty = 0;
lister_box->default_nav_focus_hot_key = lister_box->default_nav_focus_active_key = lister_box->default_nav_focus_next_hot_key = lister_box->default_nav_focus_next_active_key = ui_key_zero();
} }
}
UI_Parent(lister_box) //////////////////////////
//- rjf: build lister line edit
//
if(ws->lister_params.flags & RD_ListerFlag_LineEdit)
UI_WidthFill UI_WidthFill
UI_PrefHeight(ui_px(row_height_px, 1.f)) UI_Parent(lister_box)
UI_HoverCursor(OS_Cursor_HandPoint) UI_Focus(UI_FocusKind_On)
UI_Focus(UI_FocusKind_Null)
RD_Palette(RD_PaletteCode_ImplicitButton)
UI_Padding(ui_em(1.f, 1.f))
{ {
for(U64 idx = 0; idx < item_array.count; idx += 1) UI_PrefHeight(ui_px(line_edit_height_px, 1.f))
{
UI_Signal sig = rd_line_edit(RD_LineEditFlag_Border,
0,
0,
&ws->lister_input_cursor,
&ws->lister_input_mark,
ws->lister_input_buffer,
sizeof(ws->lister_input_buffer),
&ws->lister_input_size,
0,
str8(ws->lister_input_buffer, ws->lister_input_size),
str8_lit("###lister_text_input"));
}
}
//////////////////////////
//- rjf: build lister contents
//
UI_ScrollListParams params =
{
.flags = UI_ScrollListFlag_All,
.dim_px = v2f32(lister_dim_px.x, lister_dim_px.y - line_edit_height_px),
.row_height_px = row_height_px,
.cursor_range = r2s64(v2s64(0, 0), v2s64(0, item_array.count)),
.item_range = r1s64(0, item_array.count),
.cursor_min_is_empty_selection[Axis2_Y] = 1,
};
Vec2S64 cursor = {0};
Rng1S64 visible_row_range = {0};
UI_ScrollListSignal scroll_list_signal = {0};
UI_WidthFill UI_HeightFill
UI_Parent(lister_box)
UI_ScrollList(&params, &ws->lister_scroll_pt, &cursor, 0, &visible_row_range, &scroll_list_signal)
RD_Palette(RD_PaletteCode_ImplicitButton)
{
UI_HoverCursor(OS_Cursor_HandPoint)
for(S64 idx = visible_row_range.min; 0 <= idx && idx < visible_row_range.max && idx < item_array.count; idx += 1)
{ {
RD_ListerItem *item = &item_array.v[idx]; RD_ListerItem *item = &item_array.v[idx];
@@ -4384,7 +4480,7 @@ rd_window_frame(void)
{ {
// rjf: icon // rjf: icon
if(item->icon_kind != RD_IconKind_Null) if(item->icon_kind != RD_IconKind_Null)
UI_PrefWidth(ui_em(3.f, 1.f)) UI_PrefWidth(ui_em(2.f, 1.f))
UI_Column UI_Column
UI_Padding(ui_pct(1, 0)) UI_Padding(ui_pct(1, 0))
RD_Font(RD_FontSlot_Icons) RD_Font(RD_FontSlot_Icons)
@@ -4434,7 +4530,7 @@ rd_window_frame(void)
} }
// rjf: bindings // rjf: bindings
if(item->can_have_bindings) if(item->can_have_bindings) RD_Palette(RD_PaletteCode_Base)
{ {
ui_set_next_flags(UI_BoxFlag_Clickable); ui_set_next_flags(UI_BoxFlag_Clickable);
UI_PrefWidth(ui_children_sum(1.f)) UI_HeightFill UI_NamedColumn(str8_lit("binding_column")) UI_Padding(ui_em(1.5f, 1.f)) UI_PrefWidth(ui_children_sum(1.f)) UI_HeightFill UI_NamedColumn(str8_lit("binding_column")) UI_Padding(ui_em(1.5f, 1.f))
@@ -4472,13 +4568,12 @@ rd_window_frame(void)
} }
} }
} }
}
di_scope_close(di_scope); di_scope_close(di_scope);
scratch_end(scratch); scratch_end(scratch);
} }
}
#if 0 // TODO(rjf): @cfg
//////////////////////////// ////////////////////////////
//- rjf: prepare query state for the in-progress query command //- rjf: prepare query state for the in-progress query command
// //
@@ -4711,6 +4806,7 @@ rd_window_frame(void)
{ {
ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero());
} }
#endif
//////////////////////////// ////////////////////////////
//- rjf: top-level registers context menu //- rjf: top-level registers context menu
@@ -6426,7 +6522,7 @@ rd_window_frame(void)
//- rjf: build if good //- rjf: build if good
if(!e_type_key_match(eval.type_key, e_type_key_zero()) && !ui_any_ctx_menu_is_open()) if(!e_type_key_match(eval.type_key, e_type_key_zero()) && !ui_any_ctx_menu_is_open())
UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && (!query_is_open || !ws->query_input_selected)) ? UI_FocusKind_Null : UI_FocusKind_Off) UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && !lister_is_open) ? UI_FocusKind_Null : UI_FocusKind_Off)
{ {
//- rjf: eval -> viz artifacts //- rjf: eval -> viz artifacts
F32 row_height = floor_f32(ui_top_font_size()*2.8f); F32 row_height = floor_f32(ui_top_font_size()*2.8f);
@@ -7041,7 +7137,7 @@ rd_window_frame(void)
if(panel->first != &rd_nil_panel_node) {continue;} if(panel->first != &rd_nil_panel_node) {continue;}
B32 panel_is_focused = (window_is_focused && B32 panel_is_focused = (window_is_focused &&
!ws->menu_bar_focused && !ws->menu_bar_focused &&
(!query_is_open || !ws->query_input_selected) && !lister_is_open &&
!ui_any_ctx_menu_is_open() && !ui_any_ctx_menu_is_open() &&
!ws->hover_eval_focused && !ws->hover_eval_focused &&
panel_tree.focused == panel); panel_tree.focused == panel);
@@ -10006,25 +10102,15 @@ rd_set_lister_query_(RD_ListerParams *params)
{ {
RD_Cfg *window_cfg = rd_cfg_from_handle(rd_regs()->window); RD_Cfg *window_cfg = rd_cfg_from_handle(rd_regs()->window);
RD_WindowState *ws = rd_window_state_from_cfg(window_cfg); RD_WindowState *ws = rd_window_state_from_cfg(window_cfg);
if(params->cursor_off != ws->lister_params.cursor_off) arena_clear(ws->lister_arena);
{ ws->lister_regs = rd_regs_copy(ws->lister_arena, rd_regs());
ws->lister_input_dirty = 1;
}
if(!ui_key_match(ws->lister_params.anchor_key, params->anchor_key))
{
ws->lister_num_visible_rows_t = 0;
ws->lister_open_t = 0;
}
if(ws->lister_last_frame_idx+1 < rd_state->frame_index)
{
ws->lister_num_visible_rows_t = 0;
ws->lister_open_t = 0;
}
arena_clear(ws->lister_params_arena);
MemoryCopyStruct(&ws->lister_params, params); MemoryCopyStruct(&ws->lister_params, params);
ws->lister_params.strings = str8_list_copy(ws->lister_params_arena, &ws->lister_params.strings); ws->lister_params.strings = str8_list_copy(ws->lister_arena, &ws->lister_params.strings);
if(!(params->flags & RD_ListerFlag_LineEdit))
{
ws->lister_input_size = Min(params->input.size, sizeof(ws->lister_input_buffer)); ws->lister_input_size = Min(params->input.size, sizeof(ws->lister_input_buffer));
MemoryCopy(ws->lister_input_buffer, params->input.str, ws->lister_input_size); MemoryCopy(ws->lister_input_buffer, params->input.str, ws->lister_input_size);
}
ws->lister_last_frame_idx = rd_state->frame_index; ws->lister_last_frame_idx = rd_state->frame_index;
} }
@@ -11602,7 +11688,7 @@ rd_frame(void)
arena_release(ws->ctx_menu_arena); arena_release(ws->ctx_menu_arena);
arena_release(ws->drop_completion_arena); arena_release(ws->drop_completion_arena);
arena_release(ws->hover_eval_arena); arena_release(ws->hover_eval_arena);
arena_release(ws->lister_params_arena); arena_release(ws->lister_arena);
arena_release(ws->arena); arena_release(ws->arena);
DLLRemove_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev); DLLRemove_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev);
DLLRemove_NP(rd_state->window_state_slots[slot_idx].first, rd_state->window_state_slots[slot_idx].last, ws, hash_next, hash_prev); DLLRemove_NP(rd_state->window_state_slots[slot_idx].first, rd_state->window_state_slots[slot_idx].last, ws, hash_next, hash_prev);
@@ -12403,12 +12489,10 @@ rd_frame(void)
RD_WindowState *ws = rd_window_state_from_cfg(wcfg); RD_WindowState *ws = rd_window_state_from_cfg(wcfg);
if(ws != 0) if(ws != 0)
{ {
ws->query_cmd_gen += 1;
arena_clear(ws->query_cmd_arena); arena_clear(ws->query_cmd_arena);
ws->query_cmd_name = push_str8_copy(ws->query_cmd_arena, cmd->regs->cmd_name); ws->query_cmd_name = push_str8_copy(ws->query_cmd_arena, cmd->regs->cmd_name);
ws->query_cmd_regs = rd_regs_copy(ws->query_cmd_arena, rd_regs()); ws->query_cmd_regs = rd_regs_copy(ws->query_cmd_arena, rd_regs());
MemoryZeroArray(ws->query_cmd_regs_mask); MemoryZeroArray(ws->query_cmd_regs_mask);
ws->query_input_selected = 1;
} }
} }
}break; }break;
@@ -13741,7 +13825,6 @@ rd_frame(void)
RD_Cfg *window = rd_window_from_cfg(panel); RD_Cfg *window = rd_window_from_cfg(panel);
RD_WindowState *ws = rd_window_state_from_cfg(window); RD_WindowState *ws = rd_window_state_from_cfg(window);
ws->menu_bar_focused = 0; ws->menu_bar_focused = 0;
ws->query_input_selected = 0;
} }
}break; }break;
+33 -31
View File
@@ -542,23 +542,24 @@ typedef U32 RD_ListerFlags;
enum enum
{ {
//- rjf: lister visual settings //- rjf: lister visual settings
RD_ListerFlag_Descriptions = (1<<0), RD_ListerFlag_LineEdit = (1<<0), // determines whether or not the lister has its own line edit, or if the filtering string is sourced by a user
RD_ListerFlag_Descriptions = (1<<1), // determines whether or not the lister items have descriptions (taller & bigger buttons)
//- rjf: lister item sources //- rjf: lister item sources
RD_ListerFlag_Locals = (1<<1), RD_ListerFlag_Locals = (1<<2),
RD_ListerFlag_Registers = (1<<2), RD_ListerFlag_Registers = (1<<3),
RD_ListerFlag_ViewRules = (1<<3), RD_ListerFlag_ViewRules = (1<<4),
RD_ListerFlag_ViewRuleParams= (1<<4), RD_ListerFlag_ViewRuleParams= (1<<5),
RD_ListerFlag_Members = (1<<5), RD_ListerFlag_Members = (1<<6),
RD_ListerFlag_Globals = (1<<6), RD_ListerFlag_Globals = (1<<7),
RD_ListerFlag_ThreadLocals = (1<<7), RD_ListerFlag_ThreadLocals = (1<<8),
RD_ListerFlag_Procedures = (1<<8), RD_ListerFlag_Procedures = (1<<9),
RD_ListerFlag_Types = (1<<9), RD_ListerFlag_Types = (1<<10),
RD_ListerFlag_Languages = (1<<10), RD_ListerFlag_Languages = (1<<11),
RD_ListerFlag_Architectures = (1<<11), RD_ListerFlag_Architectures = (1<<12),
RD_ListerFlag_Tex2DFormats = (1<<12), RD_ListerFlag_Tex2DFormats = (1<<13),
RD_ListerFlag_Files = (1<<13), RD_ListerFlag_Files = (1<<14),
RD_ListerFlag_Commands = (1<<14), RD_ListerFlag_Commands = (1<<15),
}; };
typedef struct RD_ListerItem RD_ListerItem; typedef struct RD_ListerItem RD_ListerItem;
@@ -619,6 +620,15 @@ struct RD_ListerParams
//////////////////////////////// ////////////////////////////////
//~ rjf: Per-Window State //~ rjf: Per-Window State
typedef struct RD_QueryMenu RD_QueryMenu;
struct RD_QueryMenu
{
RD_QueryMenu *next;
Arena *arena;
RD_Regs *regs;
RD_RegSlot slot;
};
typedef struct RD_WindowState RD_WindowState; typedef struct RD_WindowState RD_WindowState;
struct RD_WindowState struct RD_WindowState
{ {
@@ -668,26 +678,23 @@ struct RD_WindowState
// rjf: lister state // rjf: lister state
U64 lister_last_frame_idx; U64 lister_last_frame_idx;
B32 lister_input_dirty; Arena *lister_arena;
Arena *lister_params_arena; RD_Regs *lister_regs;
RD_ListerParams lister_params; RD_ListerParams lister_params;
UI_ScrollPt lister_scroll_pt;
U8 lister_input_buffer[1024]; U8 lister_input_buffer[1024];
U64 lister_input_size; U64 lister_input_size;
F32 lister_open_t; TxtPt lister_input_cursor;
F32 lister_num_visible_rows_t; TxtPt lister_input_mark;
// rjf: query menu stack
RD_QueryMenu *top_query_menu;
// rjf: query view stack // rjf: query view stack
U64 query_cmd_gen;
Arena *query_cmd_arena; Arena *query_cmd_arena;
String8 query_cmd_name; String8 query_cmd_name;
RD_Regs *query_cmd_regs; RD_Regs *query_cmd_regs;
U64 query_cmd_regs_mask[(RD_RegSlot_COUNT + 63) / 64]; U64 query_cmd_regs_mask[(RD_RegSlot_COUNT + 63) / 64];
U64 query_input_gen;
B32 query_input_selected;
U8 query_input_buffer[1024];
U64 query_input_string_size;
TxtPt query_input_cursor;
TxtPt query_input_mark;
// rjf: hover eval state // rjf: hover eval state
B32 hover_eval_focused; B32 hover_eval_focused;
@@ -1092,11 +1099,6 @@ internal RD_ViewRuleKind rd_view_rule_kind_from_string(String8 string);
internal RD_ViewRuleInfo *rd_view_rule_info_from_kind(RD_ViewRuleKind kind); internal RD_ViewRuleInfo *rd_view_rule_info_from_kind(RD_ViewRuleKind kind);
internal RD_ViewRuleInfo *rd_view_rule_info_from_string(String8 string); internal RD_ViewRuleInfo *rd_view_rule_info_from_string(String8 string);
////////////////////////////////
//~ rjf: Panel Type Functions
//////////////////////////////// ////////////////////////////////
//~ rjf: Global Cross-Window UI Interaction State Functions //~ rjf: Global Cross-Window UI Interaction State Functions