From 26f75fe7c143274317b6244619365f5bf5c41186 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 6 Aug 2024 08:39:52 -0700 Subject: [PATCH] shift watch view expressions from being a watch view implementation detail to being a top-level entity --- src/df/core/df_core.c | 135 +++- src/df/core/df_core.h | 13 +- src/df/core/df_core.mdesk | 4 + src/df/core/generated/df_core.meta.c | 20 +- src/df/core/generated/df_core.meta.h | 12 +- src/df/gfx/df_gfx.c | 6 +- src/df/gfx/df_views.c | 881 ++++++++++----------------- src/df/gfx/df_views.h | 26 - src/raddbg/raddbg.c | 1 - 9 files changed, 474 insertions(+), 624 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index be92ae2b..17fd17a3 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1391,6 +1391,23 @@ df_rgba_from_entity(DF_Entity *entity) return result; } +//- rjf: entity -> expansion tree keys + +internal DF_ExpandKey +df_expand_key_from_entity(DF_Entity *entity) +{ + DF_ExpandKey parent_key = df_parent_expand_key_from_entity(entity); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), (U64)entity); + return key; +} + +internal DF_ExpandKey +df_parent_expand_key_from_entity(DF_Entity *entity) +{ + DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)entity); + return parent_key; +} + //////////////////////////////// //~ rjf: Name Allocation @@ -1688,9 +1705,10 @@ df_entity_release(DF_StateDeltaHistory *hist, DF_Entity *entity) } internal void -df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent) +df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child) { Assert(entity->parent == old_parent); + Assert(prev_child->parent == old_parent || df_entity_is_nil(prev_child)); // rjf: push delta records if(hist != 0) @@ -1725,7 +1743,7 @@ df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity } if(!df_entity_is_nil(new_parent)) { - DLLPushBack_NPZ(&df_g_nil_entity, new_parent->first, new_parent->last, entity, next, prev); + DLLInsert_NPZ(&df_g_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev); } entity->parent = new_parent; @@ -1733,6 +1751,8 @@ df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity df_entity_notify_mutation(entity); df_entity_notify_mutation(new_parent); df_entity_notify_mutation(old_parent); + df_entity_notify_mutation(prev_child); + df_state->kind_alloc_gens[entity->kind] += 1; } //- rjf: entity simple equipment @@ -4495,7 +4515,7 @@ df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block) } internal void -df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out) +df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -4704,7 +4724,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView child_eval.mode = udt_eval.mode; child_eval.value.u64 = udt_eval.value.u64 + member->off; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -4822,7 +4842,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView child_eval.mode = link_base.mode; child_eval.value.u64= link_base.offset; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -4880,7 +4900,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView child_eval.mode = arr_eval.mode; child_eval.value.u64= arr_eval.value.u64 + child_idx*element_type_byte_size; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -4893,7 +4913,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView ProfScope("build viz blocks for ptr-to-ptrs") { String8 subexpr = push_str8f(arena, "*(%S)", string); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, df_expand_key_make(df_hash_from_expand_key(key), 1), subexpr, ptr_eval, 0, cfg_table, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, eval_view, key, df_expand_key_make(df_hash_from_expand_key(key), 1), subexpr, ptr_eval, 0, cfg_table, depth+1, list_out); } scratch_end(scratch); @@ -4901,7 +4921,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView } internal DF_EvalVizBlockList -df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) +df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) { ProfBeginFunction(); DF_EvalVizBlockList blocks = {0}; @@ -4946,7 +4966,7 @@ df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, D df_cfg_table_push_unparsed_string(arena, &view_rule_table, n->string, DF_CfgSrc_User); } df_cfg_table_push_unparsed_string(arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); + df_append_viz_blocks_for_parent__rec(arena, eval_view, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); } ProfEnd(); return blocks; @@ -5526,6 +5546,43 @@ df_cfg_strings_from_core(Arena *arena, String8 root_path, DF_CfgSrc source) } } + //- rjf: write watches + { + B32 first = 1; + DF_EntityList watches = df_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) + { + DF_Entity *watch = n->entity; + if(watch->cfg_src == source) + { + if(first) + { + first = 0; + str8_list_push(arena, &strs, str8_lit("/// watches ///////////////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + } + Temp scratch = scratch_begin(&arena, 1); + DF_Entity *view_rule_entity = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + String8 expr = watch->name; + String8 view_rule = view_rule_entity->name; + String8 expr_escaped = df_cfg_escaped_from_raw_string(arena, expr); + String8 view_rule_escaped = df_cfg_escaped_from_raw_string(arena, view_rule); + str8_list_push (arena, &strs, str8_lit("watch:\n")); + str8_list_push (arena, &strs, str8_lit("{\n")); + str8_list_pushf(arena, &strs, " expression: \"%S\"\n", expr_escaped); + str8_list_pushf(arena, &strs, " view_rule: \"%S\"\n", view_rule_escaped); + if(watch->flags & DF_EntityFlag_HasColor) + { + Vec4F32 hsva = df_hsva_from_entity(watch); + str8_list_pushf(arena, &strs, " hsva: %.2f %.2f %.2f %.2f\n", hsva.x, hsva.y, hsva.z, hsva.w); + } + str8_list_push (arena, &strs, str8_lit("}\n")); + str8_list_push (arena, &strs, str8_lit("\n")); + scratch_end(scratch); + } + } + } + //- rjf: write watch pins { B32 first = 1; @@ -5742,6 +5799,25 @@ df_push_active_target_list(Arena *arena) return active_targets; } +//- rjf: expand key based entity queries + +internal DF_Entity * +df_entity_from_expand_key_and_kind(DF_ExpandKey key, DF_EntityKind kind) +{ + DF_Entity *result = &df_g_nil_entity; + DF_EntityList list = df_query_cached_entity_list_with_kind(kind); + for(DF_EntityNode *n = list.first; n != 0; n = n->next) + { + DF_Entity *entity = n->entity; + if(df_expand_key_match(df_expand_key_from_entity(entity), key)) + { + result = entity; + break; + } + } + return result; +} + //- rjf: per-run caches internal CTRL_Unwind @@ -7496,6 +7572,14 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) df_entity_mark_for_deletion(n->entity); } } + DF_EntityList watches = df_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) + { + if(n->entity->cfg_src == src) + { + df_entity_mark_for_deletion(n->entity); + } + } DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); for(DF_EntityNode *n = pins.first; n != 0; n = n->next) { @@ -7749,6 +7833,35 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } } + //- rjf: apply watches + DF_CfgVal *watches = df_cfg_val_from_string(table, str8_lit("watch")); + for(DF_CfgNode *watch = watches->first; + watch != &df_g_nil_cfg_node; + watch = watch->next) + { + if(watch->source != src) + { + continue; + } + Vec4F32 hsva = df_hsva_from_cfg_node(watch); + String8 expr_escaped = df_string_from_cfg_node_key(watch, str8_lit("expression"), StringMatchFlag_CaseInsensitive); + String8 view_rule_escaped = df_string_from_cfg_node_key(watch, str8_lit("view_rule"), StringMatchFlag_CaseInsensitive); + String8 expr = df_cfg_raw_from_escaped_string(scratch.arena, expr_escaped); + String8 view_rule = df_cfg_raw_from_escaped_string(scratch.arena, view_rule_escaped); + DF_Entity *entity = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Watch); + df_entity_equip_cfg_src(entity, src); + df_entity_equip_name(0, entity, expr); + if(!memory_is_zero(&hsva, sizeof(hsva))) + { + df_entity_equip_color_hsva(entity, hsva); + } + if(view_rule.size != 0) + { + DF_Entity *view_rule_entity = df_entity_alloc(0, entity, DF_EntityKind_ViewRule); + df_entity_equip_name(0, view_rule_entity, view_rule); + } + } + //- rjf: apply watch pins DF_CfgVal *pins = df_cfg_val_from_string(table, str8_lit("watch_pin")); for(DF_CfgNode *pin = pins->first; @@ -7892,7 +8005,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } else { - df_entity_change_parent(0, map, map->parent, map_parent); + df_entity_change_parent(0, map, map->parent, map_parent, &df_g_nil_entity); } df_entity_equip_name(0, map, path_file); }break; @@ -8624,7 +8737,7 @@ df_core_end_frame(void) } // rjf: unhook & release this entity tree - df_entity_change_parent(0, entity, entity->parent, &df_g_nil_entity); + df_entity_change_parent(0, entity, entity->parent, &df_g_nil_entity, &df_g_nil_entity); df_entity_release(0, entity); } } diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index ab50213f..b43485dc 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1425,6 +1425,10 @@ internal String8 df_search_tags_from_entity(Arena *arena, DF_Entity *entity); internal Vec4F32 df_hsva_from_entity(DF_Entity *entity); internal Vec4F32 df_rgba_from_entity(DF_Entity *entity); +//- rjf: entity -> expansion tree keys +internal DF_ExpandKey df_expand_key_from_entity(DF_Entity *entity); +internal DF_ExpandKey df_parent_expand_key_from_entity(DF_Entity *entity); + //////////////////////////////// //~ rjf: Name Allocation @@ -1442,7 +1446,7 @@ internal void df_entity_notify_mutation(DF_Entity *entity); internal DF_Entity *df_entity_alloc(DF_StateDeltaHistory *hist, DF_Entity *parent, DF_EntityKind kind); internal void df_entity_mark_for_deletion(DF_Entity *entity); internal void df_entity_release(DF_StateDeltaHistory *hist, DF_Entity *entity); -internal void df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent); +internal void df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child); //- rjf: entity simple equipment internal void df_entity_equip_txt_pt(DF_Entity *entity, TxtPt point); @@ -1610,8 +1614,8 @@ internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *are internal DF_EvalVizBlock *df_eval_viz_block_begin(Arena *arena, DF_EvalVizBlockKind kind, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth); internal DF_EvalVizBlock *df_eval_viz_block_split_and_continue(Arena *arena, DF_EvalVizBlockList *list, DF_EvalVizBlock *split_block, U64 split_idx); internal void df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block); -internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); -internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); +internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); +internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); internal void df_eval_viz_block_list_concat__in_place(DF_EvalVizBlockList *dst, DF_EvalVizBlockList *to_push); //- rjf: viz block list <-> table coordinates @@ -1672,6 +1676,9 @@ internal DF_EntityList df_query_cached_entity_list_with_kind(DF_EntityKind kind) internal DI_KeyList df_push_active_dbgi_key_list(Arena *arena); internal DF_EntityList df_push_active_target_list(Arena *arena); +//- rjf: expand key based entity queries +internal DF_Entity *df_entity_from_expand_key_and_kind(DF_ExpandKey key, DF_EntityKind kind); + //- rjf: per-run caches internal CTRL_Unwind df_query_cached_unwind_from_thread(DF_Entity *thread); internal U64 df_query_cached_rip_from_thread(DF_Entity *thread); diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index bcdca60f..14a61f78 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -33,6 +33,10 @@ DF_EntityKindTable: //- rjf: watch pins {WatchPin watch_pin 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 "Expression" Pin "Watch Pin" } + //- rjf: watches + {Watch watch 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 "Expression" Binoculars "Watch" } + {ViewRule view_rule 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 "Expression" Binoculars "View Rule" } + //- rjf: breakpoints {Breakpoint breakpoint 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 "Label" CircleFilled "Breakpoint" } {Condition condition 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 "Expression" CircleFilled "Condition" } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index a5b98cce..d1ddbe07 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -32,7 +32,7 @@ Rng1U64 df_g_cmd_param_slot_range_table[24] = {OffsetOf(DF_CmdParams, inline_depth), OffsetOf(DF_CmdParams, inline_depth) + sizeof(U64)}, }; -DF_IconKind df_g_entity_kind_icon_kind_table[25] = +DF_IconKind df_g_entity_kind_icon_kind_table[27] = { DF_IconKind_Null, DF_IconKind_Null, @@ -41,6 +41,8 @@ DF_IconKind_FileOutline, DF_IconKind_FileOutline, DF_IconKind_Binoculars, DF_IconKind_Pin, +DF_IconKind_Binoculars, +DF_IconKind_Binoculars, DF_IconKind_CircleFilled, DF_IconKind_CircleFilled, DF_IconKind_Target, @@ -61,7 +63,7 @@ DF_IconKind_Null, DF_IconKind_Null, }; -String8 df_g_entity_kind_display_string_table[25] = +String8 df_g_entity_kind_display_string_table[27] = { str8_lit_comp("Nil"), str8_lit_comp("Root"), @@ -70,6 +72,8 @@ str8_lit_comp("File"), str8_lit_comp("Override File Link"), str8_lit_comp("Auto View Rule"), str8_lit_comp("Watch Pin"), +str8_lit_comp("Watch"), +str8_lit_comp("View Rule"), str8_lit_comp("Breakpoint"), str8_lit_comp("Condition"), str8_lit_comp("Target"), @@ -90,7 +94,7 @@ str8_lit_comp("Conversion Failure"), str8_lit_comp("EndedProcess"), }; -String8 df_g_entity_kind_name_label_table[25] = +String8 df_g_entity_kind_name_label_table[27] = { str8_lit_comp("Label"), str8_lit_comp("Label"), @@ -99,6 +103,8 @@ str8_lit_comp("Label"), str8_lit_comp("Label"), str8_lit_comp("Label"), str8_lit_comp("Expression"), +str8_lit_comp("Expression"), +str8_lit_comp("Expression"), str8_lit_comp("Label"), str8_lit_comp("Expression"), str8_lit_comp("Label"), @@ -119,7 +125,7 @@ str8_lit_comp("Label"), str8_lit_comp("Label"), }; -DF_EntityKindFlags df_g_entity_kind_flags_table[25] = +DF_EntityKindFlags df_g_entity_kind_flags_table[27] = { (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), @@ -128,6 +134,8 @@ DF_EntityKindFlags df_g_entity_kind_flags_table[25] = (1*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 1*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), @@ -148,7 +156,7 @@ DF_EntityKindFlags df_g_entity_kind_flags_table[25] = (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), }; -DF_EntityOpFlags df_g_entity_kind_op_flags_table[25] = +DF_EntityOpFlags df_g_entity_kind_op_flags_table[27] = { (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), @@ -157,6 +165,8 @@ DF_EntityOpFlags df_g_entity_kind_op_flags_table[25] = (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), (1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (1*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (1*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index bee1368a..045f9737 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -24,6 +24,8 @@ DF_EntityKind_File, DF_EntityKind_OverrideFileLink, DF_EntityKind_AutoViewRule, DF_EntityKind_WatchPin, +DF_EntityKind_Watch, +DF_EntityKind_ViewRule, DF_EntityKind_Breakpoint, DF_EntityKind_Condition, DF_EntityKind_Target, @@ -1534,11 +1536,11 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = }; C_LINKAGE_BEGIN extern Rng1U64 df_g_cmd_param_slot_range_table[24]; -extern DF_IconKind df_g_entity_kind_icon_kind_table[25]; -extern String8 df_g_entity_kind_display_string_table[25]; -extern String8 df_g_entity_kind_name_label_table[25]; -extern DF_EntityKindFlags df_g_entity_kind_flags_table[25]; -extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[25]; +extern DF_IconKind df_g_entity_kind_icon_kind_table[27]; +extern String8 df_g_entity_kind_display_string_table[27]; +extern String8 df_g_entity_kind_name_label_table[27]; +extern DF_EntityKindFlags df_g_entity_kind_flags_table[27]; +extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[27]; extern String8 df_g_cfg_src_string_table[4]; extern DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4]; extern DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4]; diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 8895d545..41e0e674 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6212,7 +6212,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); DF_ExpandKey parent_key = df_expand_key_make(5381, 1); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); - DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, eval_view, expr, parent_key, key); + DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, expr, parent_key, key); U32 default_radix = (eval.mode == E_Mode_Reg ? 16 : 10); DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); @@ -12011,7 +12011,7 @@ df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *m { if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) { - df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_from_handle(df_interact_regs()->file)); + df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_from_handle(df_interact_regs()->file), &df_g_nil_entity); df_entity_equip_txt_pt(dropped_entity, txt_pt(line_num, 1)); if(dropped_entity->flags & DF_EntityFlag_HasVAddr) { @@ -12020,7 +12020,7 @@ df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *m } else if(line_vaddr != 0) { - df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_root()); + df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_root(), &df_g_nil_entity); df_entity_equip_vaddr(dropped_entity, line_vaddr); } }break; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 447453b5..15f67ab8 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1168,97 +1168,6 @@ df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv) return key; } -//- rjf: root allocation/deallocation/mutation - -internal DF_EvalRoot * -df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews) -{ - DF_EvalRoot *result = ews->first_free_root; - if(result != 0) - { - SLLStackPop(ews->first_free_root); - result->expr_buffer_string_size = 0; - } - else - { - result = push_array(view->arena, DF_EvalRoot, 1); - result->expr_buffer_cap = 1024; - result->expr_buffer = push_array_no_zero(view->arena, U8, result->expr_buffer_cap); - } - DLLPushBack(ews->first_root, ews->last_root, result); - ews->root_count += 1; - return result; -} - -internal void -df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root) -{ - DLLRemove(ews->first_root, ews->last_root, root); - SLLStackPush(ews->first_free_root, root); - ews->root_count -= 1; -} - -internal void -df_eval_root_equip_string(DF_EvalRoot *root, String8 string) -{ - root->expr_buffer_string_size = Min(string.size, root->expr_buffer_cap); - MemoryCopy(root->expr_buffer, string.str, root->expr_buffer_string_size); -} - -internal DF_EvalRoot * -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) - { - String8 r_string = df_string_from_eval_root(r); - if(str8_match(r_string, string, 0)) - { - root = r; - break; - } - } - return root; -} - -internal DF_EvalRoot * -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) - { - DF_ExpandKey key = df_expand_key_from_eval_root(r); - if(df_expand_key_match(key, expand_key)) - { - root = r; - break; - } - } - return root; -} - -internal String8 -df_string_from_eval_root(DF_EvalRoot *root) -{ - String8 string = str8(root->expr_buffer, root->expr_buffer_string_size); - return string; -} - -internal DF_ExpandKey -df_parent_expand_key_from_eval_root(DF_EvalRoot *root) -{ - DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)root); - return parent_key; -} - -internal DF_ExpandKey -df_expand_key_from_eval_root(DF_EvalRoot *root) -{ - DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), (U64)root); - return key; -} - //- rjf: watch view points <-> table coordinates internal B32 @@ -1347,17 +1256,18 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F default: case DF_WatchViewFillKind_Mutable: { - for(DF_EvalRoot *root = ews->first_root; root != 0; root = root->next) + DF_EntityList watches = df_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) { - String8 root_expr_string = df_string_from_eval_root(root); - FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); + DF_Entity *watch = n->entity; + String8 expr_string = watch->name; + FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, expr_string); if(matches.count == matches.needle_part_count) { - DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); - DF_ExpandKey key = df_expand_key_from_eval_root(root); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); - df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); - } + DF_ExpandKey parent_key = df_parent_expand_key_from_entity(watch); + DF_ExpandKey key = df_expand_key_from_entity(watch); + DF_EvalVizBlockList watch_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, eval_view, expr_string, parent_key, key); + df_eval_viz_block_list_concat__in_place(&blocks, &watch_blocks);} } }break; @@ -1381,7 +1291,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1393,7 +1303,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1415,7 +1325,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), idx+1); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1564,7 +1474,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F } } E_Eval eval = e_eval_from_string(arena, name); - df_append_viz_blocks_for_parent__rec(arena, di_scope, eval_view, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); + df_append_viz_blocks_for_parent__rec(arena, eval_view, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); } } df_eval_viz_block_end(&blocks, last_vb); @@ -1609,15 +1519,16 @@ df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewSt case DF_CoreCmdKind_ToggleWatchExpression: if(cmd->params.string.size != 0) { - DF_EvalRoot *already_existing_root = df_eval_root_from_string(ewv, cmd->params.string); - if(already_existing_root != 0) + DF_Entity *existing_watch = df_entity_from_name_and_kind(cmd->params.string, DF_EntityKind_Watch); + if(df_entity_is_nil(existing_watch)) { - df_eval_root_release(ewv, already_existing_root); + DF_Entity *watch = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Watch); + df_entity_equip_cfg_src(watch, DF_CfgSrc_Project); + df_entity_equip_name(0, watch, cmd->params.string); } else { - DF_EvalRoot *root = df_eval_root_alloc(view, ewv); - df_eval_root_equip_string(root, cmd->params.string); + df_entity_mark_for_deletion(existing_watch); } }break; } @@ -1664,7 +1575,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS ////////////////////////////// //- rjf: consume events & perform navigations/edits - calculate state // - E_String2ExprMap macro_map = {0}; DF_EvalVizBlockList blocks = {0}; UI_ScrollListRowBlockArray row_blocks = {0}; Vec2S64 cursor_tbl = {0}; @@ -1678,46 +1588,250 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS B32 take_autocomplete = 0; for(UI_EventNode *event_n = events->first, *next = 0;; event_n = next) { - ////////////////////////// - //- rjf: state -> macro map - // - if(state_dirty) - { - macro_map = e_string2expr_map_make(scratch.arena, 256); - for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) - { - String8 root_expr = str8(root->expr_buffer, root->expr_buffer_string_size); - - //- rjf: unpack arguments - DF_Entity *process = thread->parent; - U64 unwind_count = df_interact_regs()->unwind_count; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_unwind_regs_block = push_array(scratch.arena, U8, reg_size); - U64 thread_unwind_ip_vaddr = 0; - if(unwind.frames.count != 0) - { - thread_unwind_regs_block = unwind.frames.v[unwind_count%unwind.frames.count].regs; - thread_unwind_ip_vaddr = regs_rip_from_arch_block(arch, thread_unwind_regs_block); - } - - //- rjf: lex & parse - E_TokenArray tokens = e_token_array_from_text(scratch.arena, root_expr); - E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, root_expr, &tokens); - if(parse.msgs.max_kind == E_MsgKind_Null) - { - e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ¯o_map, parse.expr); - } - } - } - ////////////////////////// //- rjf: state -> viz blocks // if(state_dirty) { - blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, di_scope, fzy_scope, view, ewv); + MemoryZeroStruct(&blocks); + 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); + String8 filter = str8(view->query_buffer, view->query_string_size); + RDI_SectionKind fzy_target = RDI_SectionKind_UDTs; + switch(ewv->fill_kind) + { + //////////////////////////// + //- rjf: mutable watch fill -> build blocks from top-level mutable root expressions + // + default: + case DF_WatchViewFillKind_Mutable: + { + DF_EntityList watches = df_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) + { + DF_Entity *watch = n->entity; + 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); + df_eval_view_set_key_rule(eval_view, key, view_rule->name); + String8 expr_string = watch->name; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, expr_string); + if(matches.count == matches.needle_part_count) + { + DF_EvalVizBlockList watch_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, expr_string, parent_key, key); + df_eval_viz_block_list_concat__in_place(&blocks, &watch_blocks);} + } + }break; + + //////////////////////////// + //- rjf: registers fill -> build blocks via iterating all registers/aliases as root-level expressions + // + case DF_WatchViewFillKind_Registers: + { + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); + Architecture arch = df_architecture_from_entity(thread); + U64 reg_count = regs_reg_code_count_from_architecture(arch); + String8 *reg_strings = regs_reg_code_string_table_from_architecture(arch); + U64 alias_count = regs_alias_code_count_from_architecture(arch); + String8 *alias_strings = regs_alias_code_string_table_from_architecture(arch); + U64 num = 1; + for(U64 reg_idx = 1; reg_idx < reg_count; reg_idx += 1, num += 1) + { + String8 root_expr_string = reg_strings[reg_idx]; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, root_expr_string); + if(matches.count == matches.needle_part_count) + { + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, root_expr_string, parent_key, key); + df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); + } + } + for(U64 alias_idx = 1; alias_idx < alias_count; alias_idx += 1, num += 1) + { + String8 root_expr_string = alias_strings[alias_idx]; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, root_expr_string); + if(matches.count == matches.needle_part_count) + { + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, root_expr_string, parent_key, key); + df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); + } + } + }break; + + //////////////////////////// + //- rjf: locals fill -> build blocks via iterating all locals as root-level expressions + // + case DF_WatchViewFillKind_Locals: + { + E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_state->ctx->locals_map); + e_string2num_map_node_array_sort__in_place(&nodes); + for(U64 idx = 0; idx < nodes.count; idx += 1) + { + E_String2NumMapNode *n = nodes.v[idx]; + String8 root_expr_string = n->string; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, root_expr_string); + if(matches.count == matches.needle_part_count) + { + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), idx+1); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, root_expr_string, parent_key, key); + df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); + } + } + }break; + + //////////////////////////// + //- rjf: debug info table fill -> build split debug info table blocks + // + case DF_WatchViewFillKind_Globals: fzy_target = RDI_SectionKind_GlobalVariables; goto dbgi_table; + case DF_WatchViewFillKind_ThreadLocals: fzy_target = RDI_SectionKind_ThreadVariables; goto dbgi_table; + case DF_WatchViewFillKind_Types: fzy_target = RDI_SectionKind_UDTs; goto dbgi_table; + case DF_WatchViewFillKind_Procedures: fzy_target = RDI_SectionKind_Procedures; goto dbgi_table; + dbgi_table:; + { + U64 endt_us = os_now_microseconds()+200; + + //- rjf: unpack context + DI_KeyList dbgi_keys_list = df_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + rdis[idx] = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], endt_us); + } + + //- rjf: calculate top-level keys, expand root-level, grab root expansion node + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey root_key = df_expand_key_make(df_hash_from_expand_key(parent_key), 0); + df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, df_expand_key_zero(), parent_key, 1); + DF_ExpandNode *root_node = df_expand_node_from_key(&eval_view->expand_tree_table, parent_key); + + //- rjf: query all filtered items from dbgi searching system + U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; + B32 items_stale = 0; + FZY_Params params = {fzy_target, dbgi_keys}; + FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, ¶ms, filter, endt_us, &items_stale); + if(items_stale) + { + df_gfx_request_frame(); + } + + //- rjf: gather unsorted child expansion keys + // + // Nodes are sorted in the underlying expansion tree data structure, but + // ONLY by THEIR ORDER IN THE UNDERLYING DEBUG INFO TABLE. This is + // because debug info watch rows use the DEBUG INFO TABLE INDEX to form + // their key - this provides more stable/predictable behavior as rows + // are reordered, filtered, and shuffled around, as the user filters. + // + // When we actually build viz blocks, however, we want to produce viz + // blocks BY THE ORDER OF SUB-EXPANSIONS IN THE FILTERED ITEM ARRAY + // SPACE, so that all of the expansions come out in the right order. + // + DF_ExpandKey *sub_expand_keys = 0; + U64 *sub_expand_item_idxs = 0; + U64 sub_expand_keys_count = 0; + { + for(DF_ExpandNode *child = root_node->first; child != 0; child = child->next) + { + sub_expand_keys_count += 1; + } + sub_expand_keys = push_array(scratch.arena, DF_ExpandKey, sub_expand_keys_count); + sub_expand_item_idxs = push_array(scratch.arena, U64, sub_expand_keys_count); + U64 idx = 0; + for(DF_ExpandNode *child = root_node->first; child != 0; child = child->next) + { + U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&items, child->key.child_num); + if(item_num != 0) + { + sub_expand_keys[idx] = child->key; + sub_expand_item_idxs[idx] = item_num-1; + idx += 1; + } + else + { + sub_expand_keys_count -= 1; + } + } + } + + //- rjf: sort child expansion keys + { + for(U64 idx1 = 0; idx1 < sub_expand_keys_count; idx1 += 1) + { + U64 min_idx2 = 0; + U64 min_item_idx = sub_expand_item_idxs[idx1]; + for(U64 idx2 = idx1+1; idx2 < sub_expand_keys_count; idx2 += 1) + { + if(sub_expand_item_idxs[idx2] < min_item_idx) + { + min_idx2 = idx2; + min_item_idx = sub_expand_item_idxs[idx2]; + } + } + if(min_idx2 != 0) + { + Swap(DF_ExpandKey, sub_expand_keys[idx1], sub_expand_keys[min_idx2]); + Swap(U64, sub_expand_item_idxs[idx1], sub_expand_item_idxs[min_idx2]); + } + } + } + + //- rjf: build blocks for all table items, split by sorted sub-expansions + DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(scratch.arena, DF_EvalVizBlockKind_DebugInfoTable, parent_key, root_key, 0); + { + last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, items.count); + last_vb->fzy_target = fzy_target; + last_vb->fzy_backing_items = items; + } + for(U64 sub_expand_idx = 0; sub_expand_idx < sub_expand_keys_count; sub_expand_idx += 1) + { + FZY_Item *item = &items.v[sub_expand_item_idxs[sub_expand_idx]]; + + // rjf: form split: truncate & complete last block; begin next block + last_vb = df_eval_viz_block_split_and_continue(scratch.arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); + + // rjf: grab rdi for this item + RDI_Parsed *rdi = &di_rdi_parsed_nil; + U64 base_idx = 0; + { + for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) + { + U64 procedures_count = 0; + rdi_section_raw_table_from_kind(rdis[rdi_idx], RDI_SectionKind_Procedures, &procedures_count); + if(base_idx <= item->idx && item->idx < base_idx + procedures_count) + { + rdi = rdis[rdi_idx]; + break; + } + base_idx += procedures_count; + } + } + + // rjf: grab name for the expanded row + String8 name = fzy_item_string_from_rdi_target_element_idx(rdi, fzy_target, sub_expand_keys[sub_expand_idx].child_num-base_idx); + + // rjf: recurse for sub-expansion + { + DF_CfgTable child_cfg = {0}; + { + String8 view_rule_string = df_eval_view_rule_from_key(eval_view, df_expand_key_make(df_hash_from_expand_key(parent_key), sub_expand_keys[sub_expand_idx].child_num)); + if(view_rule_string.size != 0) + { + df_cfg_table_push_unparsed_string(scratch.arena, &child_cfg, view_rule_string, DF_CfgSrc_User); + } + } + E_Eval eval = e_eval_from_string(scratch.arena, name); + df_append_viz_blocks_for_parent__rec(scratch.arena, eval_view, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); + } + } + df_eval_viz_block_end(&blocks, last_vb); + }break; + } } ////////////////////////// @@ -2025,17 +2139,18 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case DF_WatchViewColumnKind_Expr: { DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); - DF_EvalRoot *root = df_eval_root_from_expand_key(ewv, eval_view, pt.key); - if(root != 0) + DF_Entity *watch = df_entity_from_expand_key_and_kind(pt.key, DF_EntityKind_Watch); + if(!df_entity_is_nil(watch)) { - df_eval_root_equip_string(root, new_string); + df_entity_equip_name(0, watch, new_string); state_dirty = 1; } else if(editing_complete && new_string.size != 0 && df_expand_key_match(pt.key, empty_row_key)) { - root = df_eval_root_alloc(view, ewv); - df_eval_root_equip_string(root, new_string); - DF_ExpandKey key = df_expand_key_from_eval_root(root); + watch = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Watch); + df_entity_equip_cfg_src(watch, DF_CfgSrc_Project); + df_entity_equip_name(0, watch, new_string); + DF_ExpandKey key = df_expand_key_from_entity(watch); df_eval_view_set_key_rule(eval_view, key, str8_zero()); state_dirty = 1; } @@ -2066,6 +2181,20 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); df_eval_view_set_key_rule(eval_view, pt.key, new_string); + DF_Entity *watch = df_entity_from_expand_key_and_kind(pt.key, DF_EntityKind_Watch); + DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + if(new_string.size != 0 && df_entity_is_nil(view_rule)) + { + view_rule = df_entity_alloc(0, watch, DF_EntityKind_ViewRule); + } + else if(new_string.size == 0 && !df_entity_is_nil(view_rule)) + { + df_entity_mark_for_deletion(view_rule); + } + if(new_string.size != 0) + { + df_entity_equip_name(0, view_rule, new_string); + } state_dirty = 1; }break; } @@ -2132,23 +2261,27 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // rjf: row deletions if(selection_tbl.min.x <= 0) { - DF_EvalRoot *root = df_eval_root_from_expand_key(ewv, eval_view, pt.key); - if(root != 0) + DF_WatchViewPoint fallback_pt_prev = df_watch_view_point_from_tbl(&blocks, v2s64(0, y - 1)); + DF_WatchViewPoint fallback_pt_next = df_watch_view_point_from_tbl(&blocks, v2s64(0, y + 1)); + DF_Entity *watch = df_entity_from_expand_key_and_kind(pt.key, DF_EntityKind_Watch); + if(!df_entity_is_nil(watch)) { DF_ExpandKey new_cursor_key = empty_row_key; DF_ExpandKey new_cursor_parent_key = empty_row_parent_key; - if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && root->prev != 0) + if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && !df_expand_key_match(df_expand_key_zero(), fallback_pt_prev.key)) { - new_cursor_key = df_expand_key_from_eval_root(root->prev); - new_cursor_parent_key = df_parent_expand_key_from_eval_root(root->prev); + DF_Entity *fallback_watch = df_entity_from_expand_key_and_kind(fallback_pt_prev.key, DF_EntityKind_Watch); + new_cursor_key = fallback_pt_prev.key; + new_cursor_parent_key = df_parent_expand_key_from_entity(fallback_watch); } - else if(root->next != 0) + else if(!df_expand_key_match(df_expand_key_zero(), fallback_pt_next.key)) { - new_cursor_key = df_expand_key_from_eval_root(root->next); - new_cursor_parent_key = df_parent_expand_key_from_eval_root(root->next); + DF_Entity *fallback_watch = df_entity_from_expand_key_and_kind(fallback_pt_next.key, DF_EntityKind_Watch); + new_cursor_key = fallback_pt_next.key; + new_cursor_parent_key = df_parent_expand_key_from_entity(fallback_watch); } DF_WatchViewPoint new_cursor_pt = {DF_WatchViewColumnKind_Expr, new_cursor_parent_key, new_cursor_key}; - df_eval_root_release(ewv, root); + df_entity_mark_for_deletion(watch); ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt; } } @@ -2156,6 +2289,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // rjf: view rule deletions else if(selection_tbl.min.x <= DF_WatchViewColumnKind_ViewRule && DF_WatchViewColumnKind_ViewRule <= selection_tbl.max.x) { + DF_Entity *watch = df_entity_from_expand_key_and_kind(pt.key, DF_EntityKind_Watch); + DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + df_entity_mark_for_deletion(view_rule); df_eval_view_set_key_rule(eval_view, pt.key, str8_zero()); } } @@ -2285,35 +2421,34 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(!ewv->text_editing && evt->flags & UI_EventFlag_Reorder) { taken = 1; - DF_ExpandKey first_root_key = df_key_from_viz_block_list_row_num(&blocks, selection_tbl.min.y); - DF_EvalRoot *first_root = df_eval_root_from_expand_key(ewv, eval_view, first_root_key); - DF_EvalRoot *last_root = first_root; - if(first_root != 0) + DF_ExpandKey first_watch_key = df_key_from_viz_block_list_row_num(&blocks, selection_tbl.min.y); + DF_ExpandKey reorder_group_prev_watch_key = df_key_from_viz_block_list_row_num(&blocks, selection_tbl.min.y - 1); + DF_ExpandKey reorder_group_next_watch_key = df_key_from_viz_block_list_row_num(&blocks, selection_tbl.max.y + 1); + DF_Entity *reorder_group_prev = df_entity_from_expand_key_and_kind(reorder_group_prev_watch_key, DF_EntityKind_Watch); + DF_Entity *reorder_group_next = df_entity_from_expand_key_and_kind(reorder_group_next_watch_key, DF_EntityKind_Watch); + DF_Entity *first_watch = df_entity_from_expand_key_and_kind(first_watch_key, DF_EntityKind_Watch); + DF_Entity *last_watch = first_watch; + if(!df_entity_is_nil(first_watch)) { for(S64 y = selection_tbl.min.y+1; y <= selection_tbl.max.y; y += 1) { DF_ExpandKey key = df_key_from_viz_block_list_row_num(&blocks, y); - DF_EvalRoot *new_root = df_eval_root_from_expand_key(ewv, eval_view, key); - if(new_root != 0) + DF_Entity *new_last = df_entity_from_expand_key_and_kind(key, DF_EntityKind_Watch); + if(!df_entity_is_nil(new_last)) { - last_root = new_root; + last_watch = new_last; } } } - if(evt->delta_2s32.y < 0 && first_root != 0 && first_root->prev != 0) + if(evt->delta_2s32.y < 0 && !df_entity_is_nil(first_watch) && !df_entity_is_nil(reorder_group_prev)) { state_dirty = 1; - DF_EvalRoot *reordered = first_root->prev; - DLLRemove(ewv->first_root, ewv->last_root, reordered); - DLLInsert(ewv->first_root, ewv->last_root, last_root, reordered); + df_entity_change_parent(0, reorder_group_prev, reorder_group_prev->parent, reorder_group_prev->parent, last_watch); } - if(evt->delta_2s32.y > 0 && last_root != 0 && last_root->next != 0) + if(evt->delta_2s32.y > 0 && !df_entity_is_nil(last_watch) && !df_entity_is_nil(reorder_group_next)) { state_dirty = 1; - DF_EvalRoot *prev_child = first_root->prev; - DF_EvalRoot *reordered = last_root->next; - DLLRemove(ewv->first_root, ewv->last_root, reordered); - DLLInsert(ewv->first_root, ewv->last_root, prev_child, reordered); + df_entity_change_parent(0, reorder_group_next, reorder_group_next->parent, reorder_group_next->parent, reorder_group_prev); } } @@ -6863,81 +6998,19 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_VIEW_SETUP_FUNCTION_DEF(Watch) { - ProfBeginFunction(); DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(ewv, view, DF_WatchViewFillKind_Mutable); - - // rjf: add roots for watches - { - Temp scratch = scratch_begin(0, 0); - 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); - for(DF_CfgNode *expr = cfg_root->first; expr != &df_g_nil_cfg_node; expr = expr->next) - { - if(expr->flags & DF_CfgNodeFlag_StringLiteral) - { - DF_EvalRoot *root = df_eval_root_alloc(view, ewv); - DF_ExpandKey key = df_expand_key_from_eval_root(root); - String8 expr_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->string); - df_eval_root_equip_string(root, expr_raw); - if(expr->first != &df_g_nil_cfg_node) - { - String8 view_rule_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->first->string); - df_eval_view_set_key_rule(eval_view, key, view_rule_raw); - } - } - } - scratch_end(scratch); - } - - ProfEnd(); } - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - 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); - { - for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) - { - DF_ExpandKey key = df_expand_key_from_eval_root(root); - String8 string = df_string_from_eval_root(root); - String8 string_escaped = df_cfg_escaped_from_raw_string(scratch.arena, string); - str8_list_pushf(arena, &strs, "\"%S\"", string_escaped); - String8 view_rule = df_eval_view_rule_from_key(eval_view, key); - String8 view_rule_escaped = df_cfg_escaped_from_raw_string(scratch.arena, view_rule); - if(view_rule_escaped.size != 0) - { - str8_list_pushf(arena, &strs, ":{\"%S\"}", view_rule_escaped); - } - if(root->next != 0) - { - str8_list_pushf(arena, &strs, " "); - } - } - } - String8 string = str8_list_join(arena, &strs, 0); - scratch_end(scratch); - return string; -} - +DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) {return str8_lit("");} DF_VIEW_CMD_FUNCTION_DEF(Watch) { - ProfBeginFunction(); 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_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(); } //////////////////////////////// @@ -9112,336 +9185,4 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) scratch_end(scratch); ProfEnd(); - - //~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvvvvvvvvv -#if 0 - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: get state - typedef struct DF_ThemeViewState DF_ThemeViewState; - struct DF_ThemeViewState - { - Vec2S64 cursor; - TxtPt txt_cursor; - TxtPt txt_mark; - U8 txt_buffer[1024]; - U64 txt_size; - DF_ThemeColor color_ctx_menu_color; - Vec4F32 color_ctx_menu_color_hsva; - }; - DF_ThemeViewState *sv = df_view_user_state(view, DF_ThemeViewState); - - //- rjf: build preset ctx menu - UI_Key preset_ctx_menu_key = ui_key_from_stringf(ui_key_zero(), "%p_preset_ctx_menu", view); - DF_Palette(ws, DF_PaletteCode_Floating) UI_CtxMenu(preset_ctx_menu_key) UI_PrefWidth(ui_em(30.f, 1.f)) - { - for(DF_ThemePreset preset = (DF_ThemePreset)0; - preset < DF_ThemePreset_COUNT; - preset = (DF_ThemePreset)(preset+1)) - { - Vec4F32 *colors = df_g_theme_preset_colors_table[preset]; - Vec4F32 bg_color = colors[DF_ThemeColor_BaseBackground]; - Vec4F32 tx_color = colors[DF_ThemeColor_Text]; - Vec4F32 bd_color = colors[DF_ThemeColor_BaseBorder]; - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = tx_color, - .border = bd_color, - .background = bg_color)); - if(ui_clicked(ui_buttonf("%S", df_g_theme_preset_display_string_table[preset]))) - { - MemoryCopy(df_gfx_state->cfg_theme_target.colors, colors, sizeof(df_gfx_state->cfg_theme_target.colors)); - } - } - } - - //- rjf: produce per-color context menu keys - UI_Key *color_ctx_menu_keys = push_array(scratch.arena, UI_Key, DF_ThemeColor_COUNT); - { - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - color_ctx_menu_keys[color] = ui_key_from_stringf(ui_key_zero(), "###settings_color_ctx_menu_%I64x", (U64)color); - } - } - - //- rjf: do color context menus - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(color_ctx_menu_keys[color]) - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefWidth(ui_em(28.5f, 1)) UI_PrefHeight(ui_children_sum(1.f)) - { - // rjf: build title - UI_Row - { - ui_spacer(ui_em(1.5f, 1.f)); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(df_g_theme_color_display_string_table[color]); - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build picker - { - ui_set_next_pref_height(ui_em(22.f, 1.f)); - UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - { - ui_sat_val_pickerf(sv->color_ctx_menu_color_hsva.x, &sv->color_ctx_menu_color_hsva.y, &sv->color_ctx_menu_color_hsva.z, "###settings_satval_picker"); - } - - ui_spacer(ui_em(0.75f, 1.f)); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_hue_pickerf(&sv->color_ctx_menu_color_hsva.x, sv->color_ctx_menu_color_hsva.y, sv->color_ctx_menu_color_hsva.z, "###settings_hue_picker"); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_alpha_pickerf(&sv->color_ctx_menu_color_hsva.w, "###settings_alpha_picker"); - } - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build line edits - UI_Row - UI_WidthFill - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefHeight(ui_children_sum(1.f)) - UI_Column - UI_PrefHeight(ui_em(2.25f, 1.f)) - { - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); - hex_string = push_str8f(scratch.arena, "#%S", hex_string); - String8 r_string = push_str8f(scratch.arena, "%.2f", rgba.x); - String8 g_string = push_str8f(scratch.arena, "%.2f", rgba.y); - String8 b_string = push_str8f(scratch.arena, "%.2f", rgba.z); - String8 h_string = push_str8f(scratch.arena, "%.2f", hsva.x); - String8 s_string = push_str8f(scratch.arena, "%.2f", hsva.y); - String8 v_string = push_str8f(scratch.arena, "%.2f", hsva.z); - String8 a_string = push_str8f(scratch.arena, "%.2f", rgba.w); - UI_Row DF_Font(ws, DF_FontSlot_Code) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("Hex"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, hex_string, "###hex_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = rgba_from_hex_string_4f32(string); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("R"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, r_string, "###r_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32((F32)f64_from_str8(string), rgba.y, rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("G"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, g_string, "###g_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, (F32)f64_from_str8(string), rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("B"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, b_string, "###b_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, rgba.y, (F32)f64_from_str8(string), rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("H"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, h_string, "###h_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32((F32)f64_from_str8(string), hsva.y, hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("S"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, s_string, "###s_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, (F32)f64_from_str8(string), hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("V"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, v_string, "###v_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, (F32)f64_from_str8(string), hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("A"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, a_string, "###a_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, hsva.z, (F32)f64_from_str8(string)); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - } - - // rjf: commit state to theme - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - df_gfx_state->cfg_theme_target.colors[sv->color_ctx_menu_color] = rgba; - } - } - - //- rjf: build non-scrolled header - UI_PrefHeight(ui_px(row_height_px, 1.f)) UI_Row - { - // rjf: preset selector - UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Signal preset_sig = df_icon_buttonf(ws, DF_IconKind_Palette, 0, "Apply Preset"); - if(ui_clicked(preset_sig)) - { - ui_ctx_menu_open(preset_ctx_menu_key, preset_sig.box->key, v2f32(0, dim_2f32(preset_sig.box->rect).y)); - } - } - - // rjf: load-from-file - UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Load From File"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - } - - //- rjf: build palette table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 rect_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(rect_dim.x, rect_dim.y-row_height_px); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(1, DF_ThemeColor_COUNT)); - scroll_list_params.item_range = r1s64(0, DF_ThemeColor_COUNT-1); - 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, - &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) - { - DF_ThemeColor color = (DF_ThemeColor)(row+1); - if(DF_ThemeColor_Null < color && color < DF_ThemeColor_COUNT) - UI_FocusHot(sv->cursor.y == row+2 ? UI_FocusKind_On : UI_FocusKind_Off) - { - Vec4F32 rgba = df_rgba_from_theme_color(color); - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *color_row = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_Clickable, - "###color_%I64x", (U64)color); - UI_Parent(color_row) - { - Vec4F32 bg_color = ui_top_palette()->background; - Vec4F32 default_text_color = ui_top_palette()->text; - F32 default_fallback_factor = clamp_1f32(r1f32(0.3f, 1), dot_4f32(normalize_4f32(rgba), normalize_4f32(bg_color))) - 0.3f; - Vec4F32 text_rgba = mix_4f32(rgba, default_text_color, default_fallback_factor); - UI_WidthFill UI_Palette(ui_build_palette(ui_top_palette(), .text = text_rgba)) ui_label(df_g_theme_color_display_string_table[color]); - ui_set_next_pref_width(ui_top_pref_height()); - UI_HeightFill UI_Column UI_Padding(ui_em(0.3f, 1)) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); - ui_set_next_corner_radius_00(ui_top_font_size()/4.f); - ui_set_next_corner_radius_01(ui_top_font_size()/4.f); - ui_set_next_corner_radius_10(ui_top_font_size()/4.f); - ui_set_next_corner_radius_11(ui_top_font_size()/4.f); - UI_Box *color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, "###color_box"); - UI_Signal color_sig = ui_signal_from_box(color_box); - if(ui_hovering(color_sig)) - { - ui_do_color_tooltip_hsva(hsva); - } - } - ui_spacer(ui_em(0.3f, 1)); - } - UI_Signal color_row_sig = ui_signal_from_box(color_row); - if(ui_clicked(color_row_sig) || ui_right_clicked(color_row_sig)) - { - ui_ctx_menu_open(color_ctx_menu_keys[color], color_row->key, v2f32(0, color_row->rect.y1-color_row->rect.y0)); - sv->color_ctx_menu_color = color; - sv->color_ctx_menu_color_hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_hovering(color_row_sig)) UI_Tooltip - { - ui_label(df_g_theme_color_display_string_table[color]); - } - } - } - } - - scratch_end(scratch); - ProfEnd(); -#endif } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 71edd063..1d0e46e4 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -270,16 +270,6 @@ struct DF_ModulesViewState //////////////////////////////// //~ rjf: Watch, Locals, Registers @view_types -typedef struct DF_EvalRoot DF_EvalRoot; -struct DF_EvalRoot -{ - DF_EvalRoot *next; - DF_EvalRoot *prev; - U64 expr_buffer_string_size; - U64 expr_buffer_cap; - U8 *expr_buffer; -}; - typedef enum DF_WatchViewColumnKind { DF_WatchViewColumnKind_Expr, @@ -350,12 +340,6 @@ struct DF_WatchViewState F32 value_column_pct; F32 type_column_pct; F32 view_rule_column_pct; - - // rjf: mutable fill-kind root expression state - DF_EvalRoot *first_root; - DF_EvalRoot *last_root; - DF_EvalRoot *first_free_root; - U64 root_count; }; //////////////////////////////// @@ -539,16 +523,6 @@ internal DF_CodeViewBuildResult df_code_view_build(Arena *arena, DF_Window *ws, //- rjf: eval watch view instance -> eval view key 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_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_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: watch view points <-> table coordinates internal B32 df_watch_view_point_match(DF_WatchViewPoint a, DF_WatchViewPoint b); internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blocks, Vec2S64 tbl); diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index f4cbe570..44bce28a 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -380,7 +380,6 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) } } - ////////////////////////////// //- rjf: determine frame time, record into history //