From 3a433446cb8af026d3b51cc5dc3d0f11b79003f5 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 2 Oct 2025 06:53:45 +1000 Subject: [PATCH] implemented navigation keys --- src/editor/buffer.d | 85 ++++++++++++++++++++++++++++++++++---------- src/editor/editor.d | 72 ++++++++++++++++++++++--------------- src/editor/parsing.d | 6 ++++ 3 files changed, 116 insertions(+), 47 deletions(-) diff --git a/src/editor/buffer.d b/src/editor/buffer.d index 8c99919..193b9c7 100644 --- a/src/editor/buffer.d +++ b/src/editor/buffer.d @@ -397,6 +397,38 @@ GetLines(FlatBuffer* buffer, LineBuffers* linebufs, u64 start_line, u64 length) } } +void +MoveToEOL(FlatBuffer* fb) +{ + if(fb.data[fb.buf_pos] != '\n') + { + for(u64 i = 0; i < fb.line_starts.length; i += 1) + { + if(fb.buf_pos < fb.line_starts[i].pos) + { + fb.buf_pos = 0 < i ? fb.line_starts[i].pos-1 : fb.length; + break; + } + } + } +} + +void +MoveToSOL(FlatBuffer* fb) +{ + if(fb.buf_pos != 0 && fb.data[fb.buf_pos-1] != '\n') + { + for(u64 i = 0; i < fb.line_starts.length; i += 1) + { + if(fb.buf_pos < fb.line_starts[i].pos) + { + fb.buf_pos = i > 0 ? fb.line_starts[i-1].pos : 0; + break; + } + } + } +} + void MoveUp(FlatBuffer* fb) { @@ -434,77 +466,90 @@ MoveDown(FlatBuffer* fb, u64 col) } } -void +bool Move(FlatBuffer* fb, Input key, Modifier md) { - if(md & (MD.LeftShift | MD.RightShift)) + bool taken; + + switch(key) with(Input) { - switch(key) + case Home: MoveToSOL(fb); taken = true; break; + case End: MoveToEOL(fb); taken = true; break; + default: break; + } + + if(!taken && md & (MD.LeftShift | MD.RightShift)) + { + switch(key) with(Input) { - case Input.Up: + case Up: { } break; - case Input.Down: + case Down: { } break; - case Input.Left: + case Left: { } break; - case Input.Right: + case Right: { } break; default: break; } } - else if(md & (MD.LeftCtrl | MD.RightCtrl)) + else if(!taken && md & (MD.LeftCtrl | MD.RightCtrl)) { - switch(key) + switch(key) with(Input) { - case Input.Up: + case Up: { } break; - case Input.Down: + case Down: { } break; - case Input.Left: + case Left: { } break; - case Input.Right: + case Right: { } break; default: break; } } - else + else if(!taken) { - switch(key) + switch(key) with(Input) { - case Input.Down: + case Down: { MoveDown(fb); + taken = true; } break; - case Input.Up: + case Up: { MoveUp(fb); + taken = true; } break; - case Input.Left: + case Left: { if(fb.buf_pos > 0 && fb.data[fb.buf_pos-1] != '\n') { fb.buf_pos -= 1; + taken = true; } } break; - case Input.Right: + case Right: { if(fb.buf_pos < fb.length && fb.data[fb.buf_pos] != '\n') { fb.buf_pos += 1; + taken = true; } } break; default: break; @@ -513,6 +558,8 @@ Move(FlatBuffer* fb, Input key, Modifier md) AdjustOffset(fb); U64Vec2 p = VecPos(fb); + + return taken; } void diff --git a/src/editor/editor.d b/src/editor/editor.d index 6d3f989..2224ab4 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -464,6 +464,12 @@ ResetCtx(EditorCtx* ctx) ctx.cmd.selected = 0; } +bool +Shift(Modifier md) +{ + return cast(bool)(md & (MD.LeftShift | MD.RightShift)); +} + void HandleInputs(EditorCtx* ctx, Inputs* inputs) { @@ -471,8 +477,10 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) { bool taken = false; - Input key = node.value.key; - bool pressed = node.value.pressed; + Input key = node.value.key; + Modifier md = node.value.md; + bool pressed = node.value.pressed; + FlatBuffer* fb = !Nil(GetFocusedPanel()) ? &(GetFocusedPanel()).ed.buf : null; if (pressed) { @@ -493,14 +501,27 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) { switch(key) with(Input) { - case i: + case a, i: { + if(key == a && Shift(md) && fb) + { + MoveToEOL(fb); + } + else if(key == a) + { + Move(fb, Right, MD.None); + } + else if(key == i && Shift(md)) + { + MoveToSOL(fb); + } + ctx.state = ES.InputMode; taken = true; } break; case Semicolon: { - if(node.value.md & (MD.LeftShift | MD.RightShift)) + if(Shift(node.value.md)) { ctx.state = ES.CmdOpen; taken = true; @@ -533,18 +554,7 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) { g_frame_continue = true; } break; - case Up: - case Down: - case Left: - case Right: - { - UIPanel* p = GetFocusedPanel(); - if(!Nil(p)) - { - Move(&p.ed.buf, key, node.value.md); - } - } break; - default: break; + default: taken = Move(fb, key, md); break; } } } @@ -558,6 +568,23 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) InsertInputToBuf(ctx); } +void +MoveCursor(InputEvent ev) +{ + UIPanel* p = GetFocusedPanel(); + + if(!Nil(p)) + { + FlatBuffer* fb = &p.ed.buf; + switch(ev.key) with(Input) + { + case Up, Down, Left, Right: Move(fb, ev.key, ev.md); break; + default: break; + } + } + +} + pragma(inline) void InsertChar(EditorCtx* ctx, Input input, bool modified) { @@ -601,18 +628,7 @@ HandleInputMode(EditorCtx* ctx, InputEvent ev) { ctx.state = ES.NormalMode; } break; - case Input.Up: - case Input.Down: - case Input.Left: - case Input.Right: - { - UIPanel* p = GetFocusedPanel(); - if(!Nil(p)) - { - Move(&p.ed.buf, ev.key, ev.md); - } - } break; - default: break; + default: MoveCursor(ev); break; } return taken; diff --git a/src/editor/parsing.d b/src/editor/parsing.d index a49a125..04ebadc 100644 --- a/src/editor/parsing.d +++ b/src/editor/parsing.d @@ -601,8 +601,10 @@ TokenizeD(FlatBuffer* fb) Token* t = MakeToken(tk, TT.Slash, tk.pos, tk.pos+1); u8 next = Peek(fb); + Logf("%s %s", cast(char)ch, cast(char)next); if(next == '/') { + Logf("11"); tk.pos += 1; t.type = TT.Comment; @@ -618,6 +620,7 @@ TokenizeD(FlatBuffer* fb) } else if(next == '*') { + Logf("22"); tk.pos += 1; t.type = TT.Comment; @@ -634,6 +637,7 @@ TokenizeD(FlatBuffer* fb) } else { + Logf("33"); tk.pos += 1; FixOpAssign(fb, t); } @@ -1019,12 +1023,14 @@ 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(fb.data[fb.tk.pos] == '=') { fb.tk.pos += 1; t.end += 1; + Logf("match"); } } }