diff --git a/src/text_editor/layout.cpp b/src/text_editor/layout.cpp index 3137857..1648e9d 100644 --- a/src/text_editor/layout.cpp +++ b/src/text_editor/layout.cpp @@ -332,13 +332,33 @@ void ApplyEdits(Window *window, Array edits) { HistoryEntry *entry = window->history.entries.last(); Allocator sys_allocator = GetSystemAllocator(); entry->edits = edits.tight_copy(sys_allocator); + + // Make reverse edits For(entry->edits) { - // Need to compile reverse edits Range new_range = {it.range.min, it.range.min + it.string.len}; String string = GetString(window->buffer, it.range); it.string = Copy(sys_allocator, string); it.range = new_range; } + + Array temp_edits = entry->edits.tight_copy(sys_allocator); + defer { temp_edits.dealloc(); }; + + // Fix reverse edits + ForItem(edit, edits) { + int64_t remove_size = GetRangeSize(edit.range); + int64_t insert_size = edit.string.len; + int64_t offset = insert_size - remove_size; + + for (int64_t i = 0; i < entry->edits.len; i += 1) { + Edit &new_edit = entry->edits.data[i]; + Edit &old_edit = temp_edits.data[i]; + if (old_edit.range.min > edit.range.min) { + new_edit.range.min += offset; + new_edit.range.max += offset; + } + } + } } _ApplyEdits(&window->buffer, edits); @@ -356,8 +376,6 @@ void AfterEdit(Window *window, Array edits) { Assert(edits[i].range.min <= edits[i + 1].range.min); } - // @todo: add undo fixing - // // Offset all cursors by edits //