Fix cursor offsetting after change

This commit is contained in:
Krzosa Karol
2024-07-01 07:16:11 +02:00
parent ceecb6cc81
commit 4425db7ca3
2 changed files with 20 additions and 17 deletions

View File

@@ -352,29 +352,33 @@ void AfterEdit(Window *window, Array<Edit> edits) {
Assert(entry->cursors.len); Assert(entry->cursors.len);
Assert(entry->edits.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 // Offset all cursors by edits
//
Scratch scratch;
Array<Cursor> new_cursors = window->cursors.tight_copy(scratch);
ForItem(edit, edits) { ForItem(edit, edits) {
int64_t remove_size = GetRangeSize(edit.range); int64_t remove_size = GetRangeSize(edit.range);
int64_t insert_size = edit.string.len; int64_t insert_size = edit.string.len;
int64_t offset = insert_size - remove_size; int64_t offset = insert_size - remove_size;
ForItem(cursor, window->cursors) { for (int64_t i = 0; i < window->cursors.len; i += 1) {
if (edit.range.min == cursor.range.min) { Cursor &old_cursor = window->cursors.data[i];
if (GetRangeSize(edit.range)) { Cursor &new_cursor = new_cursors.data[i];
cursor.range.min += edit.string.len; if (old_cursor.range.min == edit.range.min) {
} else { new_cursor.range.min = new_cursor.range.max = new_cursor.range.min + insert_size;
cursor.range.min += offset; } else if (old_cursor.range.min > edit.range.min) {
} new_cursor.range.min = new_cursor.range.max = new_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) window->cursors[i] = new_cursors[i];
// Make sure all cursors are in range // Make sure all cursors are in range
For(window->cursors) it.range = Clamp(window->buffer, it.range); For(window->cursors) it.range = Clamp(window->buffer, it.range);

View File

@@ -405,11 +405,10 @@ int main() {
BeforeEdit(focused_window); BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena}; Array<Edit> edits = {FrameArena};
For(focused_window->cursors) { For(focused_window->cursors) AddEdit(&edits, it.range, string);
AddEdit(&edits, it.range, string);
}
ApplyEdits(focused_window, edits); ApplyEdits(focused_window, edits);
AfterEdit(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); EventRecording_SimulateGetCharPressed(focused_window);
} }