mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-16 17:12:23 -07:00
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:
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user