fix incorrect order on getting the new start line to draw

This commit is contained in:
Matthew 2025-11-02 16:26:07 +11:00
parent 4005991412
commit 5f594a2de1
3 changed files with 17 additions and 11 deletions

@ -1 +1 @@
Subproject commit 441e6adc4898bcc081d806bb9b5aeeb2f4f0ab0d Subproject commit 614ee40d853d65818fd04e41372e0ae492c8d988

View File

@ -138,9 +138,6 @@ Cycle(EditorCtx* ctx, Inputs* inputs)
g_input_mode = ctx.state == ES.InputMode; g_input_mode = ctx.state == ES.InputMode;
// UI Functions After This Point
//BeginBuild(inputs);
BeginUI(ctx, inputs); BeginUI(ctx, inputs);
for(auto p = ctx.base_panel; !Nil(p); p = Recurse(p)) for(auto p = ctx.base_panel; !Nil(p); p = Recurse(p))

View File

@ -10,6 +10,7 @@ import std.stdio;
import std.math.traits : isNaN; import std.math.traits : isNaN;
import std.math.rounding : ceil; import std.math.rounding : ceil;
import std.math.exponential : pow; import std.math.exponential : pow;
import std.math.remainder : fmod;
import std.format : sformat; import std.format : sformat;
import core.stdc.string : memset; import core.stdc.string : memset;
import core.stdc.math : fabsf; import core.stdc.math : fabsf;
@ -427,11 +428,11 @@ EaseOutQuint(f32 x)
void void
SetScrollOffset(UIPanel* panel) SetScrollOffset(UIPanel* panel)
{ {
const f32 scroll_speed = 0.2; f32 scroll_speed = 0.8 * (g_delta * 30.0);
U64Vec2 pos = VecPos(&panel.ed.buf); U64Vec2 pos = VecPos(&panel.ed.buf);
f32 c_start = TEXT_SIZE * pos.y; f32 c_start = TEXT_SIZE * pos.y+1;
f32 c_end = c_start + TEXT_SIZE; f32 c_end = c_start + TEXT_SIZE;
f32 height = f32(panel.vis_lines)*TEXT_SIZE; f32 height = f32(panel.vis_lines)*TEXT_SIZE;
@ -439,11 +440,11 @@ SetScrollOffset(UIPanel* panel)
f32 top_boundary = panel.scroll_offset+boundary_buf; f32 top_boundary = panel.scroll_offset+boundary_buf;
f32 bot_boundary = panel.scroll_offset+height-boundary_buf; f32 bot_boundary = panel.scroll_offset+height-boundary_buf;
if(panel.scroll_offset != 0.0 && c_start <= top_boundary) if(panel.scroll_offset != 0.0 && c_start < top_boundary)
{ {
panel.scroll_target = Max(0.0, c_start-boundary_buf); panel.scroll_target = Max(0.0, c_start-boundary_buf);
} }
else if(c_end >= bot_boundary) else if(c_end > bot_boundary)
{ {
panel.scroll_target = panel.scroll_offset + (c_end-bot_boundary); panel.scroll_target = panel.scroll_offset + (c_end-bot_boundary);
} }
@ -451,8 +452,10 @@ SetScrollOffset(UIPanel* panel)
if(panel.scroll_offset != panel.scroll_target) if(panel.scroll_offset != panel.scroll_target)
{ {
panel.scroll_offset += (scroll_speed * (panel.scroll_target - panel.scroll_offset)) * (g_delta * 60.0); 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) if(fabsf(panel.scroll_offset-panel.scroll_target) < 0.0009)
{ {
Logf("end");
panel.scroll_offset = panel.scroll_target; panel.scroll_offset = panel.scroll_target;
} }
} }
@ -507,6 +510,8 @@ Panel(UIPanel* panel)
Vec2 inner = InnerSize(panel); Vec2 inner = InnerSize(panel);
SetScrollOffset(panel);
panel.start_ln = cast(u64)(floor(panel.scroll_offset/TEXT_SIZE)); panel.start_ln = cast(u64)(floor(panel.scroll_offset/TEXT_SIZE));
panel.end_ln = panel.start_ln + cast(u64)(ceil(inner.y/TEXT_SIZE)); panel.end_ln = panel.start_ln + cast(u64)(ceil(inner.y/TEXT_SIZE));
panel.vis_lines = panel.end_ln - panel.start_ln; panel.vis_lines = panel.end_ln - panel.start_ln;
@ -519,14 +524,18 @@ Panel(UIPanel* panel)
StartLineBuffer(&panel.ed.buf, code_view_width); StartLineBuffer(&panel.ed.buf, code_view_width);
SetScrollOffset(panel);
U64Vec2 pos = VecPos(&ed.buf); U64Vec2 pos = VecPos(&ed.buf);
DrawPanel(panel, lc_w, focused); DrawPanel(panel, lc_w, focused);
f32 y_rem = fmod(panel.scroll_offset, TEXT_SIZE);
if(y_rem != 0.0)
{
Logf("rem %f ln %s", y_rem, panel.start_ln);
}
f32 x = panel.rect.x0; f32 x = panel.rect.x0;
f32 y = panel.rect.y0 + TEXT_SIZE - (panel.scroll_offset % TEXT_SIZE); f32 y = panel.rect.y0 + TEXT_SIZE - fmod(panel.scroll_offset, TEXT_SIZE);
u64 i = panel.start_ln; u64 i = panel.start_ln;
for(auto buf = GetLine(&ed.buf, i); !CheckNil(g_NIL_LINE_BUF, buf) && i < panel.end_ln; i += 1, buf = GetLine(&ed.buf, i)) for(auto buf = GetLine(&ed.buf, i); !CheckNil(g_NIL_LINE_BUF, buf) && i < panel.end_ln; i += 1, buf = GetLine(&ed.buf, i))