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
|
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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user