diff --git a/src/editor/editor.d b/src/editor/editor.d index 4a98727..f6565e3 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -225,7 +225,6 @@ CreatePanel(EditorCtx* ctx, SizeType size_type = ST.Percentage) p.pct = 1.0; p.scroll_offset = 0.0; p.scroll_target = 0.0; - p.scroll_begin = -1.0; (cast(char[])p.id).sformat("##%08s", ctx.panel_id); p.parent = p.first = p.last = p.next = p.prev = g_UI_NIL_PANEL; diff --git a/src/editor/ui.d b/src/editor/ui.d index 53cd892..8d426fb 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -300,7 +300,6 @@ struct UIPanel i64 vis_lines; i64 prev_start_ln; f32 scroll_offset; - f32 scroll_begin; f32 scroll_target; } @@ -428,47 +427,33 @@ EaseOutQuint(f32 x) void SetScrollOffset(UIPanel* panel) { + const f32 scroll_speed = 0.2; + 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((pos.y < panel.start_ln || pos.y > panel.end_ln)) + if(panel.scroll_offset != panel.scroll_target) { - Logf("1"); - f32 off = f32(panel.start_ln - panel.prev_start_ln)*TEXT_SIZE; - 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 += (scroll_speed * (panel.scroll_target - panel.scroll_offset)) * (g_delta * 60.0); + if(fabsf(panel.scroll_offset-panel.scroll_target) < 0.0009) { panel.scroll_offset = panel.scroll_target; - panel.scroll_begin = -1.0; } } }