mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-01 11:48:10 +00:00
rd: watch window editability progress, implicit root vis rules; eval: fix call args parser
This commit is contained in:
@@ -2065,7 +2065,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
else
|
||||
{
|
||||
E_TokenArray idx_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl);
|
||||
E_Parse arg_parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence);
|
||||
E_Parse arg_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence);
|
||||
e_msg_list_concat_in_place(&result.msgs, &arg_parse.msgs);
|
||||
if(arg_parse.expr != &e_expr_nil)
|
||||
{
|
||||
|
||||
@@ -504,6 +504,12 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
// rjf: unpack expr
|
||||
E_IRTreeAndType expr_irtree = e_irtree_and_type_from_expr(scratch.arena, t->expr);
|
||||
|
||||
// rjf: skip if type info disallows expansion
|
||||
if(!ev_type_key_and_mode_is_expandable(expr_irtree.type_key, expr_irtree.mode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: get expr's lookup rule
|
||||
E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(t->expr, &expr_irtree);
|
||||
E_LookupRule *lookup_rule = lookup_rule_and_tag.rule;
|
||||
@@ -631,6 +637,14 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
if(child_expr != &e_expr_nil)
|
||||
{
|
||||
EV_Key child_key = child_keys[idx];
|
||||
String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, child_key));
|
||||
E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr);
|
||||
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens);
|
||||
for(E_Expr *expr = tag_expr_parse.expr, *next = &e_expr_nil; expr != &e_expr_nil; expr = next)
|
||||
{
|
||||
next = expr->next;
|
||||
e_expr_push_tag(child_expr, expr);
|
||||
}
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
task->parent_block = expansion_block;
|
||||
|
||||
@@ -12342,6 +12342,7 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", cfg->id), expr);
|
||||
if(exe.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr);
|
||||
|
||||
+65
-42
@@ -1581,6 +1581,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);
|
||||
block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, expr);
|
||||
block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree);
|
||||
if(implicit_root && block_ranges.first != 0)
|
||||
{
|
||||
block_ranges.count -= 1;
|
||||
block_ranges.first = block_ranges.first->next;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
@@ -1669,7 +1674,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);
|
||||
cursor_x_range = r1s64(0, (S64)row_info.cells.count-1);
|
||||
}
|
||||
cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count));
|
||||
cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count - implicit_root));
|
||||
|
||||
// rjf: clamp x positions of cursor/mark tbl
|
||||
for EachEnumVal(Axis2, axis)
|
||||
@@ -1761,7 +1766,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));
|
||||
EV_WindowedRowNode *row_node = rows.first;
|
||||
B32 any_edits_started = 0;
|
||||
for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
{
|
||||
EV_Row *row = &row_node->row;
|
||||
RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);
|
||||
@@ -1773,7 +1778,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
continue;
|
||||
}
|
||||
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
|
||||
if(cell_info.can_edit)
|
||||
if(!ev_key_match(ev_key_root(), row->block->key) && cell_info.can_edit)
|
||||
{
|
||||
any_edits_started = 1;
|
||||
String8 string = cell_info.string;
|
||||
@@ -1876,7 +1881,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
taken = 1;
|
||||
EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));
|
||||
EV_WindowedRowNode *row_node = rows.first;
|
||||
for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
{
|
||||
EV_Row *row = &row_node->row;
|
||||
RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);
|
||||
@@ -1939,11 +1944,17 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
case RD_WatchCellKind_Expr:
|
||||
{
|
||||
RD_Cfg *cfg = row_info.group_cfg;
|
||||
if(cfg == &rd_nil_cfg && editing_complete)
|
||||
if(cfg == &rd_nil_cfg && editing_complete && new_string.size != 0)
|
||||
{
|
||||
RD_CfgList all_cfgs = rd_cfg_top_level_list_from_string(scratch.arena, row_info.group_cfg_name);
|
||||
RD_Cfg *new_cfg_parent = rd_cfg_list_last(&all_cfgs)->parent;
|
||||
if(new_cfg_parent == &rd_nil_cfg)
|
||||
{
|
||||
new_cfg_parent = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project"));
|
||||
}
|
||||
cfg = rd_cfg_new(new_cfg_parent, row_info.group_cfg_name);
|
||||
state_dirty = 1;
|
||||
snap_to_cursor = 1;
|
||||
}
|
||||
if(cfg != &rd_nil_cfg)
|
||||
{
|
||||
@@ -1959,6 +1970,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
if(editing_complete)
|
||||
{
|
||||
ev_key_set_view_rule(eval_view, pt.key, new_string);
|
||||
RD_Cfg *cfg = row_info.group_cfg;
|
||||
if(cfg != &rd_nil_cfg && new_string.size != 0)
|
||||
{
|
||||
RD_Cfg *view_rule = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("view_rule"));
|
||||
rd_cfg_new(view_rule, new_string);
|
||||
}
|
||||
else if(cfg != &rd_nil_cfg && new_string.size == 0)
|
||||
{
|
||||
rd_cfg_release(rd_cfg_child_from_string(cfg, str8_lit("view_rule")));
|
||||
}
|
||||
}break;
|
||||
case RD_WatchCellKind_Eval:
|
||||
{
|
||||
@@ -2140,7 +2161,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
B32 next_cursor_set = 0;
|
||||
EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));
|
||||
EV_WindowedRowNode *row_node = rows.first;
|
||||
for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)
|
||||
{
|
||||
EV_Row *row = &row_node->row;
|
||||
RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);
|
||||
@@ -2152,50 +2173,52 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
|
||||
continue;
|
||||
}
|
||||
RD_WatchPt pt = {row->block->key, row->key, rd_id_from_watch_cell(cell)};
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Expr || row_kind == RD_WatchViewRowKind_PrettyEntityControls) &&
|
||||
row_info.collection_entity_kind != RD_EntityKind_Nil)
|
||||
switch(cell->kind)
|
||||
{
|
||||
RD_Entity *entity = row_info.collection_entity;
|
||||
if(!rd_entity_is_nil(entity))
|
||||
default:{}break;
|
||||
case RD_WatchCellKind_Expr:
|
||||
{
|
||||
rd_entity_list_push(scratch.arena, &entities_to_remove, entity);
|
||||
U64 deleted_id = row->key.child_id;
|
||||
U64 deleted_num = row->block->expand_view_rule_info->expr_expand_num_from_id(deleted_id, row->block->expand_view_rule_info_user_data);
|
||||
if(deleted_num != 0)
|
||||
RD_Cfg *cfg = row_info.group_cfg;
|
||||
if(cfg != &rd_nil_cfg)
|
||||
{
|
||||
U64 fallback_id_next = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num+1, row->block->expand_view_rule_info_user_data);
|
||||
U64 fallback_id_prev = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num-1, row->block->expand_view_rule_info_user_data);
|
||||
EV_Key parent_key = row->block->key;
|
||||
EV_Key key = ev_key_make(row->key.parent_hash, fallback_id_next ? fallback_id_next : fallback_id_prev);
|
||||
if(key.child_id == 0)
|
||||
rd_cfg_list_push(scratch.arena, &cfgs_to_remove, cfg);
|
||||
U64 deleted_num = ev_num_from_key(&block_ranges, row->key);
|
||||
if(deleted_num != 0)
|
||||
{
|
||||
key = row->block->key;
|
||||
parent_key = row->block->parent->key;
|
||||
EV_Key parent_key = row->block->parent->key;
|
||||
EV_Key key = row->block->key;
|
||||
EV_Key fallback_key_prev = ev_key_from_num(&block_ranges, deleted_num-1);
|
||||
EV_Key fallback_key_next = ev_key_from_num(&block_ranges, deleted_num+1);
|
||||
if(fallback_key_next.child_id != 0)
|
||||
{
|
||||
parent_key = row->block->key;
|
||||
key = fallback_key_next;
|
||||
}
|
||||
else if(fallback_key_prev.child_id != 0)
|
||||
{
|
||||
parent_key = row->block->key;
|
||||
key = fallback_key_prev;
|
||||
}
|
||||
RD_WatchPt new_pt = {parent_key, key, pt.cell_id};
|
||||
next_cursor_pt = new_pt;
|
||||
next_cursor_set = 1;
|
||||
}
|
||||
RD_WatchPt new_pt = {parent_key, key, 0};
|
||||
next_cursor_pt = new_pt;
|
||||
next_cursor_set = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(tbl.y != 0 && col->kind == RD_WatchViewColumnKind_ViewRule && row_kind == RD_WatchViewRowKind_Normal)
|
||||
{
|
||||
if(row_info.collection_entity_kind != RD_EntityKind_Nil)
|
||||
}break;
|
||||
case RD_WatchCellKind_Tag:
|
||||
{
|
||||
RD_Entity *entity = row_info.collection_entity;
|
||||
RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule);
|
||||
rd_entity_mark_for_deletion(view_rule);
|
||||
}
|
||||
ev_key_set_view_rule(eval_view, row->key, str8_zero());
|
||||
if(row_info.group_cfg != &rd_nil_cfg)
|
||||
{
|
||||
rd_cfg_release(rd_cfg_child_from_string(row_info.group_cfg, str8_lit("view_rule")));
|
||||
}
|
||||
ev_key_set_view_rule(eval_view, row->key, str8_zero());
|
||||
}break;
|
||||
case RD_WatchCellKind_Eval:
|
||||
{
|
||||
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
|
||||
rd_commit_eval_value_string(cell_info.eval, str8_zero(), 0);
|
||||
}break;
|
||||
}
|
||||
else if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Value || col->kind == RD_WatchViewColumnKind_Member) && row_kind == RD_WatchViewRowKind_Normal)
|
||||
{
|
||||
E_Expr *expr = rd_expr_from_watch_view_row_column(scratch.arena, row, col);
|
||||
E_Eval dst_eval = e_eval_from_expr(scratch.arena, expr);
|
||||
rd_commit_eval_value_string(dst_eval, str8_zero(), 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
for(RD_CfgNode *n = cfgs_to_remove.first; n != 0; n = n->next)
|
||||
|
||||
@@ -1014,7 +1014,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
// rjf: bp hovering
|
||||
if(ui_hovering(bp_sig) && !rd_drag_is_active())
|
||||
{
|
||||
RD_RegsScope(.cfg = bp->id) rd_set_hover_regs(RD_RegSlot_Cfg);
|
||||
rd_set_hover_eval(v2f32(bp_box->rect.x0, bp_box->rect.y1-2.f), str8_zero(), txt_pt(0, 0), 0, push_str8f(scratch.arena, "$%I64u", bp->id));
|
||||
// RD_RegsScope(.cfg = bp->id) rd_set_hover_regs(RD_RegSlot_Cfg);
|
||||
}
|
||||
|
||||
// rjf: shift+click => enable breakpoint
|
||||
|
||||
Reference in New Issue
Block a user