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
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

View File

@ -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;

View File

@ -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");
}
}
}