filter panel tabs by project, if applicable; move all tab controls & so on to working based on this filtering mechanism

This commit is contained in:
Ryan Fleury
2024-05-24 13:33:47 -07:00
parent 9e778b30b6
commit 5f76fcfb6b
3 changed files with 197 additions and 49 deletions
+4
View File
@@ -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"));
+190 -48
View File
@@ -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)
{
+3 -1
View File
@@ -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);