Refactor and Escape+Delete+Backspace

This commit is contained in:
Krzosa Karol
2024-07-21 12:39:31 +02:00
parent 846d4e7ab5
commit 8c1118b429
3 changed files with 34 additions and 16 deletions

View File

@@ -28,7 +28,6 @@
- Ctrl + X, Ctrl + C, Ctrl + V - Copy paste
- Ctrl + Alt + Down - duplicate line down
- Shify + Alt + Down - make a cursor below
- Backspace, Delete, Enter
- Mouse anchor point and double click
- Mouse cursor changes
- Color new lines and end of buffer

View File

@@ -154,6 +154,15 @@ void AfterEdit(View *view, Array<Edit> edits) {
For(view->carets) it.range = Clamp(*view->buffer, it.range);
}
void MultiCursorReplace(View *view, String16 string) {
Scratch scratch;
MergeCarets(&view->carets);
Array<Edit> edits = {scratch};
For(view->carets) AddEdit(&edits, it.range, string);
ApplyEdits(view->buffer, edits);
AfterEdit(view, edits);
}
void HandleKeybindings(View *_view) {
ProfileFunction();
View &view = *_view;
@@ -174,6 +183,10 @@ void HandleKeybindings(View *_view) {
}
}
if (IsKeyDown(KEY_ESCAPE)) {
view.carets.len = 1;
}
{
int keys[4] = {KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP};
for (int i = 0; i < 4; i += 1) {
@@ -234,26 +247,32 @@ void HandleKeybindings(View *_view) {
}
if (IsKeyPressed(KEY_ENTER) || IsKeyPressedRepeat(KEY_ENTER)) {
MergeCarets(&view.carets);
Scratch scratch;
Array<Edit> edits = {scratch};
For(view.carets) AddEdit(&edits, it.range, L"\n");
ApplyEdits(view.buffer, edits);
AfterEdit(&view, edits);
MultiCursorReplace(&view, L"\n");
}
{
int keys[] = {KEY_DELETE, KEY_BACKSPACE};
for (int i = 0; i < 2; i += 1) {
if (IsKeyPressed(keys[i]) || IsKeyPressedRepeat(keys[i])) {
// Select things to delete
For(view.carets) {
if (GetSize(it.range)) continue;
Int pos = MoveCaret(buf, it.range.min, i, IsKeyDown(KEY_LEFT_CONTROL));
it = MakeCaret(pos, it.range.min);
}
MultiCursorReplace(&view, {});
}
}
}
for (int c = GetCharPressed(); c; c = GetCharPressed()) {
// we interpret 2 byte sequences as 1 byte when rendering but we still
// want to read them properly.
String16 string = L"?";
UTF16Result result = UTF32ToUTF16((uint32_t)c);
if (!result.error) string = {(wchar_t *)result.out_str, result.len};
// we interpret 2 byte sequences as 1 byte when rendering but we still
// want to read them properly.
MergeCarets(&view.carets);
Scratch scratch;
Array<Edit> edits = {scratch};
For(view.carets) AddEdit(&edits, it.range, string);
ApplyEdits(view.buffer, edits);
AfterEdit(&view, edits);
MultiCursorReplace(&view, string);
}
{

View File

@@ -87,8 +87,8 @@ void DrawCaret(const View &view, Caret &it) {
// Line highlight
bool main_caret = &it == &view.carets.data[0];
unsigned char red = main_caret ? 0 : 120;
DrawLineHighlight(view, fxy, {0, red, red, 30});
DrawLineHighlight(view, fxy, {0, red, red, 10});
DrawLineHighlight(view, fxy, {0, red, red, 5});
// Draw selection
if (front != back) {