From 615a05e423482e18155a323b02ad5f80cb2948a3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 6 Aug 2024 09:22:03 -0700 Subject: [PATCH] fix watch window snap-to-cursor rules; fix eval path for command parameter filling --- src/df/core/df_core.c | 13 ++++---- src/df/gfx/df_views.c | 77 ++++++++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 059ed976..581c81e5 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -852,7 +852,6 @@ internal String8 df_cmd_params_apply_spec_query(Arena *arena, DF_CmdParams *params, DF_CmdSpec *spec, String8 query) { String8 error = {0}; - B32 prefer_imm = 0; switch(spec->info.query.slot) { default: @@ -883,15 +882,15 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CmdParams *params, DF_CmdSpec *s error = str8_lit("Couldn't interpret as a line number."); } }break; - case DF_CmdParamSlot_VirtualAddr: prefer_imm = 0; goto use_numeric_eval; - case DF_CmdParamSlot_VirtualOff: prefer_imm = 0; goto use_numeric_eval; - case DF_CmdParamSlot_Index: prefer_imm = 1; goto use_numeric_eval; - case DF_CmdParamSlot_ID: prefer_imm = 1; goto use_numeric_eval; + case DF_CmdParamSlot_VirtualAddr: goto use_numeric_eval; + case DF_CmdParamSlot_VirtualOff: goto use_numeric_eval; + case DF_CmdParamSlot_Index: goto use_numeric_eval; + case DF_CmdParamSlot_ID: goto use_numeric_eval; use_numeric_eval: { Temp scratch = scratch_begin(&arena, 1); E_Eval eval = e_eval_from_string(scratch.arena, query); - if(eval.msgs.max_kind != E_MsgKind_Null) + if(eval.msgs.max_kind == E_MsgKind_Null) { E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.type_key)); if(eval_type_kind == E_TypeKind_Ptr || @@ -938,7 +937,7 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CmdParams *params, DF_CmdSpec *s } else { - error = push_str8f(scratch.arena, "Couldn't evaluate \"%S\" as an address", query); + error = push_str8f(scratch.arena, "Couldn't evaluate \"%S\" as an address.", query); } scratch_end(scratch); }break; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 15f67ab8..30a7d770 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1584,6 +1584,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { UI_EventList *events = ui_events(); B32 state_dirty = 1; + B32 snap_to_cursor = 0; B32 cursor_dirty__tbl = 0; B32 take_autocomplete = 0; for(UI_EventNode *event_n = events->first, *next = 0;; event_n = next) @@ -1610,6 +1611,10 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS for(DF_EntityNode *n = watches.first; n != 0; n = n->next) { DF_Entity *watch = n->entity; + if(watch->flags & DF_EntityFlag_MarkedForDeletion) + { + continue; + } DF_ExpandKey parent_key = df_parent_expand_key_from_entity(watch); DF_ExpandKey key = df_expand_key_from_entity(watch); DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); @@ -1868,6 +1873,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(state_dirty) { state_dirty = 0; + snap_to_cursor = 1; } ////////////////////////////// @@ -1925,6 +1931,43 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y)); } + ////////////////////////// + //- rjf: [table] snap to cursor + // + if(snap_to_cursor) + { + Rng1S64 item_range = r1s64(0, 1 + blocks.total_visual_row_count); + Rng1S64 scroll_row_idx_range = r1s64(item_range.min, ClampBot(item_range.min, item_range.max-1)); + S64 cursor_item_idx = cursor_tbl.y-1; + if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) + { + UI_ScrollPt *scroll_pt = &view->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 + 1); + + //- 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-1, cursor_item_idx+3); + } + else + { + cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&row_blocks, (U64)cursor_item_idx); + cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4; + } + + //- 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); + } + } + ////////////////////////////// //- rjf: apply cursor/mark rugpull change // @@ -2304,7 +2347,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1}; Rng2S64 cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(3, blocks.total_semantic_row_count)); - Rng1S64 item_range = r1s64(0, 1 + blocks.total_visual_row_count); Vec2S32 delta = evt->delta_2s32; if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) { @@ -2369,38 +2411,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { taken = 1; cursor_dirty__tbl = 1; - { - Rng1S64 scroll_row_idx_range = r1s64(item_range.min, ClampBot(item_range.min, item_range.max-1)); - S64 cursor_item_idx = cursor_tbl.y-1; - if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) - { - UI_ScrollPt *scroll_pt = &view->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 + 1); - - //- 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-1, cursor_item_idx+3); - } - else - { - cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&row_blocks, (U64)cursor_item_idx); - cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4; - } - - //- 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); - } - } - + snap_to_cursor = 1; } }