diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 7144bc0e..7350f4d3 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -200,6 +200,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) E_MemberArray *members = &accel->members; result.row_exprs_count = Min(needed_row_count, members->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -217,6 +218,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) E_EnumValArray *enumvals = &accel->enum_vals; result.row_exprs_count = Min(needed_row_count, enumvals->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -234,6 +236,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; result.row_exprs_count = Min(needed_row_count, accel->array_count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -249,6 +252,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) { result.row_exprs_count = 1; result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); result.row_exprs[0] = e_expr_ref_deref(arena, expr); result.row_members[0] = &e_member_nil; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 5d84331a..1b19ef36 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1023,7 +1023,7 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 row->visual_size = 1; row->visual_size_skipped = 0; // TODO(rjf) row->visual_size_chopped = 0; // TODO(rjf) - row->string = n->v.block->string; + row->string = expand_range_info.row_strings[idx]; row->expr = row_expr__resolved; row->member = expand_range_info.row_members[idx]; row->view_rules = row_view_rules; diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 47360a24..10ce0216 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -173,6 +173,7 @@ typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo; struct EV_ExpandRangeInfo { U64 row_exprs_count; + String8 *row_strings; E_Expr **row_exprs; E_Member **row_members; }; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ba32f09a..96c9ad07 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -7920,6 +7920,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->entities.count+1); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -7927,6 +7928,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) if(entity_idx < accel->entities.count) { result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->entities.v[entity_idx]->string); + result.row_strings[row_expr_idx] = accel->entities.v[entity_idx]->string; } else { @@ -7995,6 +7997,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals) U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -8032,6 +8035,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers) U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -8286,6 +8290,7 @@ rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *vie U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->entities.count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -8369,6 +8374,7 @@ rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->entities.count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { @@ -8431,6 +8437,7 @@ rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View U64 needed_row_count = dim_1u64(idx_range); result.row_exprs_count = Min(needed_row_count, accel->items.count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 1c1cc2e5..ca3bf3c3 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -811,7 +811,39 @@ rd_tbl_from_watch_view_point(EV2_BlockRangeList *block_ranges, RD_WatchViewPoint return tbl; } -//- rjf: table coordinates -> strings +//- rjf: table coordinates -> entities in collectons + +internal RD_WatchViewCollectionInfo +rd_collection_info_from_num(EV2_BlockRangeList *block_ranges, S64 num) +{ + Temp scratch = scratch_begin(0, 0); + EV2_Block *block = ev2_block_range_from_num(block_ranges, num).block; + EV_Key key = ev2_key_from_num(block_ranges, num); + U64 block_relative_num = block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, block->expand_view_rule_info_user_data); + RD_EntityKind collection_entity_kind = RD_EntityKind_Nil; + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, block->expr); + E_Type *type = e_type_from_key(scratch.arena, irtree.type_key); + for EachElement(idx, rd_collection_name_table) + { + if(str8_match(type->name, rd_collection_name_table[idx], 0)) + { + collection_entity_kind = rd_collection_entity_kind_table[idx]; + break; + } + } + RD_EntityList entities_list = rd_query_cached_entity_list_with_kind(collection_entity_kind); + RD_EntityArray entities = rd_entity_array_from_list(scratch.arena, &entities_list); + RD_Entity *entity = &d_nil_entity; + if(0 < block_relative_num && block_relative_num <= entities.count) + { + entity = entities.v[block_relative_num-1]; + } + RD_WatchViewCollectionInfo info = {block, key, collection_entity_kind, entity}; + scratch_end(scratch); + return info; +} + +//- rjf: row/column -> strings internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV2_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px) @@ -977,7 +1009,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo String8 filter = rd_view_filter(); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); - RD_EntityKind mutable_entity_kind = RD_EntityKind_Nil; F32 row_string_max_size_px = dim_2f32(rect).x; EV_StringFlags string_flags = 0; if(flags & RD_WatchViewFlag_PrettyNameMembers) @@ -1425,6 +1456,23 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo case RD_WatchViewColumnKind_Expr: if(modifiable && filter.size == 0) { + RD_WatchViewCollectionInfo collection_info = rd_collection_info_from_num(&block_ranges, tbl.y); + if(collection_info.kind != RD_EntityKind_Nil) + { + RD_Entity *entity = collection_info.entity; + if(!rd_entity_is_nil(entity) || editing_complete) + { + if(rd_entity_is_nil(entity)) + { + entity = rd_entity_alloc(rd_entity_root(), collection_info.kind); + } + rd_entity_equip_cfg_src(entity, RD_CfgSrc_Project); + rd_entity_equip_name(entity, new_string); + state_dirty = 1; + snap_to_cursor = 1; + } + } +#if 0 // TODO(rjf): @blocks RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); if(!rd_entity_is_nil(watch)) @@ -1443,6 +1491,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo state_dirty = 1; snap_to_cursor = 1; } +#endif }break; case RD_WatchViewColumnKind_Member: case RD_WatchViewColumnKind_Value: @@ -1472,6 +1521,27 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); ev_key_set_view_rule(eval_view, pt.key, new_string); + RD_WatchViewCollectionInfo collection_info = rd_collection_info_from_num(&block_ranges, tbl.y); + if(collection_info.kind != RD_EntityKind_Nil) + { + RD_Entity *entity = collection_info.entity; + RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule); + if(rd_entity_is_nil(view_rule) && new_string.size != 0) + { + view_rule = rd_entity_alloc(entity, RD_EntityKind_ViewRule); + } + else if(!rd_entity_is_nil(view_rule) && new_string.size == 0) + { + rd_entity_mark_for_deletion(view_rule); + } + if(new_string.size != 0) + { + rd_entity_equip_name(view_rule, new_string); + } + state_dirty = 1; + snap_to_cursor = 1; + } +#if 0 // TODO(rjf): @msgs RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); RD_Entity *view_rule = rd_entity_child_from_kind(watch, RD_EntityKind_ViewRule); if(new_string.size != 0 && rd_entity_is_nil(view_rule)) @@ -1488,6 +1558,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } state_dirty = 1; snap_to_cursor = 1; +#endif }break; } } @@ -1549,49 +1620,98 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo snap_to_cursor = 1; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1) { - RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y)); - - // rjf: row deletions - if(selection_tbl.min.x <= 0) + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { - RD_WatchViewPoint fallback_pt_prev = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y - 1)); - RD_WatchViewPoint fallback_pt_next = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y + 1)); - RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - if(!rd_entity_is_nil(watch)) + Vec2S64 tbl = v2s64(x, y); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + switch(col->kind) { - EV_Key new_cursor_key = empty_row_key; - EV_Key new_cursor_parent_key = empty_row_parent_key; - if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && !ev_key_match(ev_key_zero(), fallback_pt_prev.key)) + case RD_WatchViewColumnKind_Value: + case RD_WatchViewColumnKind_Type: + {}break; + default: + case RD_WatchViewColumnKind_Expr: { - RD_Entity *fallback_watch = rd_entity_from_ev_key_and_kind(fallback_pt_prev.key, mutable_entity_kind); - if(!rd_entity_is_nil(fallback_watch)) + RD_WatchViewCollectionInfo collection_info = rd_collection_info_from_num(&block_ranges, tbl.y); + if(collection_info.kind != RD_EntityKind_Nil) { - new_cursor_key = fallback_pt_prev.key; - new_cursor_parent_key = rd_parent_ev_key_from_entity(fallback_watch); + RD_Entity *entity = collection_info.entity; + rd_entity_mark_for_deletion(entity); + U64 deleted_id = collection_info.key.child_id; + U64 deleted_num = collection_info.block->expand_view_rule_info->expr_expand_num_from_id(deleted_id, collection_info.block->expand_view_rule_info_user_data); + if(deleted_num != 0) + { + U64 fallback_id_next = collection_info.block->expand_view_rule_info->expr_expand_id_from_num(deleted_num+1, collection_info.block->expand_view_rule_info_user_data); + U64 fallback_id_prev = collection_info.block->expand_view_rule_info->expr_expand_id_from_num(deleted_num-1, collection_info.block->expand_view_rule_info_user_data); + EV_Key parent_key = collection_info.block->key; + EV_Key key = ev_key_make(collection_info.key.parent_hash, fallback_id_next ? fallback_id_next : fallback_id_prev); + if(key.child_id == 0) + { + key = collection_info.block->key; + parent_key = collection_info.block->parent->key; + } + RD_WatchViewPoint new_pt = {0, parent_key, key}; + ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_pt; + } } - } - else if(!ev_key_match(ev_key_zero(), fallback_pt_next.key)) + }break; + case RD_WatchViewColumnKind_ViewRule: { - RD_Entity *fallback_watch = rd_entity_from_ev_key_and_kind(fallback_pt_next.key, mutable_entity_kind); - if(!rd_entity_is_nil(fallback_watch)) + RD_WatchViewCollectionInfo collection_info = rd_collection_info_from_num(&block_ranges, tbl.y); + if(collection_info.kind != RD_EntityKind_Nil) { - new_cursor_key = fallback_pt_next.key; - new_cursor_parent_key = rd_parent_ev_key_from_entity(fallback_watch); + RD_Entity *entity = collection_info.entity; + RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule); + rd_entity_mark_for_deletion(view_rule); } - } - RD_WatchViewPoint new_cursor_pt = {0, new_cursor_parent_key, new_cursor_key}; - rd_entity_mark_for_deletion(watch); - ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt; + }break; } - } - - // rjf: view rule deletions - else if(selection_tbl.min.x <= RD_WatchViewColumnKind_ViewRule && RD_WatchViewColumnKind_ViewRule <= selection_tbl.max.x) - { - RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - RD_Entity *view_rule = rd_entity_child_from_kind(watch, RD_EntityKind_ViewRule); - rd_entity_mark_for_deletion(view_rule); - ev_key_set_view_rule(eval_view, pt.key, str8_zero()); + +#if 0 // TODO(rjf): @msgs + // rjf: row deletions + if(selection_tbl.min.x <= 0) + { + RD_WatchViewPoint fallback_pt_prev = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y - 1)); + RD_WatchViewPoint fallback_pt_next = rd_watch_view_point_from_tbl(&block_ranges, v2s64(0, y + 1)); + RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); + if(!rd_entity_is_nil(watch)) + { + EV_Key new_cursor_key = empty_row_key; + EV_Key new_cursor_parent_key = empty_row_parent_key; + if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && !ev_key_match(ev_key_zero(), fallback_pt_prev.key)) + { + RD_Entity *fallback_watch = rd_entity_from_ev_key_and_kind(fallback_pt_prev.key, mutable_entity_kind); + if(!rd_entity_is_nil(fallback_watch)) + { + new_cursor_key = fallback_pt_prev.key; + new_cursor_parent_key = rd_parent_ev_key_from_entity(fallback_watch); + } + } + else if(!ev_key_match(ev_key_zero(), fallback_pt_next.key)) + { + RD_Entity *fallback_watch = rd_entity_from_ev_key_and_kind(fallback_pt_next.key, mutable_entity_kind); + if(!rd_entity_is_nil(fallback_watch)) + { + new_cursor_key = fallback_pt_next.key; + new_cursor_parent_key = rd_parent_ev_key_from_entity(fallback_watch); + } + } + RD_WatchViewPoint new_cursor_pt = {0, new_cursor_parent_key, new_cursor_key}; + rd_entity_mark_for_deletion(watch); + ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt; + } + } + + // rjf: view rule deletions + else if(selection_tbl.min.x <= RD_WatchViewColumnKind_ViewRule && RD_WatchViewColumnKind_ViewRule <= selection_tbl.max.x) + { + RD_Entity *watch = rd_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); + RD_Entity *view_rule = rd_entity_child_from_kind(watch, RD_EntityKind_ViewRule); + rd_entity_mark_for_deletion(view_rule); + ev_key_set_view_rule(eval_view, pt.key, str8_zero()); + } +#endif } } } diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 22f3e66a..337c570e 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -101,6 +101,15 @@ struct RD_WatchViewPoint EV_Key key; }; +typedef struct RD_WatchViewCollectionInfo RD_WatchViewCollectionInfo; +struct RD_WatchViewCollectionInfo +{ + EV2_Block *block; + EV_Key key; + RD_EntityKind kind; + RD_Entity *entity; +}; + typedef struct RD_WatchViewTextEditState RD_WatchViewTextEditState; struct RD_WatchViewTextEditState { @@ -157,7 +166,10 @@ internal B32 rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b) internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV2_BlockRangeList *block_ranges, Vec2S64 tbl); internal Vec2S64 rd_tbl_from_watch_view_point(EV2_BlockRangeList *block_ranges, RD_WatchViewPoint pt); -//- rjf: table coordinates -> strings +//- rjf: table coordinates -> entities in collectons +internal RD_WatchViewCollectionInfo rd_collection_info_from_num(EV2_BlockRangeList *block_ranges, S64 num); + +//- rjf: row/column -> strings internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV2_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); //- rjf: table coordinates -> text edit state