implemented navigation keys

This commit is contained in:
Matthew 2025-10-02 06:53:45 +10:00
parent fac809a663
commit 3a433446cb
3 changed files with 116 additions and 47 deletions

View File

@ -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 void
MoveUp(FlatBuffer* fb) MoveUp(FlatBuffer* fb)
{ {
@ -434,77 +466,90 @@ MoveDown(FlatBuffer* fb, u64 col)
} }
} }
void bool
Move(FlatBuffer* fb, Input key, Modifier md) 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; } break;
case Input.Down: case Down:
{ {
} break; } break;
case Input.Left: case Left:
{ {
} break; } break;
case Input.Right: case Right:
{ {
} break; } break;
default: 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; } break;
case Input.Down: case Down:
{ {
} break; } break;
case Input.Left: case Left:
{ {
} break; } break;
case Input.Right: case Right:
{ {
} break; } break;
default: break; default: break;
} }
} }
else else if(!taken)
{ {
switch(key) switch(key) with(Input)
{ {
case Input.Down: case Down:
{ {
MoveDown(fb); MoveDown(fb);
taken = true;
} break; } break;
case Input.Up: case Up:
{ {
MoveUp(fb); MoveUp(fb);
taken = true;
} break; } break;
case Input.Left: case Left:
{ {
if(fb.buf_pos > 0 && fb.data[fb.buf_pos-1] != '\n') if(fb.buf_pos > 0 && fb.data[fb.buf_pos-1] != '\n')
{ {
fb.buf_pos -= 1; fb.buf_pos -= 1;
taken = true;
} }
} break; } break;
case Input.Right: case Right:
{ {
if(fb.buf_pos < fb.length && fb.data[fb.buf_pos] != '\n') if(fb.buf_pos < fb.length && fb.data[fb.buf_pos] != '\n')
{ {
fb.buf_pos += 1; fb.buf_pos += 1;
taken = true;
} }
} break; } break;
default: break; default: break;
@ -513,6 +558,8 @@ Move(FlatBuffer* fb, Input key, Modifier md)
AdjustOffset(fb); AdjustOffset(fb);
U64Vec2 p = VecPos(fb); U64Vec2 p = VecPos(fb);
return taken;
} }
void void

View File

@ -464,6 +464,12 @@ ResetCtx(EditorCtx* ctx)
ctx.cmd.selected = 0; ctx.cmd.selected = 0;
} }
bool
Shift(Modifier md)
{
return cast(bool)(md & (MD.LeftShift | MD.RightShift));
}
void void
HandleInputs(EditorCtx* ctx, Inputs* inputs) HandleInputs(EditorCtx* ctx, Inputs* inputs)
{ {
@ -471,8 +477,10 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs)
{ {
bool taken = false; bool taken = false;
Input key = node.value.key; Input key = node.value.key;
bool pressed = node.value.pressed; Modifier md = node.value.md;
bool pressed = node.value.pressed;
FlatBuffer* fb = !Nil(GetFocusedPanel()) ? &(GetFocusedPanel()).ed.buf : null;
if (pressed) if (pressed)
{ {
@ -493,14 +501,27 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs)
{ {
switch(key) with(Input) 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; ctx.state = ES.InputMode;
taken = true; taken = true;
} break; } break;
case Semicolon: case Semicolon:
{ {
if(node.value.md & (MD.LeftShift | MD.RightShift)) if(Shift(node.value.md))
{ {
ctx.state = ES.CmdOpen; ctx.state = ES.CmdOpen;
taken = true; taken = true;
@ -533,18 +554,7 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs)
{ {
g_frame_continue = true; g_frame_continue = true;
} break; } break;
case Up: default: taken = Move(fb, key, md); break;
case Down:
case Left:
case Right:
{
UIPanel* p = GetFocusedPanel();
if(!Nil(p))
{
Move(&p.ed.buf, key, node.value.md);
}
} break;
default: break;
} }
} }
} }
@ -558,6 +568,23 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs)
InsertInputToBuf(ctx); 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 pragma(inline) void
InsertChar(EditorCtx* ctx, Input input, bool modified) InsertChar(EditorCtx* ctx, Input input, bool modified)
{ {
@ -601,18 +628,7 @@ HandleInputMode(EditorCtx* ctx, InputEvent ev)
{ {
ctx.state = ES.NormalMode; ctx.state = ES.NormalMode;
} break; } break;
case Input.Up: default: MoveCursor(ev); break;
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;
} }
return taken; return taken;

View File

@ -601,8 +601,10 @@ TokenizeD(FlatBuffer* fb)
Token* t = MakeToken(tk, TT.Slash, tk.pos, tk.pos+1); Token* t = MakeToken(tk, TT.Slash, tk.pos, tk.pos+1);
u8 next = Peek(fb); u8 next = Peek(fb);
Logf("%s %s", cast(char)ch, cast(char)next);
if(next == '/') if(next == '/')
{ {
Logf("11");
tk.pos += 1; tk.pos += 1;
t.type = TT.Comment; t.type = TT.Comment;
@ -618,6 +620,7 @@ TokenizeD(FlatBuffer* fb)
} }
else if(next == '*') else if(next == '*')
{ {
Logf("22");
tk.pos += 1; tk.pos += 1;
t.type = TT.Comment; t.type = TT.Comment;
@ -634,6 +637,7 @@ TokenizeD(FlatBuffer* fb)
} }
else else
{ {
Logf("33");
tk.pos += 1; tk.pos += 1;
FixOpAssign(fb, t); FixOpAssign(fb, t);
} }
@ -1019,12 +1023,14 @@ ParseId(FlatBuffer* fb)
void void
FixOpAssign(FlatBuffer* fb, Token* t) 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.tk.pos < fb.length)
{ {
if(fb.data[fb.tk.pos] == '=') if(fb.data[fb.tk.pos] == '=')
{ {
fb.tk.pos += 1; fb.tk.pos += 1;
t.end += 1; t.end += 1;
Logf("match");
} }
} }
} }