table lens

This commit is contained in:
Ryan Fleury
2025-04-15 13:31:11 -07:00
parent 85f715f2ba
commit 82ec25ad19
4 changed files with 69 additions and 17 deletions
@@ -1063,29 +1063,37 @@ ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRang
return rows;
}
internal B32
ev_eval_is_expandable(E_Eval eval)
{
B32 result = 0;
E_IRTreeAndType irtree = eval.irtree;
// rjf: determine if lenses force expandability
if(!result)
{
EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key);
if(expand_rule != &ev_nil_expand_rule)
{
result = 1;
}
}
// rjf: determine if type info force expandability
if(!result)
{
result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode);
}
return result;
}
internal B32
ev_row_is_expandable(EV_Row *row)
{
B32 result = 0;
if(!ev_key_match(ev_key_root(), row->block->key))
{
E_IRTreeAndType irtree = row->eval.irtree;
// rjf: determine if lenses force expandability
if(!result)
{
EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key);
if(expand_rule != &ev_nil_expand_rule)
{
result = 1;
}
}
// rjf: determine if type info force expandability
if(!result)
{
result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode);
}
result = ev_eval_is_expandable(row->eval);
}
return result;
}
@@ -369,6 +369,7 @@ internal U64 ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx);
internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range);
internal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num);
internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range);
internal B32 ev_eval_is_expandable(E_Eval eval);
internal B32 ev_row_is_expandable(EV_Row *row);
internal B32 ev_row_is_editable(EV_Row *row);
+1
View File
@@ -12330,6 +12330,7 @@ rd_frame(void)
{str8_lit("range1"), 0, 0, 0, 0, 0, {0}},
{str8_lit("array"), 0, 0, 1, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(array), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(array)}},
{str8_lit("slice"), 0, 0, 1, E_TYPE_IREXT_FUNCTION_NAME(slice), E_TYPE_ACCESS_FUNCTION_NAME(slice), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(slice), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(slice)}},
{str8_lit("table"), 0, 0, 0, 0, 0, {0}},
{str8_lit("text"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)},
{str8_lit("disasm"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},
{str8_lit("memory"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
+42
View File
@@ -1053,10 +1053,52 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
// rjf: determine view ui rule
info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string);
// rjf: find possible table type
E_Type *maybe_table_type = block_type;
for(;;)
{
if(maybe_table_type->kind == E_TypeKind_Lens &&
str8_match(maybe_table_type->name, str8_lit("table"), 0))
{
break;
}
else if(maybe_table_type->kind == E_TypeKind_Lens)
{
maybe_table_type = e_type_from_key__cached(maybe_table_type->direct_type_key);
continue;
}
else
{
break;
}
}
// rjf: fill row's cells
{
if(0){}
// rjf: table rows
else if(maybe_table_type->kind == E_TypeKind_Lens && str8_match(maybe_table_type->name, str8_lit("table"), 0) && maybe_table_type->count >= 1)
{
U64 column_count = maybe_table_type->count;
info.cell_style_key = push_str8f(arena, "table_%I64u_cols", column_count);
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view);
RD_Cfg *style = rd_cfg_child_from_string(view, info.cell_style_key);
RD_Cfg *w_cfg = style->first;
F32 next_pct = 0;
#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)
E_IRTreeAndType *prev_overridden_irtree = e_ir_state->overridden_irtree;
e_ir_state->overridden_irtree = &row->eval.irtree;
for(U64 idx = 0; idx < maybe_table_type->count; idx += 1)
{
E_Eval cell_eval = e_eval_from_expr(arena, maybe_table_type->args[idx]);
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .eval = cell_eval, .default_pct = 1.f/maybe_table_type->count, .pct = take_pct());
}
e_ir_state->overridden_irtree = prev_overridden_irtree;
info.can_expand = 0;
#undef take_pct
}
// rjf: folder / file rows
else if(row->eval.space.kind == E_SpaceKind_FileSystem)
{