From 771883c56c53a79117856d7ee2ea56ae4c870c39 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 27 Sep 2024 13:15:10 -0700 Subject: [PATCH] another checkpoint in fixing up the watch window for replacing targets/scheduler/etc --- src/raddbg/raddbg_views.c | 325 ++++++++++++++++++++---------------- src/raddbg/raddbg_views.h | 26 ++- src/raddbg/raddbg_widgets.c | 2 +- 3 files changed, 205 insertions(+), 148 deletions(-) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index e23f2574..9142021f 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -843,6 +843,41 @@ rd_collection_info_from_num(EV_BlockRangeList *block_ranges, S64 num) return info; } +//- rjf: row -> kind + +internal RD_WatchViewRowKind +rd_watch_view_row_kind_from_row(RD_WatchViewFlags flags, EV_Row *row) +{ + Temp scratch = scratch_begin(0, 0); + RD_ViewRuleInfo *ui_view_rule_info = rd_view_rule_info_from_string(row->block->expand_view_rule_info->string); + MD_Node *ui_view_rule_params_root = row->block->expand_view_rule_params; + if(ui_view_rule_info->ui == 0 || !(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable)) + { + ui_view_rule_info = &rd_nil_view_rule_info; + ui_view_rule_params_root = &md_nil_node; + } + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + RD_Entity *row_meta_entity = rd_entity_from_eval_space(row_eval.space); + RD_WatchViewRowKind row_kind = RD_WatchViewRowKind_Normal; + if(ev_key_match(row->block->key, ev_key_root())) + { + row_kind = RD_WatchViewRowKind_Header; + } + else if(ui_view_rule_info != &rd_nil_view_rule_info && ui_view_rule_info->ui != 0) + { + row_kind = RD_WatchViewRowKind_Canvas; + } + else if(flags & RD_WatchViewFlag_PrettyEntityRows && + row_eval.space.kind == RD_EvalSpaceKind_MetaEntity && + !rd_entity_is_nil(row_meta_entity) && + row_eval.value.u64 == 0 && e_type_kind_from_key(row_eval.type_key) == E_TypeKind_Struct) + { + row_kind = RD_WatchViewRowKind_PrettyEntityControls; + } + scratch_end(scratch); + return row_kind; +} + //- rjf: row/column -> strings internal String8 @@ -1156,9 +1191,37 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ////////////////////////// //- rjf: stable cursor state * blocks -> 2D table coordinates // + EV_WindowedRowList mark_rows = {0}; + Rng2S64 cursor_tbl_range = {0}; { + // rjf: compute 2d table coordinates cursor_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->cursor); 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)); + + // rjf: compute legal coordinate range, given selection-defining row + U64 num_x_positions = ewv->column_count; + if(mark_rows.first != 0) + { + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_row(flags, mark_rows.first); + if(row_kind == RD_WatchViewRowKind_PrettyEntityControls) + { + num_x_positions = 2; + } + } + cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(num_x_positions-1, block_tree.total_item_count-1)); + + // rjf: clamp x positions of cursor/mark tbl + for EachEnumVal(Axis2, axis) + { + cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]); + mark_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), mark_tbl.v[axis]); + } + + // rjf: form selection range table coordinates 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)); } @@ -1272,54 +1335,108 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } ////////////////////////// - //- rjf: [table] do cell-granularity expansions / tab-opens + //- rjf: [table] do cell-granularity 'accept' operations (expansions / tab-opens / etc.) // 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) { - if(selection_tbl.min.x <= 0 && ev_row_is_expandable(row)) + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_row(flags, row); + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { - B32 is_expanded = ev_expansion_from_key(eval_view, row->key); - ev_key_set_expansion(eval_view, row->block->key, row->key, !is_expanded); - taken = 1; - } - RD_ViewRuleInfo *view_rule_info = &rd_nil_view_rule_info; - MD_Node *view_rule_params_root = &md_nil_node; - for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) - { - RD_ViewRuleInfo *info = rd_view_rule_info_from_string(n->v.root->string); - if(info->ui != 0) + //- rjf: determine operation for this cell + typedef enum OpKind { - view_rule_info = info; - view_rule_params_root = n->v.root; + OpKind_Null, + OpKind_DoExpand, + OpKind_GoToLocation, + OpKind_DoTabOpen, + } + OpKind; + OpKind kind = OpKind_DoExpand; + switch(row_kind) + { + default:{}break; + + //- rjf: normal row -> do operation depending on column + case RD_WatchViewRowKind_Normal: + { + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: {kind = OpKind_DoExpand;}break; + case RD_WatchViewColumnKind_Value:{kind = OpKind_GoToLocation;}break; + } + }break; + + //- rjf: canvas row -> open tab + case RD_WatchViewRowKind_Canvas: + if(selection_tbl.min.x == selection_tbl.max.x && + selection_tbl.min.y == selection_tbl.max.y) + { + kind = OpKind_DoTabOpen; + }break; + + //- rjf: entity controls -> do operation depending on extra control selection + case RD_WatchViewRowKind_PrettyEntityControls: + { + if(selection_tbl.min.x != 0 || selection_tbl.max.x != 0) + { + kind = OpKind_Null; + } + }break; + } + + //- rjf: perform operation + switch(kind) + { + default:{}break; + case OpKind_DoExpand: + { + B32 is_expanded = ev_expansion_from_key(eval_view, row->key); + ev_key_set_expansion(eval_view, row->block->key, row->key, !is_expanded); + }break; + case OpKind_GoToLocation: + { + + }break; + case OpKind_DoTabOpen: + { + RD_ViewRuleInfo *view_rule_info = &rd_nil_view_rule_info; + MD_Node *view_rule_params_root = &md_nil_node; + for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) + { + RD_ViewRuleInfo *info = rd_view_rule_info_from_string(n->v.root->string); + if(info->ui != 0) + { + view_rule_info = info; + view_rule_params_root = n->v.root; + } + } + rd_cmd(RD_CmdKind_OpenTab, + .string = e_string_from_expr(scratch.arena, row->expr), + .params_tree = view_rule_params_root); + }break; } } -#if 0 // TODO(rjf): @blocks - if(view_rule_info != &rd_nil_view_rule_info && row->block_kind == EV_BlockKind_Canvas) - { - rd_cmd(RD_CmdKind_OpenTab, - .string = e_string_from_expr(scratch.arena, row->expr), - .params_tree = view_rule_params_root); - taken = 1; - } -#endif } } ////////////////////////// //- rjf: [table] do cell-granularity go-to-locations / frame selections // +#if 0 // TODO(rjf): @blocks if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y && selection_tbl.min.x == 1) { taken = 1; -#if 0 // TODO(rjf): @blocks EV_WindowedRowList rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); EV_Row *row = rows.first; @@ -1356,8 +1473,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo .unwind_count = frame_row->unwind_idx, .inline_depth = frame_row->inline_depth); } -#endif } +#endif ////////////////////////// //- rjf: [text] apply textual edits @@ -1501,24 +1618,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo 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)) - { - view_rule = rd_entity_alloc(watch, RD_EntityKind_ViewRule); - } - else if(new_string.size == 0 && !rd_entity_is_nil(view_rule)) - { - 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; -#endif }break; } } @@ -1636,51 +1735,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ev_key_set_view_rule(eval_view, collection_info.key, str8_zero()); }break; } - -#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 } } for(RD_EntityNode *n = entities_to_remove.first; n != 0; n = n->next) @@ -1699,7 +1753,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(!ewv->text_editing && !(evt->flags & UI_EventFlag_Delete) && !(evt->flags & UI_EventFlag_Reorder)) { B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1}; - Rng2S64 cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(ewv->column_count-1, block_tree.total_item_count-1)); Vec2S32 delta = evt->delta_2s32; if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) { @@ -1956,7 +2009,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo scroll_list_params.flags = UI_ScrollListFlag_All; scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, block_tree.total_item_count)); + 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.row_blocks = row_blocks; @@ -2018,33 +2071,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ui_view_rule_info = &rd_nil_view_rule_info; ui_view_rule_params_root = &md_nil_node; } - - //////////////////////// - //- rjf: choose kind of row - // - typedef enum RowKind - { - RowKind_Normal, - RowKind_Header, - RowKind_Canvas, - RowKind_PrettyEntityControls, - } - RowKind; - RowKind row_kind = RowKind_Normal; - if(ev_key_match(row->block->key, ev_key_root())) - { - row_kind = RowKind_Header; - } - else if(ui_view_rule_info != &rd_nil_view_rule_info && ui_view_rule_info->ui != 0) - { - row_kind = RowKind_Canvas; - } - else if(row_eval.space.kind == RD_EvalSpaceKind_MetaEntity && - !rd_entity_is_nil(row_meta_entity) && - row_eval.value.u64 == 0 && row_type->kind == E_TypeKind_Struct) - { - row_kind = RowKind_PrettyEntityControls; - } + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_row(flags, row); //////////////////////// //- rjf: determine if row's data is fresh and/or bad @@ -2097,9 +2124,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo switch(row_kind) { default:{}break; - case RowKind_Normal:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; - case RowKind_Header:{row_flags |= UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DisableFocusOverlay;}break; - case RowKind_Canvas:{row_flags |= UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder;}break; + case RD_WatchViewRowKind_Normal:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; + case RD_WatchViewRowKind_Header:{row_flags |= UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DisableFocusOverlay;}break; + case RD_WatchViewRowKind_Canvas:{row_flags |= UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder;}break; + case RD_WatchViewRowKind_PrettyEntityControls:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; } } @@ -2123,7 +2151,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //////////////////// //- rjf: header row // - case RowKind_Header: + case RD_WatchViewRowKind_Header: { UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) { @@ -2196,7 +2224,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //////////////////// //- rjf: canvas row // - case RowKind_Canvas: + case RD_WatchViewRowKind_Canvas: UI_FocusHot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off) { //- rjf: unpack @@ -2295,34 +2323,52 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //////////////////// //- rjf: pretty entity controls row // - case RowKind_PrettyEntityControls: + case RD_WatchViewRowKind_PrettyEntityControls: { + //- rjf: unpack RD_Entity *entity = row_meta_entity; + B32 entity_box_selected = (row_selected); + + //- rjf: build entity box ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###entity_%p", entity); - UI_Parent(entity_box) + UI_Box *entity_box = &ui_nil_box; + UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) { - UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded")))) - { - next_row_expanded = !row_expanded; - } - DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); - UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_fancy_strings(title_box, &fstrs); + entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###entity_%p", entity); + } + { + UI_Parent(entity_box) + { + UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded")))) + { + next_row_expanded = !row_expanded; + } + DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &fstrs); + } + UI_Signal sig = ui_signal_from_box(entity_box); + } + + //- rjf: build extra entity controls + UI_PrefWidth(ui_em(3.f, 1.f)) + { + UI_FocusHot(row_selected && selection_tbl.min.x <= 1 && 1 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off) rd_icon_buttonf(RD_IconKind_Play, 0, "###run"); + UI_FocusHot(row_selected && selection_tbl.min.x <= 2 && 2 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off) rd_icon_buttonf(RD_IconKind_StepInto, 0, "###step_into"); + UI_FocusHot(row_selected && selection_tbl.min.x <= 3 && 3 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off) rd_icon_buttonf(RD_IconKind_CheckHollow, 0, "###select"); } - UI_Signal sig = ui_signal_from_box(entity_box); }break; //////////////////// //- rjf: normal row // default: - case RowKind_Normal: + case RD_WatchViewRowKind_Normal: UI_HeightFill { ////////////////////// @@ -5040,7 +5086,6 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(scheduler) if(!wv->initialized) { rd_watch_view_init(wv); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_FreezeControl, 0.05f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.25f, .string = str8_lit("label.str"), .display_string = str8_lit("Label"), .dequote_string = 1); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.70f, .string = str8_lit("callstack.v"), .display_string = str8_lit("Call Stack")); } diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index c5d98830..62b6c2c7 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -44,9 +44,13 @@ struct RD_CodeViewBuildResult typedef U32 RD_WatchViewFlags; enum { - RD_WatchViewFlag_PrettyNameMembers = (1<<0), - RD_WatchViewFlag_PrettyEntityRows = (1<<1), - RD_WatchViewFlag_DisableCacheLines = (1<<2), + RD_WatchViewFlag_PrettyNameMembers = (1<<0), + RD_WatchViewFlag_PrettyEntityRows = (1<<1), + RD_WatchViewFlag_DisableCacheLines = (1<<2), + + RD_WatchViewFlag_PrettyCtrlRun = (1<<3), + RD_WatchViewFlag_PrettyCtrlStepInto = (1<<4), + RD_WatchViewFlag_PrettyCtrlSelect = (1<<5), }; typedef enum RD_WatchViewColumnKind @@ -57,10 +61,6 @@ typedef enum RD_WatchViewColumnKind RD_WatchViewColumnKind_ViewRule, RD_WatchViewColumnKind_Module, RD_WatchViewColumnKind_Member, - RD_WatchViewColumnKind_RunControl, - RD_WatchViewColumnKind_StepControl, - RD_WatchViewColumnKind_MoreControl, - RD_WatchViewColumnKind_FreezeControl, RD_WatchViewColumnKind_FrameSelection, RD_WatchViewColumnKind_COUNT } @@ -95,6 +95,15 @@ struct RD_WatchViewColumn B32 rangify_braces; }; +typedef enum RD_WatchViewRowKind +{ + RD_WatchViewRowKind_Normal, + RD_WatchViewRowKind_Header, + RD_WatchViewRowKind_Canvas, + RD_WatchViewRowKind_PrettyEntityControls, +} +RD_WatchViewRowKind; + typedef struct RD_WatchViewPoint RD_WatchViewPoint; struct RD_WatchViewPoint { @@ -171,6 +180,9 @@ internal Vec2S64 rd_tbl_from_watch_view_point(EV_BlockRangeList *block_ranges, R //- rjf: table coordinates -> entities in collectons internal RD_WatchViewCollectionInfo rd_collection_info_from_num(EV_BlockRangeList *block_ranges, S64 num); +//- rjf: row -> kind +internal RD_WatchViewRowKind rd_watch_view_row_kind_from_row(RD_WatchViewFlags flags, EV_Row *row); + //- rjf: row/column -> strings internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index d6c54575..d10f4f93 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -3213,7 +3213,7 @@ rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx //- rjf: focus cursor { F32 visible_dim_px = dim_2f32(box->rect).x - expander_size_px - ui_top_font_size()*depth; - if(visible_dim_px != 0) + if(visible_dim_px > 0) { Rng1F32 cursor_range_px = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f); Rng1F32 visible_range_px = r1f32(scrollable_box->view_off_target.x, scrollable_box->view_off_target.x + visible_dim_px);