fix animated scrolling

This commit is contained in:
Matthew 2025-11-02 11:57:46 +11:00
parent a1edff2726
commit 4005991412
2 changed files with 19 additions and 35 deletions

View File

@ -225,7 +225,6 @@ CreatePanel(EditorCtx* ctx, SizeType size_type = ST.Percentage)
p.pct = 1.0; p.pct = 1.0;
p.scroll_offset = 0.0; p.scroll_offset = 0.0;
p.scroll_target = 0.0; p.scroll_target = 0.0;
p.scroll_begin = -1.0;
(cast(char[])p.id).sformat("##%08s", ctx.panel_id); (cast(char[])p.id).sformat("##%08s", ctx.panel_id);
p.parent = p.first = p.last = p.next = p.prev = g_UI_NIL_PANEL; p.parent = p.first = p.last = p.next = p.prev = g_UI_NIL_PANEL;

View File

@ -300,7 +300,6 @@ struct UIPanel
i64 vis_lines; i64 vis_lines;
i64 prev_start_ln; i64 prev_start_ln;
f32 scroll_offset; f32 scroll_offset;
f32 scroll_begin;
f32 scroll_target; f32 scroll_target;
} }
@ -428,47 +427,33 @@ EaseOutQuint(f32 x)
void void
SetScrollOffset(UIPanel* panel) SetScrollOffset(UIPanel* panel)
{ {
const f32 scroll_speed = 0.2;
U64Vec2 pos = VecPos(&panel.ed.buf); U64Vec2 pos = VecPos(&panel.ed.buf);
if(pos.y > 0) f32 c_start = TEXT_SIZE * pos.y;
f32 c_end = c_start + TEXT_SIZE;
f32 height = f32(panel.vis_lines)*TEXT_SIZE;
f32 boundary_buf = TEXT_SIZE*4.0;
f32 top_boundary = panel.scroll_offset+boundary_buf;
f32 bot_boundary = panel.scroll_offset+height-boundary_buf;
if(panel.scroll_offset != 0.0 && c_start <= top_boundary)
{ {
Logf("y %s start %s end %s prev %s", pos.y, panel.start_ln, panel.end_ln, panel.prev_start_ln); panel.scroll_target = Max(0.0, c_start-boundary_buf);
}
else if(c_end >= bot_boundary)
{
panel.scroll_target = panel.scroll_offset + (c_end-bot_boundary);
} }
Logf("pos %s start %s end %s", pos.y, panel.start_ln, panel.end_ln); if(panel.scroll_offset != panel.scroll_target)
if((pos.y < panel.start_ln || pos.y > panel.end_ln))
{ {
Logf("1"); panel.scroll_offset += (scroll_speed * (panel.scroll_target - panel.scroll_offset)) * (g_delta * 60.0);
f32 off = f32(panel.start_ln - panel.prev_start_ln)*TEXT_SIZE; if(fabsf(panel.scroll_offset-panel.scroll_target) < 0.0009)
panel.scroll_target += off;
panel.prev_start_ln = panel.start_ln;
if(panel.scroll_begin == -1.0)
{
panel.scroll_begin = panel.scroll_offset;
}
}
if(panel.scroll_begin != -1.0)
{
f32 min, max;
if(panel.scroll_offset > panel.scroll_target)
{
min = panel.scroll_target;
max = panel.scroll_offset;
}
else
{
min = panel.scroll_offset;
max = panel.scroll_target;
}
panel.scroll_offset = EaseOutQuint(Lerp(min, max, panel.scroll_offset)) * g_delta;
if(panel.scroll_offset - panel.scroll_target < 0.0009)
{ {
panel.scroll_offset = panel.scroll_target; panel.scroll_offset = panel.scroll_target;
panel.scroll_begin = -1.0;
} }
} }
} }