diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 15e80648..8a311a1b 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -768,7 +768,7 @@ ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num) { key = ev_key_make(ev_hash_from_key(ev_key_root()), 1); } - U64 base_num = 0; + U64 base_num = 1; for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { U64 range_size = n->v.block->single_item ? 1 : dim_1u64(n->v.range); @@ -790,7 +790,7 @@ internal U64 ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key) { U64 result = 0; - U64 base_num = 0; + U64 base_num = 1; for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { U64 hash = ev_hash_from_key(n->v.block->key); @@ -810,45 +810,45 @@ ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key) } internal U64 -ev_vidx_from_num(EV_BlockRangeList *block_ranges, U64 num) +ev_vnum_from_num(EV_BlockRangeList *block_ranges, U64 num) { - U64 vidx = 0; + U64 vnum = 0; { - U64 base_vidx = 0; + U64 base_vnum = 1; U64 base_num = 1; for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { U64 next_base_num = base_num + (n->v.block->single_item ? 1 : dim_1u64(n->v.range)); if(base_num <= num && num < next_base_num) { - U64 relative_vidx = (n->v.block->single_item ? 0 : (num - base_num)); - vidx = base_vidx + relative_vidx; + U64 relative_vnum = (n->v.block->single_item ? 0 : (num - base_num)); + vnum = base_vnum + relative_vnum; break; } base_num = next_base_num; - base_vidx += dim_1u64(n->v.range); + base_vnum += dim_1u64(n->v.range); } } - return vidx; + return vnum; } internal U64 -ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx) +ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vnum) { U64 num = 0; { - U64 base_vidx = 0; + U64 base_vnum = 1; U64 base_num = 1; for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { - U64 next_base_vidx = base_vidx + dim_1u64(n->v.range); - if(base_vidx <= vidx && vidx < next_base_vidx) + U64 next_base_vnum = base_vnum + dim_1u64(n->v.range); + if(base_vnum <= vnum && vnum < next_base_vnum) { - U64 relative_num = (n->v.block->single_item ? 0 : (vidx - base_vidx)); + U64 relative_num = (n->v.block->single_item ? 0 : (vnum - base_vnum)); num = base_num + relative_num; break; } - base_vidx = next_base_vidx; + base_vnum = next_base_vnum; base_num += (n->v.block->single_item ? 1 : dim_1u64(n->v.range)); } } @@ -859,30 +859,30 @@ ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx) //~ rjf: Row Building internal EV_WindowedRowList -ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 visible_range) +ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range) { EV_WindowedRowList rows = {0}; { - U64 visual_idx_off = 0; + U64 base_vnum = 1; for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { // rjf: unpack this block/range pair Rng1U64 block_relative_range = n->v.range; U64 block_num_visual_rows = dim_1u64(block_relative_range); - Rng1U64 block_global_range = r1u64(visual_idx_off, visual_idx_off + block_num_visual_rows); + Rng1U64 block_global_range = r1u64(base_vnum, base_vnum + block_num_visual_rows); // rjf: get skip/chop of global range U64 num_skipped = 0; U64 num_chopped = 0; { - if(visible_range.min > block_global_range.min) + if(vnum_range.min > block_global_range.min) { - num_skipped = (visible_range.min - block_global_range.min); + num_skipped = (vnum_range.min - block_global_range.min); num_skipped = Min(num_skipped, block_num_visual_rows); } - if(visible_range.max < block_global_range.max) + if(vnum_range.max < block_global_range.max) { - num_chopped = (block_global_range.max - visible_range.max); + num_chopped = (block_global_range.max - vnum_range.max); num_chopped = Min(num_chopped, block_num_visual_rows); } } @@ -892,7 +892,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 block_relative_range.max - num_chopped); // rjf: sum & advance - visual_idx_off += block_num_visual_rows; + base_vnum += block_num_visual_rows; rows.count_before_visual += num_skipped; if(block_num_visual_rows != 0 && num_skipped != 0) { @@ -972,7 +972,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 internal EV_Row * ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num) { - U64 vidx = ev_vidx_from_num(block_ranges, num); + U64 vidx = ev_vnum_from_num(block_ranges, num); EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, r1u64(vidx, vidx+1)); EV_Row *result = 0; if(rows.first != 0) @@ -982,6 +982,8 @@ ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList * else { result = push_array(arena, EV_Row, 1); + result->block = &ev_nil_block; + result->expr = &e_expr_nil; } return result; } @@ -989,7 +991,7 @@ ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList * internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range) { - Rng1U64 vidx_range = r1u64(ev_vidx_from_num(block_ranges, num_range.min), ev_vidx_from_num(block_ranges, num_range.max)+1); + Rng1U64 vidx_range = r1u64(ev_vnum_from_num(block_ranges, num_range.min), ev_vnum_from_num(block_ranges, num_range.max)+1); EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, vidx_range); return rows; } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 044dd6a1..0747f963 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -355,13 +355,13 @@ internal EV_BlockRangeList ev_block_range_list_from_tree(Arena *arena, EV_BlockT internal EV_BlockRange ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num); internal EV_Key ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num); internal U64 ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key); -internal U64 ev_vidx_from_num(EV_BlockRangeList *block_ranges, U64 num); -internal U64 ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx); +internal U64 ev_vnum_from_num(EV_BlockRangeList *block_ranges, U64 num); +internal U64 ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx); //////////////////////////////// //~ rjf: Row Building -internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 visible_range); +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 String8 ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index c48ef08b..55471e30 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1510,26 +1510,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); F32 row_string_max_size_px = dim_2f32(rect).x; EV_StringFlags string_flags = 0; -#if 0 // TODO(rjf): @cfg - RD_WatchViewRowCtrl row_ctrls_[] = - { - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity }, - {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_FilePathMap, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_AutoViewRule,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_Nil, CTRL_EntityKind_Machine, RD_CmdKind_FreezeEntity }, - {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_Kill }, - {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_FreezeEntity }, - {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_SelectThread }, - {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_FreezeEntity }, - }; - RD_WatchViewRowCtrl *row_ctrls = row_ctrls_; - U64 row_ctrls_count = ArrayCount(row_ctrls_); -#endif ////////////////////////////// //- rjf: determine autocompletion string @@ -1620,7 +1600,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view EV_Key last_key = points[point_idx].pt_state->key; EV_Key last_parent_key = points[point_idx].pt_state->parent_key; points[point_idx].pt_state[0] = rd_watch_pt_from_tbl(&block_ranges, points[point_idx].pt_tbl); - if(ev_key_match(ev_key_zero(), points[point_idx].pt_state->key)) + if(ev_key_match(ev_key_zero(), points[point_idx].pt_state->key) && points[point_idx].pt_tbl.y != 0) { points[point_idx].pt_state->key = last_parent_key; EV_ExpandNode *node = ev_expand_node_from_key(eval_view, last_parent_key); @@ -1659,9 +1639,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view { EV_Row *row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, mark_tbl.y); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); - cursor_x_range = r1s64(0, (S64)row_info.cells.count); + 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-1)); + cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count)); // rjf: clamp x positions of cursor/mark tbl for EachEnumVal(Axis2, axis) @@ -1680,36 +1660,30 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view // if(snap_to_cursor) { - Rng1S64 item_range = r1s64(0, block_tree.total_item_count); - Rng1S64 row_range = r1s64(0, block_tree.total_row_count); - Rng1S64 scroll_row_idx_range = r1s64(row_range.min, ClampBot(row_range.min, row_range.max-1)); - S64 cursor_item_idx = cursor_tbl.y; - if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) + Rng1S64 global_vnum_range = r1s64(1, block_tree.total_row_count+1); + if(contains_1s64(global_vnum_range, cursor_tbl.y)) { UI_ScrollPt *scroll_pt = &scroll_pos.y; //- rjf: compute visible row range - Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0), - scroll_pt->idx + 0 + num_possible_visible_rows); + Rng1S64 visible_row_num_range = r1s64(scroll_pt->idx + 1 - !!(scroll_pt->off < 0), + scroll_pt->idx + 1 + num_possible_visible_rows); //- rjf: compute cursor row range from cursor item - Rng1S64 cursor_visibility_row_range = {0}; - if(row_blocks.count == 0) - { - cursor_visibility_row_range = r1s64(cursor_item_idx-2, cursor_item_idx+3); - } - else - { - cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&row_blocks, (U64)cursor_item_idx) - 1; - cursor_visibility_row_range.max = cursor_visibility_row_range.min + 3; - } + Rng1S64 cursor_visibility_row_num_range = {0}; + cursor_visibility_row_num_range.min = ev_vnum_from_num(&block_ranges, cursor_tbl.y) - 1; + cursor_visibility_row_num_range.max = cursor_visibility_row_num_range.min + 3; //- rjf: compute deltas & apply - S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min); - S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max); - S64 new_idx = scroll_pt->idx+min_delta+max_delta; - new_idx = clamp_1s64(scroll_row_idx_range, new_idx); - ui_scroll_pt_target_idx(scroll_pt, new_idx); + S64 min_delta = Min(0, cursor_visibility_row_num_range.min-visible_row_num_range.min); + S64 max_delta = Max(0, cursor_visibility_row_num_range.max-visible_row_num_range.max); + S64 new_num = (S64)scroll_pt->idx + 1 + min_delta + max_delta; + new_num = clamp_1s64(global_vnum_range, new_num); + if(new_num > 0) + { + U64 new_idx = (U64)(new_num - 1); + ui_scroll_pt_target_idx(scroll_pt, new_idx); + } } } @@ -2406,7 +2380,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view scroll_list_params.dim_px = dim_2f32(rect); scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(ewv->column_count-1, block_tree.total_item_count)); scroll_list_params.item_range = r1s64(0, block_tree.total_row_count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 0; + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; scroll_list_params.row_blocks = row_blocks; } UI_BoxFlags disabled_flags = ui_top_flags(); @@ -2431,7 +2405,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view // EV_WindowedRowList rows = {0}; { - rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(visible_row_rng.min, visible_row_rng.max + 1)); + rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(visible_row_rng.min+1, visible_row_rng.max+2)); } //////////////////////////// @@ -2449,7 +2423,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view EV_Row *row = &row_node->row; U64 row_hash = ev_hash_from_key(row->key); U64 row_depth = ev_depth_from_block(row->block); - B32 row_selected = (selection_tbl.min.y <= global_row_idx && global_row_idx <= selection_tbl.max.y); + B32 row_selected = (selection_tbl.min.y <= global_row_idx+1 && global_row_idx+1 <= selection_tbl.max.y); B32 row_expanded = ev_expansion_from_key(eval_view, row->key); B32 next_row_expanded = row_expanded; RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);