From 65d834f08c84720b5f72fd2ec0b1dc02fe1e0983 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 3 Oct 2025 08:32:31 +1000 Subject: [PATCH] change scrolling slightly, add new movement options --- src/editor/buffer.d | 59 +++++++++++++++++++++++++++++++- src/editor/parsing.d | 22 ++++++++---- src/editor/widgets.d | 42 ++++++++++++----------- test/files/syntax_highlighting.d | 8 ++++- 4 files changed, 102 insertions(+), 29 deletions(-) diff --git a/src/editor/buffer.d b/src/editor/buffer.d index 193b9c7..1fae450 100644 --- a/src/editor/buffer.d +++ b/src/editor/buffer.d @@ -466,6 +466,62 @@ MoveDown(FlatBuffer* fb, u64 col) } } +void +MoveToEmptyLine(bool up)(FlatBuffer* fb) +{ + static if(!up) u64 lf_pos; + bool started; + u64 step = up ? -1 : 1; + + u8 ch = 0; + if((fb.buf_pos != 0 && up) || (fb.buf_pos != fb.length && !up)) + { + for(u64 i = fb.buf_pos + step; true; i += step) + { + static if(!up) + { + if(i == fb.length-1) + { + fb.buf_pos = fb.length; + break; + } + + ch = fb.data[i]; + } + + static if(up) + { + if(i == 0) + { + fb.buf_pos = 0; + break; + } + + ch = fb.data[i-1]; + } + + if(started && !CheckWhiteSpace(fb.data[i])) + { + started = false; + } + + if(!started && ch == '\n') + { + started = true; + static if(!up) lf_pos = i; + continue; + } + + if(started && ch == '\n') + { + fb.buf_pos = i; + MoveToSOL(fb); + break; + } + } + } +} + bool Move(FlatBuffer* fb, Input key, Modifier md) { @@ -484,10 +540,11 @@ Move(FlatBuffer* fb, Input key, Modifier md) { case Up: { + MoveToEmptyLine!(true)(fb); } break; case Down: { - + MoveToEmptyLine!(false)(fb); } break; case Left: { diff --git a/src/editor/parsing.d b/src/editor/parsing.d index 04ebadc..98fa6a3 100644 --- a/src/editor/parsing.d +++ b/src/editor/parsing.d @@ -138,6 +138,7 @@ const TokenStyle[TT.max] TOKEN_STYLES = [ TT.LessThan: TS.Op, TT.GreaterThan: TS.Op, TT.Exclamation: TS.Op, + TT.Slash: TS.Op, TT.LeftParen: TS.Bracket, TT.RightParen: TS.Bracket, @@ -188,6 +189,7 @@ const TT[128] D_OP_TOKEN = [ '^': TT.Caret, '&': TT.Ampersand, '*': TT.Asterisk, + '/': TT.Slash, '-': TT.Minus, '=': TT.Equals, '+': TT.Plus, @@ -637,7 +639,6 @@ TokenizeD(FlatBuffer* fb) } else { - Logf("33"); tk.pos += 1; FixOpAssign(fb, t); } @@ -802,11 +803,11 @@ CheckFuncOrTemplateSig(FlatBuffer* fb, Token* token) { macro_decl = true; } - else if(next.type == TT.RightParen || next.next.type == TT.NewLine) + else if(next.type == TT.RightParen && next.next.type == TT.NewLine) { break; } - else if((next.type == TT.LeftParen || next.type == TT.Comma) && Next(next).type != TT.RightParen) + else if((next.type == TT.LeftParen || next.type == TT.Comma) && Next(next).type == TT.Identifier && Next(next).type != TT.RightParen) { Next(next).type = TT.Type; } @@ -1023,14 +1024,21 @@ ParseId(FlatBuffer* fb) void FixOpAssign(FlatBuffer* fb, Token* t) { - Logf("%s %s", cast(char)fb.data[fb.tk.pos], cast(char)fb.data[fb.tk.pos]); - if(fb.tk.pos < fb.length) + if(t.end+1 < fb.length) { - if(fb.data[fb.tk.pos] == '=') + u8[] str = fb.data[t.start .. t.end+1]; + if( + str == "/=" || + str == "+=" || + str == "*=" || + str == "%=" || + str == "&=" || + str == "==" || + str == "!=" + ) { fb.tk.pos += 1; t.end += 1; - Logf("match"); } } } diff --git a/src/editor/widgets.d b/src/editor/widgets.d index 7885579..c4bffc5 100644 --- a/src/editor/widgets.d +++ b/src/editor/widgets.d @@ -285,26 +285,27 @@ SetPanelScroll(UIPanel* panel, i64 rows, f32 text_size) f32 start = panel.anim.start_value; f32 end = panel.anim.end_value; - if(start == 0.0 && end == 0.0) + + f32 offset = (panel.prev_offset-panel.ed.buf.offset) * text_size; + if(offset > 0.0) { - f32 offset = (panel.prev_offset-panel.ed.buf.offset) * text_size; - if(offset > 0.0) - { - end = -offset; - } - else - { - start = offset; - } + end = -offset; + } + else + { + start = offset; } - panel.anim.start_value = start; - panel.anim.end_value = end; + with(panel.anim) + { + start_value = start; + end_value = end; - panel.anim.start_time = 0.1; - panel.anim.remaining_time = 0.1; + start_time = 0.1; + remaining_time = remaining_time > 0.05 ? 0.04 : 0.1; - panel.prev_offset = panel.ed.buf.offset; + panel.prev_offset = panel.ed.buf.offset; + } } f32 @@ -358,14 +359,15 @@ EditorView(UIPanel* panel) offset = Remap(remaining_time, 0.0, start_time, 0.0, 1.0); offset = Remap(EaseOutExp(offset), 0.0, 1.0, start_value, end_value); - if(remaining_time == 0.0) - { - start_value = end_value = start_time = 0.0; - } - line_offset = panel.start_row; line_rows = panel.end_row-panel.start_row; GetLines(&ed.buf, &ed.linebufs, panel.start_row, panel.end_row-panel.start_row); + + if(remaining_time == 0.0) + { + start_value = end_value = start_time = 0.0; + panel.start_row = panel.end_row = -1; + } } else { diff --git a/test/files/syntax_highlighting.d b/test/files/syntax_highlighting.d index af68b64..8bc6b44 100644 --- a/test/files/syntax_highlighting.d +++ b/test/files/syntax_highlighting.d @@ -1,7 +1,7 @@ import std.stdio; @nogc: bool -Test() +Test(float flt, int i) { int x = 5; int y = 10; @@ -71,3 +71,9 @@ T MacroFunc(T)(T x) { return x; } + +int +ArrayParams(int[5] array, float[] array_2) +{ + return array[0]; +}