remove old animation method for panel pcts; since panels are often rearranged in a hierarchy, having pcts being based on parent rectangle (as opposed to the root rectangle) is unstable and often looks bad

This commit is contained in:
Ryan Fleury
2024-04-30 09:17:00 -07:00
parent 3b2656675e
commit cd9437534c
2 changed files with 44 additions and 64 deletions
+43 -60
View File
@@ -226,21 +226,20 @@ df_rect_from_panel_child(Rng2F32 parent_rect, DF_Panel *parent, DF_Panel *panel)
rect.p1.v[axis] = rect.p0.v[axis];
for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next)
{
rect.p1.v[axis] += parent_rect_size.v[axis] * child->size_pct_of_parent.v[axis];
rect.p1.v[axis2_flip(axis)] = rect.p0.v[axis2_flip(axis)] + parent_rect_size.v[axis2_flip(axis)] * child->size_pct_of_parent.v[axis2_flip(axis)];
rect.p1.v[axis] += parent_rect_size.v[axis] * child->pct_of_parent;
if(child == panel)
{
break;
}
rect.p0.v[axis] = rect.p1.v[axis];
}
rect.p0.v[axis] += parent_rect_size.v[axis] * panel->off_pct_of_parent.v[axis];
rect.p0.v[axis2_flip(axis)] += parent_rect_size.v[axis2_flip(axis)] * panel->off_pct_of_parent.v[axis2_flip(axis)];
//rect.p0.v[axis] += parent_rect_size.v[axis] * panel->off_pct_of_parent.v[axis];
//rect.p0.v[axis2_flip(axis)] += parent_rect_size.v[axis2_flip(axis)] * panel->off_pct_of_parent.v[axis2_flip(axis)];
}
rect.x0 = roundf(rect.x0);
rect.x1 = roundf(rect.x1);
rect.y0 = roundf(rect.y0);
rect.y1 = roundf(rect.y1);
rect.x0 = round_f32(rect.x0);
rect.x1 = round_f32(rect.x1);
rect.y0 = round_f32(rect.y0);
rect.y1 = round_f32(rect.y1);
return rect;
}
@@ -1220,13 +1219,12 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{
DF_Panel *next = df_panel_alloc(ws);
df_panel_insert(parent, split_side == Side_Max ? panel : panel->prev, next);
next->size_pct_of_parent_target.v[split_axis] = 1.f / parent->child_count;
next->size_pct_of_parent.v[axis2_flip(split_axis)] = next->size_pct_of_parent_target.v[axis2_flip(split_axis)] = 1.f;
next->pct_of_parent = 1.f/parent->child_count;
for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next)
{
if(child != next)
{
child->size_pct_of_parent_target.v[split_axis] *= (F32)(parent->child_count-1) / (parent->child_count);
child->pct_of_parent *= (F32)(parent->child_count-1) / (parent->child_count);
}
}
ws->focused_panel = next;
@@ -1237,9 +1235,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *pre_prev = panel->prev;
DF_Panel *pre_parent = parent;
DF_Panel *new_parent = df_panel_alloc(ws);
new_parent->size_pct_of_parent.v[split_axis] = panel->size_pct_of_parent.v[split_axis];
new_parent->size_pct_of_parent_target.v[split_axis] = panel->size_pct_of_parent_target.v[split_axis];
new_parent->size_pct_of_parent.v[axis2_flip(split_axis)] = new_parent->size_pct_of_parent_target.v[axis2_flip(split_axis)] = panel->size_pct_of_parent_target.v[axis2_flip(split_axis)];
new_parent->pct_of_parent = panel->pct_of_parent;
if(!df_panel_is_nil(pre_parent))
{
df_panel_remove(pre_parent, panel);
@@ -1251,6 +1247,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
}
DF_Panel *left = panel;
DF_Panel *right = df_panel_alloc(ws);
new_panel = right;
if(split_side == Side_Min)
{
Swap(DF_Panel *, left, right);
@@ -1258,16 +1255,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
df_panel_insert(new_parent, &df_g_nil_panel, left);
df_panel_insert(new_parent, left, right);
new_parent->split_axis = split_axis;
left->size_pct_of_parent.v[split_axis] = 1.f;
left->size_pct_of_parent_target.v[split_axis] = 0.5f;
right->size_pct_of_parent.v[split_axis] = 0.f;
right->size_pct_of_parent_target.v[split_axis] = 0.5f;
left->size_pct_of_parent.v[axis2_flip(split_axis)] = 1.f;
left->size_pct_of_parent_target.v[axis2_flip(split_axis)] = 1.f;
right->size_pct_of_parent.v[axis2_flip(split_axis)] = 1.f;
right->size_pct_of_parent_target.v[axis2_flip(split_axis)] = 1.f;
ws->focused_panel = right;
new_panel = right;
left->pct_of_parent = 0.5f;
right->pct_of_parent = 0.5f;
ws->focused_panel = new_panel;
}
DF_Panel *move_tab_panel = df_panel_from_handle(params.panel);
DF_View *move_tab = df_view_from_handle(params.view);
@@ -1453,8 +1443,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_1 = df_panel_alloc(ws);
df_panel_insert(ws->root_panel, ws->root_panel->last, root_0);
df_panel_insert(ws->root_panel, ws->root_panel->last, root_1);
root_0->size_pct_of_parent = root_0->size_pct_of_parent_target = v2f32(0.85f, 1.f);
root_1->size_pct_of_parent = root_1->size_pct_of_parent_target = v2f32(0.15f, 1.f);
root_0->pct_of_parent = 0.85f;
root_1->pct_of_parent = 0.15f;
// rjf: root_0 split
root_0->split_axis = Axis2_Y;
@@ -1462,8 +1452,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_0_1 = df_panel_alloc(ws);
df_panel_insert(root_0, root_0->last, root_0_0);
df_panel_insert(root_0, root_0->last, root_0_1);
root_0_0->size_pct_of_parent = root_0_0->size_pct_of_parent_target = v2f32(1.f, 0.80f);
root_0_1->size_pct_of_parent = root_0_1->size_pct_of_parent_target = v2f32(1.f, 0.20f);
root_0_0->pct_of_parent = 0.80f;
root_0_1->pct_of_parent = 0.20f;
// rjf: root_1 split
root_1->split_axis = Axis2_Y;
@@ -1471,8 +1461,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_1_1 = df_panel_alloc(ws);
df_panel_insert(root_1, root_1->last, root_1_0);
df_panel_insert(root_1, root_1->last, root_1_1);
root_1_0->size_pct_of_parent = root_1_0->size_pct_of_parent_target = v2f32(1.f, 0.50f);
root_1_1->size_pct_of_parent = root_1_1->size_pct_of_parent_target = v2f32(1.f, 0.50f);
root_1_0->pct_of_parent = 0.50f;
root_1_1->pct_of_parent = 0.50f;
df_panel_insert_tab_view(root_1_0, root_1_0->last_tab_view, targets);
df_panel_insert_tab_view(root_1_1, root_1_1->last_tab_view, scheduler);
root_1_0->selected_tab_view = df_handle_from_view(targets);
@@ -1485,8 +1475,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_0_0_1 = df_panel_alloc(ws);
df_panel_insert(root_0_0, root_0_0->last, root_0_0_0);
df_panel_insert(root_0_0, root_0_0->last, root_0_0_1);
root_0_0_0->size_pct_of_parent = root_0_0_0->size_pct_of_parent_target = v2f32(0.25f, 1.f);
root_0_0_1->size_pct_of_parent = root_0_0_1->size_pct_of_parent_target = v2f32(0.75f, 1.f);
root_0_0_0->pct_of_parent = 0.25f;
root_0_0_1->pct_of_parent = 0.75f;
// rjf: root_0_0_0 split
root_0_0_0->split_axis = Axis2_Y;
@@ -1494,8 +1484,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_0_0_0_1 = df_panel_alloc(ws);
df_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_0);
df_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_1);
root_0_0_0_0->size_pct_of_parent = root_0_0_0_0->size_pct_of_parent_target = v2f32(1.f, 0.5f);
root_0_0_0_1->size_pct_of_parent = root_0_0_0_1->size_pct_of_parent_target = v2f32(1.f, 0.5f);
root_0_0_0_0->pct_of_parent = 0.5f;
root_0_0_0_1->pct_of_parent = 0.5f;
df_panel_insert_tab_view(root_0_0_0_0, root_0_0_0_0->last_tab_view, disasm);
root_0_0_0_0->selected_tab_view = df_handle_from_view(disasm);
df_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, breakpoints);
@@ -1510,8 +1500,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *root_0_1_1 = df_panel_alloc(ws);
df_panel_insert(root_0_1, root_0_1->last, root_0_1_0);
df_panel_insert(root_0_1, root_0_1->last, root_0_1_1);
root_0_1_0->size_pct_of_parent = root_0_1_0->size_pct_of_parent_target = v2f32(0.60f, 1.f);
root_0_1_1->size_pct_of_parent = root_0_1_1->size_pct_of_parent_target = v2f32(0.40f, 1.f);
root_0_1_0->pct_of_parent = 0.60f;
root_0_1_1->pct_of_parent = 0.40f;
df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch);
df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals);
df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs);
@@ -1682,7 +1672,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_Panel *keep_child = panel == parent->first ? parent->last : parent->first;
DF_Panel *grandparent = parent->parent;
DF_Panel *parent_prev = parent->prev;
Vec2F32 size_pct_of_parent = parent->size_pct_of_parent_target;
F32 pct_of_parent = parent->pct_of_parent;
// rjf: unhook kept child
df_panel_remove(parent, keep_child);
@@ -1708,9 +1698,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{
df_panel_insert(grandparent, parent_prev, keep_child);
}
keep_child->size_pct_of_parent_target = size_pct_of_parent;
keep_child->size_pct_of_parent.v[split_axis] *= size_pct_of_parent.v[split_axis];
keep_child->size_pct_of_parent.v[axis2_flip(split_axis)] *= size_pct_of_parent.v[axis2_flip(split_axis)];
keep_child->pct_of_parent = pct_of_parent;
// rjf: reset focus, if needed
if(ws->focused_panel == discard_child)
@@ -1733,8 +1721,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
df_panel_remove(keep_child, child);
df_panel_insert(grandparent, prev, child);
prev = child;
child->size_pct_of_parent_target.v[keep_child->split_axis] *= keep_child->size_pct_of_parent_target.v[grandparent->split_axis];
child->size_pct_of_parent.v[keep_child->split_axis] *= keep_child->size_pct_of_parent_target.v[grandparent->split_axis];
child->pct_of_parent *= keep_child->pct_of_parent;
}
df_panel_release(ws, keep_child);
}
@@ -1743,7 +1730,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
else
{
DF_Panel *next = &df_g_nil_panel;
F32 removed_size_pct = panel->size_pct_of_parent_target.v[parent->split_axis];
F32 removed_size_pct = panel->pct_of_parent;
if(df_panel_is_nil(next)) { next = panel->prev; }
if(df_panel_is_nil(next)) { next = panel->next; }
df_panel_remove(parent, panel);
@@ -1754,7 +1741,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
}
for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next)
{
child->size_pct_of_parent_target.v[parent->split_axis] /= 1.f-removed_size_pct;
child->pct_of_parent /= 1.f-removed_size_pct;
}
}
}
@@ -5803,13 +5790,13 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
if(ui_double_clicked(sig))
{
ui_kill_action();
F32 sum_pct = min_child->size_pct_of_parent_target.v[split_axis] + max_child->size_pct_of_parent_target.v[split_axis];
min_child->size_pct_of_parent_target.v[split_axis] = 0.5f * sum_pct;
max_child->size_pct_of_parent_target.v[split_axis] = 0.5f * sum_pct;
F32 sum_pct = min_child->pct_of_parent + max_child->pct_of_parent;
min_child->pct_of_parent = 0.5f * sum_pct;
max_child->pct_of_parent = 0.5f * sum_pct;
}
else if(ui_pressed(sig))
{
Vec2F32 v = {min_child->size_pct_of_parent_target.v[split_axis], max_child->size_pct_of_parent_target.v[split_axis]};
Vec2F32 v = {min_child->pct_of_parent, max_child->pct_of_parent};
ui_store_drag_struct(&v);
}
else if(ui_dragging(sig))
@@ -5836,8 +5823,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
pct_delta = -(max_pct__after - max_pct__before);
min_pct__after = min_pct__before + pct_delta;
}
min_child->size_pct_of_parent.v[split_axis] = min_child->size_pct_of_parent_target.v[split_axis] = min_pct__after;
max_child->size_pct_of_parent.v[split_axis] = max_child->size_pct_of_parent_target.v[split_axis] = max_pct__after;
min_child->pct_of_parent = min_pct__after;
max_child->pct_of_parent = max_pct__after;
is_changing_panel_boundaries = 1;
}
if(ui_released(sig) || ui_double_clicked(sig))
@@ -6805,23 +6792,21 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
////////////////////////////
//- rjf: animate panel pcts
//
#if 0
{
F32 rate = 1 - pow_f32(2, (-50.f * df_dt()));
for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next)
{
if(abs_f32(panel->off_pct_of_parent.x) > 0.005f ||
abs_f32(panel->off_pct_of_parent.y) > 0.005f ||
abs_f32(panel->size_pct_of_parent_target.x - panel->size_pct_of_parent.x) > 0.005f ||
abs_f32(panel->size_pct_of_parent_target.y - panel->size_pct_of_parent.y) > 0.005f)
abs_f32(panel->off_pct_of_parent.y) > 0.005f)
{
df_gfx_request_frame();
}
panel->off_pct_of_parent.x += (-panel->off_pct_of_parent.x) * rate;
panel->off_pct_of_parent.y += (-panel->off_pct_of_parent.y) * rate;
panel->size_pct_of_parent.x += (panel->size_pct_of_parent_target.x - panel->size_pct_of_parent.x) * rate;
panel->size_pct_of_parent.y += (panel->size_pct_of_parent_target.y - panel->size_pct_of_parent.y) * rate;
}
}
#endif
////////////////////////////
//- rjf: animate views
@@ -8637,7 +8622,7 @@ df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source)
// rjf: non-root needs pct node
if(p != root_panel)
{
str8_list_pushf(arena, &strs, "%.*s%g:\n", indentation*2, indent_str.str, p->size_pct_of_parent_target.v[p->parent->split_axis]);
str8_list_pushf(arena, &strs, "%.*s%g:\n", indentation*2, indent_str.str, p->pct_of_parent);
str8_list_pushf(arena, &strs, "%.*s{\n", indentation*2, indent_str.str);
indentation += 1;
}
@@ -12544,8 +12529,7 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
if(n == cfg_panels)
{
panel = ws->root_panel;
panel->size_pct_of_parent.v[panel_parent->split_axis] = panel->size_pct_of_parent_target.v[panel_parent->split_axis] = 1.f;
panel->size_pct_of_parent.v[axis2_flip(panel_parent->split_axis)] = panel->size_pct_of_parent_target.v[axis2_flip(panel_parent->split_axis)] = 1.f;
panel->pct_of_parent = 1.f;
}
// rjf: allocate & insert non-root panels - these will have a numeric string, determining
@@ -12555,8 +12539,7 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
panel = df_panel_alloc(ws);
df_panel_insert(panel_parent, panel_parent->last, panel);
panel->split_axis = axis2_flip(panel_parent->split_axis);
panel->size_pct_of_parent.v[panel_parent->split_axis] = panel->size_pct_of_parent_target.v[panel_parent->split_axis] = (F32)f64_from_str8(n->string);
panel->size_pct_of_parent.v[axis2_flip(panel_parent->split_axis)] = panel->size_pct_of_parent_target.v[axis2_flip(panel_parent->split_axis)] = 1.f;
panel->pct_of_parent = (F32)f64_from_str8(n->string);
}
// rjf: do general per-panel work
+1 -4
View File
@@ -227,10 +227,7 @@ struct DF_Panel
// rjf: split data
Axis2 split_axis;
Vec2F32 off_pct_of_parent;
Vec2F32 off_pct_of_parent_target;
Vec2F32 size_pct_of_parent;
Vec2F32 size_pct_of_parent_target;
F32 pct_of_parent;
// rjf: tab params
Side tab_side;