correct collection editing/deletion/reordering/etc. with new watch visualization system

This commit is contained in:
Ryan Fleury
2024-09-26 16:08:35 -07:00
parent 2fdfeec467
commit 73c37b4d8b
6 changed files with 182 additions and 38 deletions
@@ -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;
@@ -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;
@@ -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;
};
+7
View File
@@ -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)
{
+156 -36
View File
@@ -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
}
}
}
+13 -1
View File
@@ -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