another checkpoint in fixing up the watch window for replacing targets/scheduler/etc

This commit is contained in:
Ryan Fleury
2024-09-27 13:15:10 -07:00
parent b6b188b67b
commit 771883c56c
3 changed files with 205 additions and 148 deletions
+185 -140
View File
@@ -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"));
}
+19 -7
View File
@@ -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);
+1 -1
View File
@@ -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);