Undo working

This commit is contained in:
Krzosa Karol
2024-07-01 07:23:46 +02:00
parent 4425db7ca3
commit d1f83fa669

View File

@@ -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
//