From 4425db7ca312854dc198e5b83005e088215b658c Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Mon, 1 Jul 2024 07:16:11 +0200 Subject: [PATCH] Fix cursor offsetting after change --- src/text_editor/layout.cpp | 32 ++++++++++++++++++-------------- src/text_editor/main.cpp | 5 ++--- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/text_editor/layout.cpp b/src/text_editor/layout.cpp index f113327..3137857 100644 --- a/src/text_editor/layout.cpp +++ b/src/text_editor/layout.cpp @@ -352,29 +352,33 @@ void AfterEdit(Window *window, Array edits) { Assert(entry->cursors.len); Assert(entry->edits.len); + for (int64_t i = 0; i < edits.len - 1; i += 1) { + Assert(edits[i].range.min <= edits[i + 1].range.min); + } + + // @todo: add undo fixing + + // // Offset all cursors by edits + // + Scratch scratch; + Array new_cursors = window->cursors.tight_copy(scratch); ForItem(edit, edits) { int64_t remove_size = GetRangeSize(edit.range); int64_t insert_size = edit.string.len; int64_t offset = insert_size - remove_size; - ForItem(cursor, window->cursors) { - if (edit.range.min == cursor.range.min) { - if (GetRangeSize(edit.range)) { - cursor.range.min += edit.string.len; - } else { - cursor.range.min += offset; - } - cursor.range.max = cursor.range.min; - } else if (edit.range.min <= cursor.range.min) { - if (GetRangeSize(edit.range)) { - cursor.range.min += edit.string.len; - } - cursor.range.min += offset; - cursor.range.max = cursor.range.min; + for (int64_t i = 0; i < window->cursors.len; i += 1) { + Cursor &old_cursor = window->cursors.data[i]; + Cursor &new_cursor = new_cursors.data[i]; + if (old_cursor.range.min == edit.range.min) { + new_cursor.range.min = new_cursor.range.max = new_cursor.range.min + insert_size; + } else if (old_cursor.range.min > edit.range.min) { + new_cursor.range.min = new_cursor.range.max = new_cursor.range.min + offset; } } } + for (int64_t i = 0; i < window->cursors.len; i += 1) window->cursors[i] = new_cursors[i]; // Make sure all cursors are in range For(window->cursors) it.range = Clamp(window->buffer, it.range); diff --git a/src/text_editor/main.cpp b/src/text_editor/main.cpp index 1b42a06..f779026 100644 --- a/src/text_editor/main.cpp +++ b/src/text_editor/main.cpp @@ -405,11 +405,10 @@ int main() { BeforeEdit(focused_window); Array edits = {FrameArena}; - For(focused_window->cursors) { - AddEdit(&edits, it.range, string); - } + For(focused_window->cursors) AddEdit(&edits, it.range, string); ApplyEdits(focused_window, edits); AfterEdit(focused_window, edits); + // For(focused_window->cursors) it.range.min = it.range.max = MoveRight(focused_window->buffer, it.range.min); } EventRecording_SimulateGetCharPressed(focused_window); }