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 // rjf: unpack command line arguments
String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user"));
String8 project_cfg_path = cmd_line_string(cmdln, str8_lit("project")); 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_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")); 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); 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 internal DF_Handle
df_handle_from_view(DF_View *view) 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); 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->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 internal void
df_panel_remove_tab_view(DF_Panel *panel, DF_View *view) 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) 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; 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 //- rjf: icons & display strings
internal String8 internal String8
@@ -417,7 +469,7 @@ df_cmd_params_from_gfx(void)
{ {
p.window = df_handle_from_window(window); p.window = df_handle_from_window(window);
p.panel = df_handle_from_panel(window->focused_panel); 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; return p;
} }
@@ -426,7 +478,7 @@ internal B32
df_prefer_dasm_from_window(DF_Window *window) df_prefer_dasm_from_window(DF_Window *window)
{ {
DF_Panel *panel = window->focused_panel; 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); DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name);
B32 result = 0; B32 result = 0;
if(view_kind == DF_GfxViewKind_Disassembly) if(view_kind == DF_GfxViewKind_Disassembly)
@@ -443,7 +495,7 @@ df_prefer_dasm_from_window(DF_Window *window)
B32 has_dasm = 0; B32 has_dasm = 0;
for(DF_Panel *p = window->root_panel; !df_panel_is_nil(p); p = df_panel_rec_df_pre(p).next) 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); DF_GfxViewKind p_view_kind = df_gfx_view_kind_from_string(p_view->spec->info.name);
if(p_view_kind == DF_GfxViewKind_Code) if(p_view_kind == DF_GfxViewKind_Code)
{ {
@@ -464,7 +516,7 @@ internal DF_CmdParams
df_cmd_params_from_window(DF_Window *window) df_cmd_params_from_window(DF_Window *window)
{ {
DF_CmdParams p = df_cmd_params_zero(); 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_Window);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); 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); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Index);
p.window = df_handle_from_window(window); p.window = df_handle_from_window(window);
p.panel = df_handle_from_panel(window->focused_panel); 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.prefer_dasm = df_prefer_dasm_from_window(window);
p.entity = ctrl_ctx.thread; p.entity = ctrl_ctx.thread;
p.index = ctrl_ctx.unwind_count; 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_cmd_params_from_panel(DF_Window *window, DF_Panel *panel)
{ {
DF_CmdParams p = df_cmd_params_zero(); 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_Window);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); 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); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Index);
p.window = df_handle_from_window(window); p.window = df_handle_from_window(window);
p.panel = df_handle_from_panel(panel); 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.prefer_dasm = df_prefer_dasm_from_window(window);
p.entity = ctrl_ctx.thread; p.entity = ctrl_ctx.thread;
p.index = ctrl_ctx.unwind_count; 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->first_tab_view = panel->last_tab_view = &df_g_nil_view;
panel->selected_tab_view = df_handle_zero(); 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); DF_View *view = df_view_from_handle(params.view);
if(df_view_is_nil(view) && !df_panel_is_nil(panel)) 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)) 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_remove_tab_view(move_tab_panel, move_tab);
df_panel_insert_tab_view(new_panel, new_panel->last_tab_view, 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); 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) move_tab_panel != new_panel->prev && move_tab_panel != new_panel->next)
{ {
DF_CmdParams p = df_cmd_params_from_panel(ws, move_tab_panel); 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: case DF_CoreCmdKind_NextTab:
{ {
DF_Panel *panel = df_panel_from_handle(params.panel); 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);
view = view->next; DF_View *next_view = view;
if(df_view_is_nil(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); panel->selected_tab_view = df_handle_from_view(view);
}break; }break;
case DF_CoreCmdKind_PrevTab: case DF_CoreCmdKind_PrevTab:
{ {
DF_Panel *panel = df_panel_from_handle(params.panel); 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);
view = view->prev; DF_View *next_view = view;
if(df_view_is_nil(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); panel->selected_tab_view = df_handle_from_view(view);
}break; }break;
case DF_CoreCmdKind_MoveTabRight: case DF_CoreCmdKind_MoveTabRight:
case DF_CoreCmdKind_MoveTabLeft: case DF_CoreCmdKind_MoveTabLeft:
{ {
DF_Panel *panel = ws->focused_panel; 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; 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) 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_remove_tab_view(src_panel, view);
df_panel_insert_tab_view(dst_panel, prev_view, view); df_panel_insert_tab_view(dst_panel, prev_view, view);
ws->focused_panel = dst_panel; 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_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)); 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); 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) 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); DF_Entity *view_entity = df_entity_from_handle(view->entity);
if(view_entity == file) 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: case DF_CoreCmdKind_ReloadActive:
{ {
DF_Panel *panel = df_panel_from_handle(params.panel); 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_Entity *entity = df_entity_from_handle(view->entity);
if(entity->kind == DF_EntityKind_File) 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); 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) 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); DF_Entity *v_param_entity = df_entity_from_handle(v->entity);
if(v_param_entity == df_entity_from_handle(params.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: case DF_CoreCmdKind_SwitchToPartnerFile:
{ {
DF_Panel *panel = df_panel_from_handle(params.panel); 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_Entity *entity = df_entity_from_handle(view->entity);
DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); 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) 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) 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_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name);
DF_Entity *viewed_entity = df_entity_from_handle(view->entity); 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) if((view_kind == DF_GfxViewKind_Code || view_kind == DF_GfxViewKind_PendingEntity) && viewed_entity == src_code)
{ {
panel_w_this_src_code = panel; panel_w_this_src_code = panel;
view_w_this_src_code = view; 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; 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) 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_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name);
if(view_kind == DF_GfxViewKind_Code) 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) 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_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name);
DF_Entity *viewed_entity = df_entity_from_handle(view->entity); DF_Entity *viewed_entity = df_entity_from_handle(view->entity);
if(view_kind == DF_GfxViewKind_Disassembly) if(view_kind == DF_GfxViewKind_Disassembly)
{ {
panel_w_disasm = panel; panel_w_disasm = panel;
view_w_disasm = view; view_w_disasm = view;
if(view == df_view_from_handle(panel->selected_tab_view)) if(view == df_selected_tab_from_panel(panel))
{ {
break; 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); Rng2F32 panel_rect = df_target_rect_from_panel(root_rect, ws->root_panel, panel);
Vec2F32 panel_rect_dim = dim_2f32(panel_rect); Vec2F32 panel_rect_dim = dim_2f32(panel_rect);
F32 area = panel_rect_dim.x * panel_rect_dim.y; 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; best_panel_area = area;
biggest_empty_panel = panel; 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 // rjf: determine if we need a contain or center
DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; 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; 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 // rjf: move cursor & snap-to-cursor
if(!df_panel_is_nil(dst_panel)) 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); dst_panel->selected_tab_view = df_handle_from_view(dst_view);
DF_CmdParams params = df_cmd_params_from_view(ws, dst_panel, dst_view); DF_CmdParams params = df_cmd_params_from_view(ws, dst_panel, dst_view);
params.text_point = point; 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 // rjf: determine if we need a contain or center
DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; 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; 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; B32 view_is_tab = 0;
for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) 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) if(tab == view)
{ {
view_is_tab = 1; view_is_tab = 1;
@@ -3258,6 +3353,48 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds)
scratch_end(scratch); 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 //- 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; 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)) if(!df_view_is_nil(view))
{ {
DF_ViewCmdFunctionType *do_view_cmds_function = view->spec->info.cmd_hook; 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; } if(!df_panel_is_nil(panel->first)) { continue; }
Rng2F32 panel_rect = df_target_rect_from_panel(content_rect, ws->root_panel, panel); 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) && if(!df_view_is_nil(view) &&
contains_2f32(panel_rect, ui_mouse()) && contains_2f32(panel_rect, ui_mouse()) &&
(abs_f32(view->scroll_pos.x.off) > 0.01f || (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; 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) if(tab->is_filtering_t > 0.01f)
{ {
filter_rect.x0 = content_rect.x0; 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 //- 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) UI_Focus(UI_FocusKind_On)
{ {
if(view->is_filtering && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) 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) 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) if(view->flash_t >= 0.001f)
{ {
UI_Box *panel_box = ui_top_parent(); 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) 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) if(view->loading_t >= 0.001f)
{ {
// rjf: set up dimensions // 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 //- 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); DF_VIEW_UI_FUNCTION_NAME(Empty)(ws, panel, &df_g_nil_view, content_rect);
} }
//- rjf: build tab view //- 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; DF_ViewUIFunctionType *build_view_ui_function = view->spec->info.ui_hook;
build_view_ui_function(ws, panel, view, content_rect); 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) 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) 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); 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 // 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; UI_Box *tab_bar_box = &ui_g_nil_box;
U64 drop_site_count = panel->tab_view_count+1; U64 drop_site_count = panel->tab_view_count+1;
DropSite *drop_sites = push_array(scratch.arena, DropSite, drop_site_count); 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) 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_IconKind icon_kind = df_icon_kind_from_view(view);
DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view);
String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, 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) for(DF_View *view = panel->first_tab_view;; view = view->next, view_idx += 1)
{ {
temp_end(scratch); 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, // rjf: if before this tab is the prev-view of the current tab drag,
// draw empty space // 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 // 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_IconKind icon_kind = df_icon_kind_from_view(view);
DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view);
String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, 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; B32 view_is_in_panel = 0;
for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) 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) if(view == dragged_view)
{ {
view_is_in_panel = 1; 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(); 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(); 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; 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; 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 // rjf: serialize view parameterizations
str8_list_push(arena, &strs, str8_lit(": {")); 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 ")); 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; DF_CmdParams p = params;
p.window = df_handle_from_window(window); p.window = df_handle_from_window(window);
p.panel = df_handle_from_panel(window->focused_panel); 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_Window);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View);
@@ -13454,6 +13594,8 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
// rjf: insert // rjf: insert
if(!df_view_is_nil(view)) 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); df_panel_insert_tab_view(panel, panel->last_tab_view, view);
if(view_is_selected) if(view_is_selected)
{ {
+3 -1
View File
@@ -245,7 +245,7 @@ struct DF_Panel
// rjf: tab params // rjf: tab params
Side tab_side; Side tab_side;
// rjf: stable view stacks (tabs) // rjf: stable views (tabs)
DF_View *first_tab_view; DF_View *first_tab_view;
DF_View *last_tab_view; DF_View *last_tab_view;
U64 tab_view_count; U64 tab_view_count;
@@ -803,6 +803,7 @@ internal DF_PathQuery df_path_query_from_string(String8 string);
//~ rjf: View Type Functions //~ rjf: View Type Functions
internal B32 df_view_is_nil(DF_View *view); 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_Handle df_handle_from_view(DF_View *view);
internal DF_View *df_view_from_handle(DF_Handle handle); 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 //- 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_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 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 //- rjf: icons & display strings
internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view); internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view);