From 3691b59af333aa1230f866fa40feb5b98d4ecf40 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Aug 2024 15:13:53 -0700 Subject: [PATCH] set up system for per-view param tree mutations; fix duplicate param key serialization --- src/df/gfx/df_gfx.c | 61 ++++++++++++++++++++++++++++++++----------- src/df/gfx/df_gfx.h | 13 +++++++-- src/df/gfx/df_views.c | 2 +- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index e656c8a1..610af512 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -794,8 +794,11 @@ df_view_alloc(void) view->spec = &df_g_nil_view_spec; view->project_path_arena = arena_alloc(); view->project_path = str8_zero(); - view->params_arena = arena_alloc(); - view->params_root = &md_nil_node; + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + view->params_arenas[idx] = arena_alloc(); + view->params_roots[idx] = &md_nil_node; + } view->query_cursor = view->query_mark = txt_pt(1, 1); view->query_string_size = 0; df_gfx_state->allocated_view_count += 1; @@ -822,7 +825,10 @@ df_view_release(DF_View *view) } view->first_arena_ext = view->last_arena_ext = 0; arena_release(view->project_path_arena); - arena_release(view->params_arena); + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + arena_release(view->params_arenas[idx]); + } arena_release(view->arena); view->generation += 1; df_gfx_state->allocated_view_count -= 1; @@ -835,8 +841,11 @@ internal void df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, String8 query, MD_Node *params) { // rjf: fill params tree - arena_clear(view->params_arena); - view->params_root = md_tree_copy(view->params_arena, params); + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + arena_clear(view->params_arenas[idx]); + } + view->params_roots[0] = md_tree_copy(view->params_arenas[0], params); // rjf: fill query buffer view->query_string_size = Min(sizeof(view->query_buffer), query.size); @@ -877,7 +886,7 @@ df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, String8 } view->is_filtering = 0; view->is_filtering_t = 0; - view_setup(window, view, view->params_root, str8(view->query_buffer, view->query_string_size)); + view_setup(window, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); } } @@ -3440,7 +3449,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { df_push_interact_regs(); DF_ViewCmdFunctionType *do_view_cmds_function = view->spec->info.cmd_hook; - do_view_cmds_function(ws, panel, view, view->params_root, str8(view->query_buffer, view->query_string_size), cmds); + do_view_cmds_function(ws, panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), cmds); DF_InteractRegs *view_regs = df_pop_interact_regs(); if(panel == ws->focused_panel) { @@ -3666,7 +3675,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_ViewSpec *view_spec = view->spec; DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, view->params_root, str8(view->query_buffer, view->query_string_size), view_preview_container->rect); + build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), view_preview_container->rect); } } } @@ -6123,7 +6132,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_ViewSpec *view_spec = view->spec; DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, view->params_root, str8(view->query_buffer, view->query_string_size), query_container_content_rect); + build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), query_container_content_rect); } //- rjf: query submission @@ -7280,7 +7289,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_View *view = df_selected_tab_from_panel(panel); DF_ViewUIFunctionType *build_view_ui_function = view->spec->info.ui_hook; - build_view_ui_function(ws, panel, view, view->params_root, str8(view->query_buffer, view->query_string_size), content_rect); + build_view_ui_function(ws, panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), content_rect); } //- rjf: fill with per-view states, after the view has a chance to run @@ -9437,16 +9446,38 @@ df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source) scratch_end(scratch); } { - MD_NodeRec rec = {0}; - for(MD_Node *n = view->params_root; n != 0 && n != &md_nil_node; n = rec.next) + String8 reserved_keys[] = { - rec = md_node_rec_depth_first_pre(n, view->params_root); - if(n != view->params_root) + str8_lit("project"), + str8_lit("query"), + str8_lit("selected"), + }; + MD_NodeRec rec = {0}; + MD_Node *params_root = view->params_roots[view->params_gen%ArrayCount(view->params_roots)]; + for(MD_Node *n = params_root; + !md_node_is_nil(n); + n = rec.next) + { + rec = md_node_rec_depth_first_pre(n, params_root); + B32 is_reserved_key = 0; + for(U64 idx = 0; idx < ArrayCount(reserved_keys); idx += 1) + { + if(str8_match(n->string, reserved_keys[idx], 0)) + { + is_reserved_key = 1; + break; + } + } + if(is_reserved_key) + { + rec = md_node_rec_depth_first(n, params_root, OffsetOf(MD_Node, next), OffsetOf(MD_Node, next)); + } + if(!is_reserved_key && n != params_root) { str8_list_pushf(arena, &strs, "%S", n->string); if(n->first != &md_nil_node) { - str8_list_pushf(arena, &strs, ":{"); + str8_list_pushf(arena, &strs, ":{ "); } for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) { diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 57f5fcb4..a8790a6a 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -182,6 +182,14 @@ struct DF_TransientViewSlot DF_TransientViewNode *last; }; +typedef struct DF_ViewParamDelta DF_ViewParamDelta; +struct DF_ViewParamDelta +{ + DF_ViewParamDelta *next; + MD_Node *key_node; + String8 value; +}; + typedef struct DF_View DF_View; struct DF_View { @@ -232,8 +240,9 @@ struct DF_View F32 is_filtering_t; // rjf: params tree state - Arena *params_arena; - MD_Node *params_root; + Arena *params_arenas[2]; + MD_Node *params_roots[2]; + U64 params_gen; // rjf: text query state TxtPt query_cursor; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 1ecdb9b4..14a2aac7 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2772,7 +2772,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //- rjf: build UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX) { - canvas_view_spec->info.ui_hook(ws, &df_g_nil_panel, canvas_view, canvas_view->params_root, str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_rect); + canvas_view_spec->info.ui_hook(ws, &df_g_nil_panel, canvas_view, canvas_view->params_roots[canvas_view->params_gen%ArrayCount(canvas_view->params_roots)], str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_rect); } //- rjf: pop interaction registers