implemented navigation keys
This commit is contained in:
parent
fac809a663
commit
3a433446cb
@ -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))
|
||||
{
|
||||
case Input.Up:
|
||||
switch(key) with(Input)
|
||||
{
|
||||
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
|
||||
|
||||
@ -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)
|
||||
{
|
||||
@ -472,7 +478,9 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs)
|
||||
bool taken = false;
|
||||
|
||||
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;
|
||||
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user