Undo working
This commit is contained in:
@@ -332,13 +332,33 @@ void ApplyEdits(Window *window, Array<Edit> 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<Edit> 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<Edit> edits) {
|
||||
Assert(edits[i].range.min <= edits[i + 1].range.min);
|
||||
}
|
||||
|
||||
// @todo: add undo fixing
|
||||
|
||||
//
|
||||
// Offset all cursors by edits
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user