eval visualization - allow chained expressions to cause multiple child expansion blocks; begin work on unified lister watch window

This commit is contained in:
Ryan Fleury
2025-04-15 16:27:44 -07:00
parent 923f55fb2b
commit b9ef453a14
7 changed files with 40 additions and 18 deletions
+14
View File
@@ -409,6 +409,7 @@ e_expr_copy(Arena *arena, E_Expr *src)
E_Expr *dst_parent;
E_Expr *src;
B32 is_ref;
B32 is_sib;
};
Task start_task = {0, &e_expr_nil, src};
Task *first_task = &start_task;
@@ -431,10 +432,23 @@ e_expr_copy(Arena *arena, E_Expr *src)
{
t->dst_parent->ref = dst;
}
else if(t->is_sib)
{
t->dst_parent->next = dst;
dst->prev = t->dst_parent;
}
else
{
e_expr_push_child(t->dst_parent, dst);
}
if(t->src->next != &e_expr_nil)
{
Task *task = push_array(scratch.arena, Task, 1);
task->dst_parent = dst;
task->src = t->src->next;
task->is_sib = 1;
SLLQueuePush(first_task, last_task, task);
}
if(t->src->ref != &e_expr_nil)
{
Task *task = push_array(scratch.arena, Task, 1);
@@ -520,7 +520,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
tree.total_row_count += 1;
tree.total_item_count += 1;
//- rjf: iterate all expansions & generate blocks for each
//- rjf: generate initial task, for root's evaluation
typedef struct Task Task;
struct Task
{
@@ -534,6 +534,8 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
Task start_task = {0, tree.root, tree.root->eval, 1, 0};
Task *first_task = &start_task;
Task *last_task = first_task;
//- rjf: iterate all expansions & generate blocks for each
for(Task *t = first_task; t != 0; t = t->next)
{
// rjf: get task key
@@ -714,6 +716,19 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
}
}
}
// rjf: if this expr has a sibling, push another task to continue the chain
if(t->eval.expr->next != &e_expr_nil)
{
Task *task = push_array(scratch.arena, Task, 1);
task->next = t->next;
t->next = task;
task->parent_block = t->parent_block;
task->eval = e_eval_from_expr(arena, t->eval.expr->next);
task->child_id = t->child_id;
task->split_relative_idx = 0;
task->default_expanded = t->default_expanded;
}
}
scratch_end(scratch);
}
@@ -797,7 +812,7 @@ ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree)
// rjf: generate task for post-child rows, if any, after children
Rng1U64 remainder_range = r1u64(t->next_child->split_relative_idx+1, t->block_relative_range.max);
if(remainder_range.max > remainder_range.min)
if(remainder_range.max >= remainder_range.min)
{
BlockTask *remainder_task = push_array(scratch.arena, BlockTask, 1);
remainder_task->next = child_task->next;
+1 -1
View File
@@ -426,7 +426,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[215] =
{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("open_lister"), str8_lit_comp("Opens the lister."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:lister"), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("open_lister"), str8_lit_comp("Opens the lister."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), CTRL_EntityKind_Null}},
{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}},
+1 -1
View File
@@ -450,7 +450,7 @@ RD_CmdTable: // | | | |
{Exit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" }
//- rjf: top-level lister
{OpenLister 1 1 "query:lister" Null null Nil Null 0 0 0 0 0 0 0 Null "open_lister" "Open Lister" "Opens the lister." "help,cmd" "" }
{OpenLister 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_lister" "Open Lister" "Opens the lister." "help,cmd" "" }
//- rjf: command runner
{RunCommand 1 1 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" }
+3 -10
View File
@@ -12492,18 +12492,11 @@ rd_frame(void)
#endif
}break;
//- rjf: top-level lister
//- rjf: open lister
case RD_CmdKind_OpenLister:
{
RD_ListerFlags lister_flags = (RD_ListerFlag_LineEdit|
RD_ListerFlag_Descriptions|
RD_ListerFlag_KindLabel|
RD_ListerFlag_Procedures|
RD_ListerFlag_Files|
RD_ListerFlag_Commands|
RD_ListerFlag_Settings|
RD_ListerFlag_SystemProcesses);
rd_cmd(RD_CmdKind_PushQuery, .lister_flags = lister_flags);
String8 expr = push_str8f(scratch.arena, "query:commands, query:recent_files, query:recent_projects, query:procedures, query:$%I64x", rd_regs()->view);
rd_cmd(RD_CmdKind_PushQuery, .expr = expr, .do_implicit_root = 1);
}break;
//- rjf: command fast path
+2 -2
View File
@@ -29,7 +29,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands)
}
else
{
result.expr_count = RD_CmdKind_COUNT;
result.expr_count = RD_CmdKind_COUNT - 1;
}
return result;
}
@@ -67,7 +67,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(commands)
{
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
{
RD_CmdKind cmd_kind = (RD_CmdKind)idx;
RD_CmdKind cmd_kind = (RD_CmdKind)(idx+1);
String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string;
E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_U64, .name = str8_lit("command"));
+2 -2
View File
@@ -3235,8 +3235,8 @@ rd_cell(RD_CellParams *params, String8 string)
{
B32 is_toggled = !!params->toggled_out[0];
F32 toggle_t = ui_anim(ui_key_from_stringf(key, "toggled"), (F32)is_toggled, .initial = (F32)is_toggled);
F32 padding_px = floor_f32(ui_top_font_size()*0.65f);
F32 height_px = ui_top_px_height() - padding_px*2.f;
F32 height_px = ui_top_font_size() * 1.75f;
F32 padding_px = (ui_top_px_height() - height_px) / 2.f;
UI_PrefWidth(ui_children_sum(1.f))
UI_HeightFill
UI_Column UI_Padding(ui_px(padding_px, 1.f))