From 5f76fcfb6b6f33587b3c03090c4fb292dc0dccec Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 24 May 2024 13:33:47 -0700 Subject: [PATCH] filter panel tabs by project, if applicable; move all tab controls & so on to working based on this filtering mechanism --- src/df/core/df_core.c | 4 + src/df/gfx/df_gfx.c | 238 +++++++++++++++++++++++++++++++++--------- src/df/gfx/df_gfx.h | 4 +- 3 files changed, 197 insertions(+), 49 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 9900ad9d..704802c2 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6530,6 +6530,10 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) // rjf: unpack command line arguments String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); String8 project_cfg_path = cmd_line_string(cmdln, str8_lit("project")); + if(project_cfg_path.size == 0) + { + project_cfg_path = cmd_line_string(cmdln, str8_lit("profile")); + } { String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index f7ff95b2..e54a6f30 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -74,6 +74,22 @@ df_view_is_nil(DF_View *view) return (view == 0 || view == &df_g_nil_view); } +internal B32 +df_view_is_project_filtered(DF_View *view) +{ + B32 result = 0; + DF_Entity *view_project = df_entity_from_handle(view->project); + if(!df_entity_is_nil(view_project)) + { + DF_Entity *current_project = df_entity_from_path(df_cfg_path_from_src(DF_CfgSrc_Project), 0); + if(current_project != view_project) + { + result = 1; + } + } + return result; +} + internal DF_Handle df_handle_from_view(DF_View *view) { @@ -294,20 +310,56 @@ df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view) { DLLInsert_NPZ(&df_g_nil_view, panel->first_tab_view, panel->last_tab_view, prev_view, view, next, prev); panel->tab_view_count += 1; - panel->selected_tab_view = df_handle_from_view(view); + if(!df_view_is_project_filtered(view)) + { + panel->selected_tab_view = df_handle_from_view(view); + } } internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view) { - DLLRemove_NPZ(&df_g_nil_view, panel->first_tab_view, panel->last_tab_view, view, next, prev); if(df_view_from_handle(panel->selected_tab_view) == view) { - panel->selected_tab_view = df_handle_from_view(!df_view_is_nil(view->prev) ? view->prev : view->next); + panel->selected_tab_view = df_handle_zero(); + if(df_handle_match(df_handle_zero(), panel->selected_tab_view)) + { + for(DF_View *v = view->next; !df_view_is_nil(v); v = v->next) + { + if(!df_view_is_project_filtered(v)) + { + panel->selected_tab_view = df_handle_from_view(v); + break; + } + } + } + if(df_handle_match(df_handle_zero(), panel->selected_tab_view)) + { + for(DF_View *v = view->prev; !df_view_is_nil(v); v = v->prev) + { + if(!df_view_is_project_filtered(v)) + { + panel->selected_tab_view = df_handle_from_view(v); + break; + } + } + } } + DLLRemove_NPZ(&df_g_nil_view, panel->first_tab_view, panel->last_tab_view, view, next, prev); panel->tab_view_count -= 1; } +internal DF_View * +df_selected_tab_from_panel(DF_Panel *panel) +{ + DF_View *view = df_view_from_handle(panel->selected_tab_view); + if(df_view_is_project_filtered(view)) + { + view = &df_g_nil_view; + } + return view; +} + //- rjf: icons & display strings internal String8 @@ -417,7 +469,7 @@ df_cmd_params_from_gfx(void) { p.window = df_handle_from_window(window); p.panel = df_handle_from_panel(window->focused_panel); - p.view = window->focused_panel->selected_tab_view; + p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); } return p; } @@ -426,7 +478,7 @@ internal B32 df_prefer_dasm_from_window(DF_Window *window) { DF_Panel *panel = window->focused_panel; - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); B32 result = 0; if(view_kind == DF_GfxViewKind_Disassembly) @@ -443,7 +495,7 @@ df_prefer_dasm_from_window(DF_Window *window) B32 has_dasm = 0; for(DF_Panel *p = window->root_panel; !df_panel_is_nil(p); p = df_panel_rec_df_pre(p).next) { - DF_View *p_view = df_view_from_handle(p->selected_tab_view); + DF_View *p_view = df_selected_tab_from_panel(p); DF_GfxViewKind p_view_kind = df_gfx_view_kind_from_string(p_view->spec->info.name); if(p_view_kind == DF_GfxViewKind_Code) { @@ -464,7 +516,7 @@ internal DF_CmdParams df_cmd_params_from_window(DF_Window *window) { DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_view_from_handle(window->focused_panel->selected_tab_view)); + DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(window->focused_panel)); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -473,7 +525,7 @@ df_cmd_params_from_window(DF_Window *window) df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Index); p.window = df_handle_from_window(window); p.panel = df_handle_from_panel(window->focused_panel); - p.view = window->focused_panel->selected_tab_view; + p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); p.prefer_dasm = df_prefer_dasm_from_window(window); p.entity = ctrl_ctx.thread; p.index = ctrl_ctx.unwind_count; @@ -484,7 +536,7 @@ internal DF_CmdParams df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel) { DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_view_from_handle(panel->selected_tab_view)); + DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(panel)); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -493,7 +545,7 @@ df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel) df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Index); p.window = df_handle_from_window(window); p.panel = df_handle_from_panel(panel); - p.view = panel->selected_tab_view; + p.view = df_handle_from_view(df_selected_tab_from_panel(panel)); p.prefer_dasm = df_prefer_dasm_from_window(window); p.entity = ctrl_ctx.thread; p.index = ctrl_ctx.unwind_count; @@ -943,6 +995,7 @@ df_panel_release_all_views(DF_Panel *panel) } panel->first_tab_view = panel->last_tab_view = &df_g_nil_view; panel->selected_tab_view = df_handle_zero(); + panel->tab_view_count = 0; } //////////////////////////////// @@ -1204,7 +1257,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_View *view = df_view_from_handle(params.view); if(df_view_is_nil(view) && !df_panel_is_nil(panel)) { - view = df_view_from_handle(panel->selected_tab_view); + view = df_selected_tab_from_panel(panel); } if(!df_view_is_nil(view)) { @@ -1322,7 +1375,16 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) df_panel_remove_tab_view(move_tab_panel, move_tab); df_panel_insert_tab_view(new_panel, new_panel->last_tab_view, move_tab); new_panel->selected_tab_view = df_handle_from_view(move_tab); - if(df_view_is_nil(move_tab_panel->first_tab_view) && move_tab_panel != ws->root_panel && + B32 move_tab_panel_is_empty = 1; + for(DF_View *v = move_tab_panel->first_tab_view; !df_view_is_nil(v); v = v->next) + { + if(!df_view_is_project_filtered(v)) + { + move_tab_panel_is_empty = 0; + break; + } + } + if(move_tab_panel_is_empty && move_tab_panel != ws->root_panel && move_tab_panel != new_panel->prev && move_tab_panel != new_panel->next) { DF_CmdParams p = df_cmd_params_from_panel(ws, move_tab_panel); @@ -1910,30 +1972,40 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) case DF_CoreCmdKind_NextTab: { DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(panel->selected_tab_view); - view = view->next; - if(df_view_is_nil(view)) + DF_View *view = df_selected_tab_from_panel(panel); + DF_View *next_view = view; + for(DF_View *v = view; !df_view_is_nil(v); v = df_view_is_nil(v->next) ? panel->first_tab_view : v->next) { - view = panel->first_tab_view; + if(!df_view_is_project_filtered(v)) + { + next_view = v; + break; + } } + view = next_view; panel->selected_tab_view = df_handle_from_view(view); }break; case DF_CoreCmdKind_PrevTab: { DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(panel->selected_tab_view); - view = view->prev; - if(df_view_is_nil(view)) + DF_View *view = df_selected_tab_from_panel(panel); + DF_View *next_view = view; + for(DF_View *v = view; !df_view_is_nil(v); v = df_view_is_nil(v->prev) ? panel->last_tab_view : v->prev) { - view = panel->last_tab_view; + if(!df_view_is_project_filtered(v)) + { + next_view = v; + break; + } } + view = next_view; panel->selected_tab_view = df_handle_from_view(view); }break; case DF_CoreCmdKind_MoveTabRight: case DF_CoreCmdKind_MoveTabLeft: { DF_Panel *panel = ws->focused_panel; - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); DF_View *prev_view = core_cmd_kind == DF_CoreCmdKind_MoveTabRight ? view->next : view->prev->prev; if(!df_view_is_nil(prev_view) || core_cmd_kind == DF_CoreCmdKind_MoveTabLeft) { @@ -1986,7 +2058,16 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) df_panel_remove_tab_view(src_panel, view); df_panel_insert_tab_view(dst_panel, prev_view, view); ws->focused_panel = dst_panel; - if(df_view_is_nil(src_panel->first_tab_view) && src_panel != ws->root_panel) + B32 src_panel_is_empty = 1; + for(DF_View *v = src_panel->first_tab_view; !df_view_is_nil(v); v = v->next) + { + if(!df_view_is_project_filtered(v)) + { + src_panel_is_empty = 0; + break; + } + } + if(src_panel_is_empty && src_panel != ws->root_panel) { DF_CmdParams p = df_cmd_params_from_panel(ws, src_panel); df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClosePanel)); @@ -2028,7 +2109,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_Entity *file = df_entity_from_handle(params.entity); for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); DF_Entity *view_entity = df_entity_from_handle(view->entity); if(view_entity == file) { @@ -2039,7 +2120,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) case DF_CoreCmdKind_ReloadActive: { DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); DF_Entity *entity = df_entity_from_handle(view->entity); if(entity->kind == DF_EntityKind_File) { @@ -2055,6 +2136,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_Panel *panel = df_panel_from_handle(params.panel); for(DF_View *v = panel->first_tab_view; !df_view_is_nil(v); v = v->next) { + if(df_view_is_project_filtered(v)) { continue; } DF_Entity *v_param_entity = df_entity_from_handle(v->entity); if(v_param_entity == df_entity_from_handle(params.entity)) { @@ -2078,7 +2160,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) case DF_CoreCmdKind_SwitchToPartnerFile: { DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); DF_Entity *entity = df_entity_from_handle(view->entity); DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); if(view_kind == DF_GfxViewKind_Code && entity->kind == DF_EntityKind_File) @@ -2963,13 +3045,14 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) { + if(df_view_is_project_filtered(view)) { continue; } DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); DF_Entity *viewed_entity = df_entity_from_handle(view->entity); if((view_kind == DF_GfxViewKind_Code || view_kind == DF_GfxViewKind_PendingEntity) && viewed_entity == src_code) { panel_w_this_src_code = panel; view_w_this_src_code = view; - if(view == df_view_from_handle(panel->selected_tab_view)) + if(view == df_selected_tab_from_panel(panel)) { break; } @@ -2987,6 +3070,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) { + if(df_view_is_project_filtered(view)) { continue; } DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); if(view_kind == DF_GfxViewKind_Code) { @@ -3007,13 +3091,14 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) { + if(df_view_is_project_filtered(view)) { continue; } DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); DF_Entity *viewed_entity = df_entity_from_handle(view->entity); if(view_kind == DF_GfxViewKind_Disassembly) { panel_w_disasm = panel; view_w_disasm = view; - if(view == df_view_from_handle(panel->selected_tab_view)) + if(view == df_selected_tab_from_panel(panel)) { break; } @@ -3057,7 +3142,16 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) Rng2F32 panel_rect = df_target_rect_from_panel(root_rect, ws->root_panel, panel); Vec2F32 panel_rect_dim = dim_2f32(panel_rect); F32 area = panel_rect_dim.x * panel_rect_dim.y; - if(df_view_is_nil(panel->first_tab_view) && (best_panel_area == 0 || area > best_panel_area)) + B32 panel_is_empty = 1; + for(DF_View *v = panel->first_tab_view; !df_view_is_nil(v); v = v->next) + { + if(!df_view_is_project_filtered(v)) + { + panel_is_empty = 0; + break; + } + } + if(panel_is_empty && (best_panel_area == 0 || area > best_panel_area)) { best_panel_area = area; biggest_empty_panel = panel; @@ -3091,7 +3185,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // rjf: determine if we need a contain or center DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; - if(!df_panel_is_nil(dst_panel) && dst_view == view_w_this_src_code && df_view_from_handle(dst_panel->selected_tab_view) == dst_view) + if(!df_panel_is_nil(dst_panel) && dst_view == view_w_this_src_code && df_selected_tab_from_panel(dst_panel) == dst_view) { cursor_snap_kind = DF_CoreCmdKind_ContainCursor; } @@ -3099,7 +3193,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // rjf: move cursor & snap-to-cursor if(!df_panel_is_nil(dst_panel)) { - disasm_view_prioritized = (df_view_from_handle(dst_panel->selected_tab_view) == view_w_disasm); + disasm_view_prioritized = (df_selected_tab_from_panel(dst_panel) == view_w_disasm); dst_panel->selected_tab_view = df_handle_from_view(dst_view); DF_CmdParams params = df_cmd_params_from_view(ws, dst_panel, dst_view); params.text_point = point; @@ -3139,7 +3233,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // rjf: determine if we need a contain or center DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; - if(dst_view == view_w_disasm && df_view_from_handle(dst_panel->selected_tab_view) == dst_view) + if(dst_view == view_w_disasm && df_selected_tab_from_panel(dst_panel) == dst_view) { cursor_snap_kind = DF_CoreCmdKind_ContainCursor; } @@ -3167,6 +3261,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) B32 view_is_tab = 0; for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) { + if(df_view_is_project_filtered(tab)) { continue; } if(tab == view) { view_is_tab = 1; @@ -3258,6 +3353,48 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) scratch_end(scratch); } + ////////////////////////////// + //- rjf: panels with no selected tabs? -> select. + // panels with selected tabs? -> ensure they have active tabs. + // + for(DF_Panel *panel = ws->root_panel; + !df_panel_is_nil(panel); + panel = df_panel_rec_df_pre(panel).next) + { + if(!df_panel_is_nil(panel->first)) + { + continue; + } + DF_View *view = df_selected_tab_from_panel(panel); + if(df_view_is_nil(view)) + { + for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) + { + if(!df_view_is_project_filtered(tab)) + { + panel->selected_tab_view = df_handle_from_view(tab); + break; + } + } + } + if(!df_view_is_nil(view)) + { + B32 found = 0; + for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) + { + if(df_view_is_project_filtered(tab)) {continue;} + if(tab == view) + { + found = 1; + } + } + if(!found) + { + panel->selected_tab_view = df_handle_zero(); + } + } + } + ////////////////////////////// //- rjf: process view-level commands on leaf panels // @@ -3271,7 +3408,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { continue; } - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); if(!df_view_is_nil(view)) { DF_ViewCmdFunctionType *do_view_cmds_function = view->spec->info.cmd_hook; @@ -5702,7 +5839,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { if(!df_panel_is_nil(panel->first)) { continue; } Rng2F32 panel_rect = df_target_rect_from_panel(content_rect, ws->root_panel, panel); - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); if(!df_view_is_nil(view) && contains_2f32(panel_rect, ui_mouse()) && (abs_f32(view->scroll_pos.x.off) > 0.01f || @@ -6369,7 +6506,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) content_rect.y1 = panel_rect.y1 - tab_bar_vheight; } { - DF_View *tab = df_view_from_handle(panel->selected_tab_view); + DF_View *tab = df_selected_tab_from_panel(panel); if(tab->is_filtering_t > 0.01f) { filter_rect.x0 = content_rect.x0; @@ -6568,7 +6705,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: build filtering box // { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); UI_Focus(UI_FocusKind_On) { if(view->is_filtering && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) @@ -6643,7 +6780,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // UI_Parent(panel_box) { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); if(view->flash_t >= 0.001f) { UI_Box *panel_box = ui_top_parent(); @@ -6666,7 +6803,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // UI_Parent(panel_box) { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); if(view->loading_t >= 0.001f) { // rjf: set up dimensions @@ -6767,15 +6904,15 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } //- rjf: build empty view - UI_Parent(view_container_box) if(df_view_is_nil(df_view_from_handle(panel->selected_tab_view))) + UI_Parent(view_container_box) if(df_view_is_nil(df_selected_tab_from_panel(panel))) { DF_VIEW_UI_FUNCTION_NAME(Empty)(ws, panel, &df_g_nil_view, content_rect); } //- rjf: build tab view - UI_Parent(view_container_box) if(!df_view_is_nil(df_view_from_handle(panel->selected_tab_view))) + UI_Parent(view_container_box) if(!df_view_is_nil(df_selected_tab_from_panel(panel))) { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + 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, content_rect); } @@ -6786,7 +6923,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // UI_Focus(UI_FocusKind_On) { - DF_View *view = df_view_from_handle(panel->selected_tab_view); + DF_View *view = df_selected_tab_from_panel(panel); if(ui_is_focus_active() && view->spec->info.flags & DF_ViewSpecFlag_TypingAutomaticallyFilters && !view->is_filtering) { DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); @@ -6842,7 +6979,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) }; // rjf: prep output data - DF_View *next_selected_tab_view = df_view_from_handle(panel->selected_tab_view); + DF_View *next_selected_tab_view = df_selected_tab_from_panel(panel); UI_Box *tab_bar_box = &ui_g_nil_box; U64 drop_site_count = panel->tab_view_count+1; DropSite *drop_sites = push_array(scratch.arena, DropSite, drop_site_count); @@ -6874,7 +7011,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) { - B32 view_is_selected = (view == df_view_from_handle(panel->selected_tab_view)); + if(df_view_is_project_filtered(view)) { continue; } + B32 view_is_selected = (view == df_selected_tab_from_panel(panel)); DF_IconKind icon_kind = df_icon_kind_from_view(view); DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, view); @@ -6935,6 +7073,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) for(DF_View *view = panel->first_tab_view;; view = view->next, view_idx += 1) { temp_end(scratch); + if(df_view_is_project_filtered(view)) { continue; } // rjf: if before this tab is the prev-view of the current tab drag, // draw empty space @@ -6967,7 +7106,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } // rjf: gather info for this tab - B32 view_is_selected = (view == df_view_from_handle(panel->selected_tab_view)); + B32 view_is_selected = (view == df_selected_tab_from_panel(panel)); DF_IconKind icon_kind = df_icon_kind_from_view(view); DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, view); @@ -7260,6 +7399,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) B32 view_is_in_panel = 0; for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) { + if(df_view_is_project_filtered(view)) { continue; } if(view == dragged_view) { view_is_in_panel = 1; @@ -7347,7 +7487,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { df_gfx_request_frame(); } - if(view->loading_t_target != 0 && view == df_view_from_handle(panel->selected_tab_view)) + if(view->loading_t_target != 0 && view == df_selected_tab_from_panel(panel)) { df_gfx_request_frame(); } @@ -7368,7 +7508,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { view->is_filtering_t = (F32)!!view->is_filtering; } - if(view == df_view_from_handle(panel->selected_tab_view)) + if(view == df_selected_tab_from_panel(panel)) { view->loading_t_target = 0; } @@ -9358,7 +9498,7 @@ df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source) // rjf: serialize view parameterizations str8_list_push(arena, &strs, str8_lit(": {")); - if(view == df_view_from_handle(p->selected_tab_view)) + if(view == df_selected_tab_from_panel(p)) { str8_list_push(arena, &strs, str8_lit("selected ")); } @@ -13163,7 +13303,7 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds) DF_CmdParams p = params; p.window = df_handle_from_window(window); p.panel = df_handle_from_panel(window->focused_panel); - p.view = df_handle_from_view(df_view_from_handle(window->focused_panel->selected_tab_view)); + p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -13454,6 +13594,8 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds) // rjf: insert if(!df_view_is_nil(view)) { + DF_Entity *current_project = df_entity_from_path(df_cfg_path_from_src(DF_CfgSrc_Project), DF_EntityFromPathFlag_OpenMissing|DF_EntityFromPathFlag_OpenAsNeeded); + DF_Entity *view_project = df_entity_from_handle(view->project); df_panel_insert_tab_view(panel, panel->last_tab_view, view); if(view_is_selected) { diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 50370808..8e17fe14 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -245,7 +245,7 @@ struct DF_Panel // rjf: tab params Side tab_side; - // rjf: stable view stacks (tabs) + // rjf: stable views (tabs) DF_View *first_tab_view; DF_View *last_tab_view; U64 tab_view_count; @@ -803,6 +803,7 @@ internal DF_PathQuery df_path_query_from_string(String8 string); //~ rjf: View Type Functions internal B32 df_view_is_nil(DF_View *view); +internal B32 df_view_is_project_filtered(DF_View *view); internal DF_Handle df_handle_from_view(DF_View *view); internal DF_View *df_view_from_handle(DF_Handle handle); @@ -839,6 +840,7 @@ internal Rng2F32 df_target_rect_from_panel(Rng2F32 root_rect, DF_Panel *root, DF //- rjf: view ownership insertion/removal internal void df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view); internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view); +internal DF_View *df_selected_tab_from_panel(DF_Panel *panel); //- rjf: icons & display strings internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view);