Undo working
This commit is contained in:
@@ -332,13 +332,33 @@ void ApplyEdits(Window *window, Array<Edit> edits) {
|
|||||||
HistoryEntry *entry = window->history.entries.last();
|
HistoryEntry *entry = window->history.entries.last();
|
||||||
Allocator sys_allocator = GetSystemAllocator();
|
Allocator sys_allocator = GetSystemAllocator();
|
||||||
entry->edits = edits.tight_copy(sys_allocator);
|
entry->edits = edits.tight_copy(sys_allocator);
|
||||||
|
|
||||||
|
// Make reverse edits
|
||||||
For(entry->edits) {
|
For(entry->edits) {
|
||||||
// Need to compile reverse edits
|
|
||||||
Range new_range = {it.range.min, it.range.min + it.string.len};
|
Range new_range = {it.range.min, it.range.min + it.string.len};
|
||||||
String string = GetString(window->buffer, it.range);
|
String string = GetString(window->buffer, it.range);
|
||||||
it.string = Copy(sys_allocator, string);
|
it.string = Copy(sys_allocator, string);
|
||||||
it.range = new_range;
|
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);
|
_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);
|
Assert(edits[i].range.min <= edits[i + 1].range.min);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo: add undo fixing
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Offset all cursors by edits
|
// Offset all cursors by edits
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user