diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 29579d20..c27e2e57 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -93,7 +93,7 @@ typedef U64 E_SpaceKind; enum { E_SpaceKind_Null, - E_SpaceKind_FileSystem, + E_SpaceKind_HashStoreKey, E_SpaceKind_FirstUserDefined, }; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 203798f2..8a4ce94b 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1282,7 +1282,7 @@ e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr case E_ExprKind_LeafFilePath: { U128 key = fs_key_from_path_range(expr->string, r1u64(0, max_U64)); - E_Space space = {E_SpaceKind_FileSystem, .u128 = key}; + E_Space space = {E_SpaceKind_HashStoreKey, .u128 = key}; U64 size = fs_size_from_path(expr->string); E_IRNode *base_offset = e_irtree_const_u(arena, 0); E_IRNode *set_space = e_irtree_set_space(arena, space, base_offset); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index dfaf7e46..5797a435 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1049,6 +1049,52 @@ ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key) return result; } +internal U64 +ev_vidx_from_num(EV_BlockRangeList *block_ranges, U64 num) +{ + U64 vidx = 0; + { + U64 base_vidx = 0; + 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; + break; + } + base_num = next_base_num; + base_vidx += dim_1u64(n->v.range); + } + } + return vidx; +} + +internal U64 +ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx) +{ + U64 num = 0; + { + U64 base_vidx = 0; + 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 relative_num = (n->v.block->single_item ? 0 : (vidx - base_vidx)); + num = base_num + relative_num; + break; + } + base_vidx = next_base_vidx; + base_num += (n->v.block->single_item ? 1 : dim_1u64(n->v.range)); + } + } + return num; +} + //////////////////////////////// //~ rjf: Row Building @@ -1126,18 +1172,19 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } scratch_end(scratch); } - EV_Row *row = push_array(arena, EV_Row, 1); - SLLQueuePush(rows.first, rows.last, row); + EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); + SLLQueuePush(rows.first, rows.last, row_node); rows.count += 1; - row->block = n->v.block; - row->key = ev_key_make(ev_hash_from_key(row->block->key), 1); - row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1; - row->visual_size_skipped = num_skipped; - row->visual_size_chopped = num_chopped; - row->string = n->v.block->string; - row->expr = n->v.block->expr; - row->member = member; - row->view_rules = n->v.block->view_rules; + row_node->visual_size_skipped = num_skipped; + row_node->visual_size_chopped = num_chopped; + EV_Row *row = &row_node->row; + row->block = n->v.block; + row->key = ev_key_make(ev_hash_from_key(row->block->key), 1); + row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1; + row->string = n->v.block->string; + row->expr = n->v.block->expr; + row->member = member; + row->view_rules = n->v.block->view_rules; } // rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range @@ -1165,14 +1212,13 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 scratch_end(scratch); } E_Expr *row_expr__resolved = ev_resolved_from_expr(arena, row_expr, row_view_rules); - EV_Row *row = push_array(arena, EV_Row, 1); - SLLQueuePush(rows.first, rows.last, row); + EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); + SLLQueuePush(rows.first, rows.last, row_node); rows.count += 1; + EV_Row *row = &row_node->row; row->block = n->v.block; row->key = row_key; row->visual_size = 1; - row->visual_size_skipped = 0; - row->visual_size_chopped = 0; row->string = expand_range_info.row_strings[idx]; row->expr = row_expr__resolved; row->member = expand_range_info.row_members[idx]; @@ -1205,6 +1251,31 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 return rows; } +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); + 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) + { + result = &rows.first->row; + } + else + { + result = push_array(arena, EV_Row, 1); + } + return result; +} + +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); + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, vidx_range); + return rows; +} + internal String8 ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags) { diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 41b9d403..61fbed78 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -256,29 +256,29 @@ struct EV_BlockRangeList typedef struct EV_Row EV_Row; struct EV_Row { - EV_Row *next; - - // rjf: block hierarchy info EV_Block *block; EV_Key key; - - // rjf: row size/scroll info U64 visual_size; - U64 visual_size_skipped; - U64 visual_size_chopped; - - // rjf: expression / visualization info String8 string; E_Expr *expr; E_Member *member; EV_ViewRuleList *view_rules; }; +typedef struct EV_WindowedRowNode EV_WindowedRowNode; +struct EV_WindowedRowNode +{ + EV_WindowedRowNode *next; + U64 visual_size_skipped; + U64 visual_size_chopped; + EV_Row row; +}; + typedef struct EV_WindowedRowList EV_WindowedRowList; struct EV_WindowedRowList { - EV_Row *first; - EV_Row *last; + EV_WindowedRowNode *first; + EV_WindowedRowNode *last; U64 count; U64 count_before_visual; U64 count_before_semantic; @@ -429,11 +429,15 @@ 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); //////////////////////////////// //~ 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_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); internal B32 ev_row_is_expandable(EV_Row *row); internal B32 ev_row_is_editable(EV_Row *row); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index a449799a..5a97c7f0 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -391,8 +391,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[213] = { str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Right Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Up Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Down Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Left Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Right Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Left Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Right Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Move Up Page"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 381212bd..05128c8d 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -516,8 +516,8 @@ RD_CmdTable: // | | | | {MoveRightSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } {MoveUpSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } {MoveDownSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveLeftChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } {MoveUpChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } {MoveDownChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } {MoveUpPage 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index f718f1be..d3b97378 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2713,7 +2713,7 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) switch(space.kind) { //- rjf: filesystem reads - case E_SpaceKind_FileSystem: + case E_SpaceKind_HashStoreKey: { U128 key = space.u128; U128 hash = hs_hash_from_key(key, 0); @@ -3164,7 +3164,7 @@ rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) U128 result = {0}; switch(space.kind) { - case E_SpaceKind_FileSystem: + case E_SpaceKind_HashStoreKey: { result = space.u128; }break; @@ -3188,7 +3188,7 @@ rd_whole_range_from_eval_space(E_Space space) Rng1U64 result = {0}; switch(space.kind) { - case E_SpaceKind_FileSystem: + case E_SpaceKind_HashStoreKey: { HS_Scope *scope = hs_scope_open(); U128 hash = {0}; @@ -13297,6 +13297,22 @@ rd_frame(void) e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); } + //- rjf: add macro for output log + { + HS_Scope *hs_scope = hs_scope_open(); + U128 key = d_state->output_log_key; + U128 hash = hs_hash_from_key(key, 0); + String8 data = hs_data_from_hash(hs_scope, hash); + E_Space space = e_space_make(E_SpaceKind_HashStoreKey); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + space.u128 = key; + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size); + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("output_log"), expr); + hs_scope_close(hs_scope); + } + //- rjf: add macros for all watches which define identifiers RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); for(RD_CfgNode *n = watches.first; n != 0; n = n->next) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 16886323..4e00fe52 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1464,15 +1464,14 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo mark_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->mark); // rjf: compute row at initial selection point (or just cursor point) - mark_rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, mark_tbl.y), - ui_scroll_list_row_from_item(&row_blocks, mark_tbl.y)+1)); + mark_rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(mark_tbl.y, mark_tbl.y+1)); // rjf: compute legal coordinate range, given selection-defining row Rng1S64 cursor_x_range = r1s64(0, ewv->column_count-1); if(mark_rows.first != 0) { - RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(mark_rows.first); - RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, mark_rows.first, &row_info); + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(&mark_rows.first->row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, &mark_rows.first->row, &row_info); if(row_kind == RD_WatchViewRowKind_PrettyEntityControls) { U64 row_ctrl_count = 0; @@ -1584,11 +1583,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); - EV_Row *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + 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) { + EV_Row *row = &row_node->row; RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); if(row_kind == RD_WatchViewRowKind_Normal) @@ -1623,12 +1622,12 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept) { taken = 1; - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); - EV_Row *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) + 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 && row_node != 0; y += 1, row_node = row_node->next) { // rjf: unpack row info + EV_Row *row = &row_node->row; RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); @@ -1693,11 +1692,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo evt->delta_2s32.y == 0)) { taken = 1; - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); - EV_Row *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + 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) { + EV_Row *row = &row_node->row; RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) @@ -1780,8 +1779,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo case RD_WatchViewColumnKind_Member: case RD_WatchViewColumnKind_Value: { - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, y), - ui_scroll_list_row_from_item(&row_blocks, y)+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(y, y+1)); if(rows.first != 0) { B32 should_commit_asap = editing_complete; @@ -1850,11 +1848,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { taken = 1; String8List strs = {0}; - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); - EV_Row *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) + 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 && row_node != 0; y += 1, row_node = row_node->next) { + EV_Row *row = &row_node->row; for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); @@ -1894,11 +1892,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo RD_EntityList entities_to_remove = {0}; RD_WatchViewPoint next_cursor_pt = {0}; B32 next_cursor_set = 0; - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); - EV_Row *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + 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) { + EV_Row *row = &row_node->row; RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) @@ -2245,7 +2243,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ProfScope("build table") { U64 global_row_idx = rows.count_before_semantic; - for(EV_Row *row = rows.first; row != 0; row = row->next, global_row_idx += 1) + for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, global_row_idx += 1) { //////////////////////// //- rjf: skip header @@ -2259,6 +2257,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //- rjf: unpack row info // ProfBegin("unpack row info"); + EV_Row *row = &row_node->row; U64 row_hash = ev_hash_from_key(row->key); U64 row_depth = ev_depth_from_block(row->block); if(row_depth > 0) @@ -2373,7 +2372,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ui_set_next_pref_width(ui_pct(1, 0)); ui_set_next_pref_height(ui_px(scroll_list_params.row_height_px*row->visual_size, 1.f)); ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); - UI_Box *row_box = ui_build_box_from_stringf(row_flags|(!row->next)*UI_BoxFlag_DrawSideBottom|UI_BoxFlag_Clickable, "row_%I64x", row_hash); + UI_Box *row_box = ui_build_box_from_stringf(row_flags|(!row_node->next)*UI_BoxFlag_DrawSideBottom|UI_BoxFlag_Clickable, "row_%I64x", row_hash); ui_ts_vector_idx += 1; ui_ts_cell_idx = 0;