diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index a667c053..64b568bd 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -370,12 +370,12 @@ df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray } //////////////////////////////// -//~ rjf: Eval/Watch Views +//~ rjf: Watch Views //- rjf: eval watch view instance -> eval view key internal DF_EvalViewKey -df_eval_view_key_from_eval_watch_view(DF_EvalWatchViewState *ewv) +df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv) { DF_EvalViewKey key = df_eval_view_key_make((U64)ewv, df_hash_from_string(str8_struct(&ewv))); return key; @@ -384,7 +384,7 @@ df_eval_view_key_from_eval_watch_view(DF_EvalWatchViewState *ewv) //- rjf: root allocation/deallocation/mutation internal DF_EvalRoot * -df_eval_root_alloc(DF_View *view, DF_EvalWatchViewState *ews) +df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews) { DF_EvalRoot *result = ews->first_free_root; if(result != 0) @@ -404,7 +404,7 @@ df_eval_root_alloc(DF_View *view, DF_EvalWatchViewState *ews) } internal void -df_eval_root_release(DF_EvalWatchViewState *ews, DF_EvalRoot *root) +df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root) { DLLRemove(ews->first_root, ews->last_root, root); SLLStackPush(ews->first_free_root, root); @@ -419,7 +419,7 @@ df_eval_root_equip_string(DF_EvalRoot *root, String8 string) } internal DF_EvalRoot * -df_eval_root_from_string(DF_EvalWatchViewState *ews, String8 string) +df_eval_root_from_string(DF_WatchViewState *ews, String8 string) { DF_EvalRoot *root = 0; for(DF_EvalRoot *r = ews->first_root; r != 0; r = r->next) @@ -435,7 +435,7 @@ df_eval_root_from_string(DF_EvalWatchViewState *ews, String8 string) } internal DF_EvalRoot * -df_eval_root_from_expand_key(DF_EvalWatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key) +df_eval_root_from_expand_key(DF_WatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key) { DF_EvalRoot *root = 0; for(DF_EvalRoot *r = ews->first_root; r != 0; r = r->next) @@ -475,7 +475,7 @@ df_expand_key_from_eval_root(DF_EvalRoot *root) //- rjf: windowed watch tree visualization (both single-line and multi-line) internal DF_EvalVizBlockList -df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_EvalWatchViewState *ews) +df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -490,7 +490,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //- rjf: mutable watch fill -> build blocks from top-level mutable root expressions // default: - case DF_EvalWatchViewFillKind_Mutable: + case DF_WatchViewFillKind_Mutable: { for(DF_EvalRoot *root = ews->first_root; root != 0; root = root->next) { @@ -509,7 +509,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //////////////////////////// //- rjf: registers fill -> build blocks via iterating all registers/aliases as root-level expressions // - case DF_EvalWatchViewFillKind_Registers: + case DF_WatchViewFillKind_Registers: { DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); Architecture arch = df_architecture_from_entity(thread); @@ -547,7 +547,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //////////////////////////// //- rjf: locals fill -> build blocks via iterating all locals as root-level expressions // - case DF_EvalWatchViewFillKind_Locals: + case DF_WatchViewFillKind_Locals: { U64 num = 1; for(EVAL_String2NumMapNode *n = parse_ctx->locals_map->first; n != 0; n = n->order_next, num += 1) @@ -567,10 +567,10 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //////////////////////////// //- rjf: debug info table fill -> build split debug info table blocks // - case DF_EvalWatchViewFillKind_Globals: dbgi_target = DBGI_FuzzySearchTarget_GlobalVariables; goto dbgi_table; - case DF_EvalWatchViewFillKind_ThreadLocals: dbgi_target = DBGI_FuzzySearchTarget_ThreadVariables; goto dbgi_table; - case DF_EvalWatchViewFillKind_Types: dbgi_target = DBGI_FuzzySearchTarget_UDTs; goto dbgi_table; - case DF_EvalWatchViewFillKind_Procedures: dbgi_target = DBGI_FuzzySearchTarget_Procedures; goto dbgi_table; + case DF_WatchViewFillKind_Globals: dbgi_target = DBGI_FuzzySearchTarget_GlobalVariables; goto dbgi_table; + case DF_WatchViewFillKind_ThreadLocals: dbgi_target = DBGI_FuzzySearchTarget_ThreadVariables; goto dbgi_table; + case DF_WatchViewFillKind_Types: dbgi_target = DBGI_FuzzySearchTarget_UDTs; goto dbgi_table; + case DF_WatchViewFillKind_Procedures: dbgi_target = DBGI_FuzzySearchTarget_Procedures; goto dbgi_table; dbgi_table:; { //- rjf: unpack context @@ -699,7 +699,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //- rjf: eval/watch views main hooks internal void -df_eval_watch_view_init(DF_EvalWatchViewState *ewv, DF_View *view, DF_EvalWatchViewFillKind fill_kind) +df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind) { if(ewv->initialized == 0) { @@ -713,7 +713,7 @@ df_eval_watch_view_init(DF_EvalWatchViewState *ewv, DF_View *view, DF_EvalWatchV } internal void -df_eval_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalWatchViewState *ewv, DF_CmdList *cmds) +df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, DF_CmdList *cmds) { for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) { @@ -745,7 +745,7 @@ df_eval_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalWa } internal void -df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalWatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect) +df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect) { ProfBeginFunction(); DBGI_Scope *scope = dbgi_scope_open(); @@ -755,7 +755,6 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: unpack arguments // F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); - F32 code_font_size = df_font_size_from_slot(ws, DF_FontSlot_Code); DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); @@ -830,13 +829,63 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW // Vec2S64 cursor_tbl = {0}; Vec2S64 mark_tbl = {0}; + Rng2S64 selection_tbl = {0}; { cursor_tbl.x = ewv->cursor.column_kind; cursor_tbl.y = df_row_num_from_viz_block_list_key(&blocks, ewv->cursor.key); mark_tbl.x = ewv->mark.column_kind; mark_tbl.y = df_row_num_from_viz_block_list_key(&blocks, ewv->mark.key); + mark_tbl = cursor_tbl; + selection_tbl = r2s64p(Min(cursor_tbl.x, mark_tbl.x), Min(cursor_tbl.y, mark_tbl.y), + Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y)); } +#if 0 + ////////////////////////////// + //- rjf: consume events & perform navigations/edits + // + UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) + { + Vec2S64 cursor = cursor_tbl; + Vec2S64 mark = mark_tbl; + UI_EventList *events = ui_events(); + for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) + { + next = n->next; + UI_Event *evt = &n->v; + B32 taken = 0; + + //- rjf: navigations + switch(evt->delta_unit) + { + case UI_EventDeltaUnit_Char: + { + + }break; + case UI_EventDeltaUnit_Line: + { + + }break; + case UI_EventDeltaUnit_Whole: + { + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1)) + { + cursor.v[axis] = (evt->delta_2s32.v[axis]>0 ? params->cursor_range.max.v[axis] : evt->delta_2s32.v[axis]<0 ? params->cursor_range.min.v[axis] + !!params->cursor_min_is_empty_selection[axis] : cursor.v[axis]); + } + }break; + } + + //- rjf: consume + if(taken) + { + ui_eat_event(events, n); + } + } + cursor_tbl = cursor; + mark_tbl = mark; + } +#endif + ////////////////////////////// //- rjf: do start/end editing interaction // @@ -845,7 +894,6 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW B32 edit_commit = 0; B32 edit_end = 0; B32 edit_submit = 0; - String8 edit_autocomplete_string = {0}; UI_Focus(UI_FocusKind_On) { if(!ewv->input_editing && ui_is_focus_active()) @@ -881,20 +929,6 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW edit_commit = 1; edit_submit = 1; } -#if 0 - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.flags & UI_EventFlag_ReplaceAndCommit) - { - edit_commit = 1; - edit_end = 1; - edit_autocomplete_string = n->v.insertion; - ui_nav_eat_action_node(nav_actions, n); - break; - } - } -#endif } } @@ -938,7 +972,11 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, ewv->input_editing ? 0 : &cursor_tbl, &visible_row_rng, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, + ewv->input_editing ? 0 : &cursor_tbl, + 0, + &visible_row_rng, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "table_header") { @@ -988,7 +1026,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: viz blocks -> rows DF_EvalVizWindowedRowList rows = {0}; { - rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, code_font_size, r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); + rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); } //- rjf: build table @@ -1001,7 +1039,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW U64 row_hash = df_hash_from_expand_key(row->key); U64 expr_hash = df_hash_from_string(row->display_expr); df_expand_tree_table_animate(&eval_view->expand_tree_table, df_dt()); - B32 row_selected = ((semantic_idx+1) == cursor_tbl.y); + B32 row_selected = (selection_tbl.min.y <= (semantic_idx+1) && (semantic_idx+1) <= selection_tbl.max.y); B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); //- rjf: determine if row's data is fresh and/or bad @@ -1068,7 +1106,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW if(ui_pressed(sig)) { edit_commit = edit_commit || (!row_selected && ewv->input_editing); - next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Expr, (semantic_idx+1)); + next_cursor_tbl = v2s64(DF_WatchViewColumnKind_Expr, (semantic_idx+1)); pressed = 1; } @@ -1144,7 +1182,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: expression ProfScope("expr") { - B32 cell_selected = (row_selected && cursor_tbl.x == DF_EvalWatchViewColumnKind_Expr); + B32 cell_selected = (row_selected && selection_tbl.min.x <= DF_WatchViewColumnKind_Expr && DF_WatchViewColumnKind_Expr <= selection_tbl.max.x); B32 can_edit_expr = !(row->depth > 0 || modifiable == 0); // rjf: begin editing @@ -1278,7 +1316,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW if(ui_pressed(sig)) { edit_commit = edit_commit || (!cell_selected && ewv->input_editing); - next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Expr, (semantic_idx+1)); + next_cursor_tbl = v2s64(DF_WatchViewColumnKind_Expr, (semantic_idx+1)); pressed = 1; } @@ -1309,7 +1347,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: value ProfScope("value") { - B32 cell_selected = (row_selected && cursor_tbl.x == DF_EvalWatchViewColumnKind_Value); + B32 cell_selected = (row_selected && selection_tbl.min.x <= DF_WatchViewColumnKind_Value && DF_WatchViewColumnKind_Value <= selection_tbl.max.x); B32 value_is_error = (row->eval.errors.count != 0); B32 value_is_hook = (!value_is_error && row->value_ui_rule_spec != &df_g_nil_gfx_view_rule_spec && row->value_ui_rule_spec != 0); B32 value_is_complex = (!value_is_error && !value_is_hook && !(row->flags & DF_EvalVizRowFlag_CanEditValue)); @@ -1390,7 +1428,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); - next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Value, (semantic_idx+1)); + next_cursor_tbl = v2s64(DF_WatchViewColumnKind_Value, (semantic_idx+1)); } // rjf: double-click -> start editing @@ -1408,7 +1446,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: type ProfScope("type") { - B32 cell_selected = (row_selected && cursor_tbl.x == DF_EvalWatchViewColumnKind_Type); + B32 cell_selected = (row_selected && selection_tbl.min.x <= DF_WatchViewColumnKind_Type && DF_WatchViewColumnKind_Type <= selection_tbl.max.x); UI_TableCell UI_Font(code_font) UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_FocusActive((cell_selected && ewv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) @@ -1426,7 +1464,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); - next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Type, (semantic_idx+1)); + next_cursor_tbl = v2s64(DF_WatchViewColumnKind_Type, (semantic_idx+1)); } } } @@ -1434,7 +1472,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: view rule ProfScope("view rule") { - B32 cell_selected = (row_selected && cursor_tbl.x == DF_EvalWatchViewColumnKind_ViewRule); + B32 cell_selected = (row_selected && selection_tbl.min.x <= DF_WatchViewColumnKind_ViewRule && DF_WatchViewColumnKind_ViewRule <= selection_tbl.max.x); String8 view_rule = df_eval_view_rule_from_key(eval_view, row->key); // rjf: begin editing @@ -1464,7 +1502,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); - next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_ViewRule, (semantic_idx+1)); + next_cursor_tbl = v2s64(DF_WatchViewColumnKind_ViewRule, (semantic_idx+1)); } // rjf: double-click -> begin editing @@ -1509,22 +1547,22 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: commit edits // { - DF_EvalWatchViewColumnKind commit_column = (DF_EvalWatchViewColumnKind)cursor_tbl.x; + DF_WatchViewColumnKind commit_column = (DF_WatchViewColumnKind)cursor_tbl.x; + if(!MemoryMatchStruct(&cursor_tbl, &next_cursor_tbl)) + { + mark_tbl = next_cursor_tbl; + } cursor_tbl = next_cursor_tbl; if(commit_row != 0 && edit_commit) { ewv->input_editing = 0; String8 commit_string = str8(ewv->input_buffer, ewv->input_size); - if(edit_autocomplete_string.size != 0) - { - commit_string = edit_autocomplete_string; - } switch(commit_column) { default:break; //- rjf: expression commits - case DF_EvalWatchViewColumnKind_Expr: if(modifiable) + case DF_WatchViewColumnKind_Expr: if(modifiable) { if(commit_string.size == 0) { @@ -1553,7 +1591,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW }break; //- rjf: value commits - case DF_EvalWatchViewColumnKind_Value: + case DF_WatchViewColumnKind_Value: { Temp scratch = scratch_begin(0, 0); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, ¯o_map, commit_string); @@ -1569,12 +1607,12 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW }break; //- rjf: type commits - case DF_EvalWatchViewColumnKind_Type: + case DF_WatchViewColumnKind_Type: { }break; //- rjf: view rule commits - case DF_EvalWatchViewColumnKind_ViewRule: + case DF_WatchViewColumnKind_ViewRule: { df_eval_view_set_key_rule(eval_view, commit_row->key, commit_string); }break; @@ -1613,7 +1651,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW // struct { - DF_EvalWatchViewPoint *pt_state; + DF_WatchViewPoint *pt_state; Vec2S64 pt_tbl; } points[] = @@ -1625,7 +1663,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { DF_ExpandKey last_key = points[point_idx].pt_state->key; DF_ExpandKey last_parent_key = points[point_idx].pt_state->parent_key; - points[point_idx].pt_state->column_kind= (DF_EvalWatchViewColumnKind)points[point_idx].pt_tbl.x; + points[point_idx].pt_state->column_kind= (DF_WatchViewColumnKind)points[point_idx].pt_tbl.x; points[point_idx].pt_state->key = df_key_from_viz_block_list_row_num(&blocks, points[point_idx].pt_tbl.y); points[point_idx].pt_state->parent_key = df_parent_key_from_viz_block_list_row_num(&blocks, points[point_idx].pt_tbl.y); if(df_expand_key_match(df_expand_key_zero(), points[point_idx].pt_state->key)) @@ -1902,7 +1940,13 @@ DF_VIEW_UI_FUNCTION_DEF(Commands) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { //- rjf: build buttons @@ -2346,7 +2390,13 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &ps->cursor, &visible_row_range, &scroll_list_sig) + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &ps->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { // rjf: up-one-directory button (at idx 0) @@ -2579,7 +2629,12 @@ DF_VIEW_UI_FUNCTION_DEF(SystemProcesses) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { //- rjf: build rows @@ -2738,7 +2793,12 @@ DF_VIEW_UI_FUNCTION_DEF(EntityLister) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { for(S64 idx = visible_row_range.min; @@ -2882,7 +2942,12 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &slv->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &slv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_Font(df_font_from_slot(DF_FontSlot_Code)) { @@ -3102,7 +3167,12 @@ DF_VIEW_UI_FUNCTION_DEF(Target) Vec2S64 next_cursor = tv->cursor; UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, tv->input_editing ? 0 : &tv->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + tv->input_editing ? 0 : &tv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { next_cursor = tv->cursor; @@ -3344,7 +3414,12 @@ DF_VIEW_UI_FUNCTION_DEF(Targets) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { // rjf: add new ctrl @@ -3575,7 +3650,12 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, fpms->input_editing ? 0 : &fpms->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + fpms->input_editing ? 0 : &fpms->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") { @@ -3893,7 +3973,12 @@ DF_VIEW_UI_FUNCTION_DEF(AutoViewRules) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, avrs->input_editing ? 0 : &avrs->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + avrs->input_editing ? 0 : &avrs->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") { @@ -4179,7 +4264,12 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(0, 0, "scheduler_table") { @@ -4348,6 +4438,7 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) { B32 initialized; Vec2S64 cursor; + Vec2S64 mark; F32 selection_col_pct; F32 module_col_pct; F32 function_name_col_pct; @@ -4376,7 +4467,12 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cs->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cs->cursor, + &cs->mark, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { Vec2S64 next_cursor = cs->cursor; @@ -4706,7 +4802,12 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, mv->txt_editing ? 0 : &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + mv->txt_editing ? 0 : &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "modules_table") { @@ -6955,8 +7056,8 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_VIEW_SETUP_FUNCTION_DEF(Watch) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Mutable); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Mutable); // rjf: add roots for watches { @@ -6988,7 +7089,7 @@ DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) { Temp scratch = scratch_begin(&arena, 1); String8List strs = {0}; - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); { @@ -7018,16 +7119,16 @@ DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) DF_VIEW_CMD_FUNCTION_DEF(Watch) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_cmds(ws, panel, view, ewv, cmds); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_cmds(ws, panel, view, ewv, cmds); ProfEnd(); } DF_VIEW_UI_FUNCTION_DEF(Watch) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_build(ws, panel, view, ewv, 1*(view->query_string_size == 0), 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_build(ws, panel, view, ewv, 1*(view->query_string_size == 0), 10, rect); ProfEnd(); } @@ -7040,9 +7141,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Locals) {} DF_VIEW_UI_FUNCTION_DEF(Locals) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Locals); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Locals); + df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); ProfEnd(); } @@ -7055,9 +7156,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Registers) {} DF_VIEW_UI_FUNCTION_DEF(Registers) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Registers); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 16, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Registers); + df_watch_view_build(ws, panel, view, ewv, 0, 16, rect); ProfEnd(); } @@ -7070,9 +7171,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Globals) {} DF_VIEW_UI_FUNCTION_DEF(Globals) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Globals); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Globals); + df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); ProfEnd(); } @@ -7085,9 +7186,9 @@ DF_VIEW_CMD_FUNCTION_DEF(ThreadLocals) {} DF_VIEW_UI_FUNCTION_DEF(ThreadLocals) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_ThreadLocals); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_ThreadLocals); + df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); ProfEnd(); } @@ -7100,9 +7201,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Types) {} DF_VIEW_UI_FUNCTION_DEF(Types) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Types); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Types); + df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); ProfEnd(); } @@ -7115,9 +7216,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Procedures) {} DF_VIEW_UI_FUNCTION_DEF(Procedures) { ProfBeginFunction(); - DF_EvalWatchViewState *ewv = df_view_user_state(view, DF_EvalWatchViewState); - df_eval_watch_view_init(ewv, view, DF_EvalWatchViewFillKind_Procedures); - df_eval_watch_view_build(ws, panel, view, ewv, 0, 10, rect); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_init(ewv, view, DF_WatchViewFillKind_Procedures); + df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); ProfEnd(); } @@ -8669,7 +8770,12 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "breakpoints_table") { @@ -8839,7 +8945,12 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) UI_TableF(ArrayCount(col_pcts), col_pcts, "pins_table") { @@ -9013,7 +9124,12 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &sv->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &sv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { for(S64 row = visible_row_range.min; row <= visible_row_range.max && row < opts.count; row += 1) @@ -9369,7 +9485,12 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) } UI_ScrollListSignal scroll_list_sig = {0}; UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &sv->cursor, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, + &view->scroll_pos.y, + &sv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { for(S64 row = visible_row_range.min; row <= visible_row_range.max; row += 1) diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index fabaa30b..a477ba6d 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -281,48 +281,48 @@ struct DF_EvalRoot U8 *expr_buffer; }; -typedef enum DF_EvalWatchViewColumnKind +typedef enum DF_WatchViewColumnKind { - DF_EvalWatchViewColumnKind_Expr, - DF_EvalWatchViewColumnKind_Value, - DF_EvalWatchViewColumnKind_Type, - DF_EvalWatchViewColumnKind_ViewRule, - DF_EvalWatchViewColumnKind_COUNT + DF_WatchViewColumnKind_Expr, + DF_WatchViewColumnKind_Value, + DF_WatchViewColumnKind_Type, + DF_WatchViewColumnKind_ViewRule, + DF_WatchViewColumnKind_COUNT } -DF_EvalWatchViewColumnKind; +DF_WatchViewColumnKind; -typedef enum DF_EvalWatchViewFillKind +typedef enum DF_WatchViewFillKind { - DF_EvalWatchViewFillKind_Mutable, - DF_EvalWatchViewFillKind_Registers, - DF_EvalWatchViewFillKind_Locals, - DF_EvalWatchViewFillKind_Globals, - DF_EvalWatchViewFillKind_ThreadLocals, - DF_EvalWatchViewFillKind_Types, - DF_EvalWatchViewFillKind_Procedures, - DF_EvalWatchViewFillKind_COUNT + DF_WatchViewFillKind_Mutable, + DF_WatchViewFillKind_Registers, + DF_WatchViewFillKind_Locals, + DF_WatchViewFillKind_Globals, + DF_WatchViewFillKind_ThreadLocals, + DF_WatchViewFillKind_Types, + DF_WatchViewFillKind_Procedures, + DF_WatchViewFillKind_COUNT } -DF_EvalWatchViewFillKind; +DF_WatchViewFillKind; -typedef struct DF_EvalWatchViewPoint DF_EvalWatchViewPoint; -struct DF_EvalWatchViewPoint +typedef struct DF_WatchViewPoint DF_WatchViewPoint; +struct DF_WatchViewPoint { - DF_EvalWatchViewColumnKind column_kind; + DF_WatchViewColumnKind column_kind; DF_ExpandKey parent_key; DF_ExpandKey key; }; -typedef struct DF_EvalWatchViewState DF_EvalWatchViewState; -struct DF_EvalWatchViewState +typedef struct DF_WatchViewState DF_WatchViewState; +struct DF_WatchViewState { B32 initialized; // rjf: fill kind (way that the contents of the watch view are computed) - DF_EvalWatchViewFillKind fill_kind; + DF_WatchViewFillKind fill_kind; // rjf; table cursor state - DF_EvalWatchViewPoint cursor; - DF_EvalWatchViewPoint mark; + DF_WatchViewPoint cursor; + DF_WatchViewPoint mark; // rjf: text input state TxtPt input_cursor; @@ -454,27 +454,27 @@ internal DF_EntityListerItemArray df_entity_lister_item_array_from_list(Arena *a internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array); //////////////////////////////// -//~ rjf: Eval/Watch Views +//~ rjf: Watch Views //- rjf: eval watch view instance -> eval view key -internal DF_EvalViewKey df_eval_view_key_from_eval_watch_view(DF_EvalWatchViewState *ewv); +internal DF_EvalViewKey df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv); //- rjf: root allocation/deallocation/mutation -internal DF_EvalRoot * df_eval_root_alloc(DF_View *view, DF_EvalWatchViewState *ews); -internal void df_eval_root_release(DF_EvalWatchViewState *ews, DF_EvalRoot *root); +internal DF_EvalRoot * df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews); +internal void df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root); internal void df_eval_root_equip_string(DF_EvalRoot *root, String8 string); -internal DF_EvalRoot * df_eval_root_from_string(DF_EvalWatchViewState *ews, String8 string); -internal DF_EvalRoot * df_eval_root_from_expand_key(DF_EvalWatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key); +internal DF_EvalRoot * df_eval_root_from_string(DF_WatchViewState *ews, String8 string); +internal DF_EvalRoot * df_eval_root_from_expand_key(DF_WatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key); internal String8 df_string_from_eval_root(DF_EvalRoot *root); internal DF_ExpandKey df_parent_expand_key_from_eval_root(DF_EvalRoot *root); internal DF_ExpandKey df_expand_key_from_eval_root(DF_EvalRoot *root); //- rjf: windowed watch tree visualization -internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_EvalWatchViewState *ews); +internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews); //- rjf: eval/watch views main hooks -internal void df_eval_watch_view_init(DF_EvalWatchViewState *ewv, DF_View *view, DF_EvalWatchViewFillKind fill_kind); -internal void df_eval_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalWatchViewState *ewv, DF_CmdList *cmds); -internal void df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalWatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect); +internal void df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind); +internal void df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, DF_CmdList *cmds); +internal void df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect); #endif // DEBUG_FRONTEND_VIEWS_H diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index 2b7dfa72..c1fa8983 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -1335,7 +1335,7 @@ thread_static Vec2F32 ui_scroll_list_dim_px = {0}; thread_static Rng1S64 ui_scroll_list_scroll_idx_rng = {0}; internal void -ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out) +ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out) { //- rjf: unpack arguments Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1)); @@ -1347,12 +1347,13 @@ ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S6 { UI_EventList *events = ui_events(); Vec2S64 cursor = *cursor_out; + Vec2S64 mark = mark_out ? *mark_out : cursor; for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) { next = n->next; UI_Event *evt = &n->v; if((evt->delta_2s32.x == 0 && evt->delta_2s32.y == 0) || - evt->flags & (UI_EventFlag_KeepMark|UI_EventFlag_Delete)) + evt->flags & UI_EventFlag_Delete) { continue; } @@ -1393,10 +1394,18 @@ ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S6 } }break; } + if(!(evt->flags & UI_EventFlag_KeepMark)) + { + mark = cursor; + } } if(moved) { *cursor_out = cursor; + if(mark_out) + { + *mark_out = mark; + } } } diff --git a/src/ui/ui_basic_widgets.h b/src/ui/ui_basic_widgets.h index cc934a52..dc8c2394 100644 --- a/src/ui/ui_basic_widgets.h +++ b/src/ui/ui_basic_widgets.h @@ -157,7 +157,7 @@ internal U64 ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U6 internal U64 ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row); internal UI_ScrollPt ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices); -internal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt_out, Vec2S64 *cursor_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out); +internal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt_out, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out); internal void ui_scroll_list_end(void); //////////////////////////////// @@ -180,6 +180,6 @@ internal void ui_scroll_list_end(void); #define UI_TableCell DeferLoop(ui_table_cell_begin(), ui_table_cell_end()) #define UI_TableCellSized(size) DeferLoop(ui_table_cell_sized_begin(size), ui_table_cell_end()) -#define UI_ScrollList(params, scroll_pt_out, cursor_out, visible_row_range_out, signal_out) DeferLoop(ui_scroll_list_begin((params), (scroll_pt_out), (cursor_out), (visible_row_range_out), (signal_out)), ui_scroll_list_end()) +#define UI_ScrollList(params, scroll_pt_out, cursor_out, mark_out, visible_row_range_out, signal_out) DeferLoop(ui_scroll_list_begin((params), (scroll_pt_out), (cursor_out), (mark_out), (visible_row_range_out), (signal_out)), ui_scroll_list_end()) #endif // UI_BASIC_WIDGETS_H