Fix cursor offsetting after change
This commit is contained in:
@@ -352,29 +352,33 @@ void AfterEdit(Window *window, Array<Edit> edits) {
|
||||
Assert(entry->cursors.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
|
||||
//
|
||||
Scratch scratch;
|
||||
Array<Cursor> new_cursors = window->cursors.tight_copy(scratch);
|
||||
ForItem(edit, edits) {
|
||||
int64_t remove_size = GetRangeSize(edit.range);
|
||||
int64_t insert_size = edit.string.len;
|
||||
int64_t offset = insert_size - remove_size;
|
||||
|
||||
ForItem(cursor, window->cursors) {
|
||||
if (edit.range.min == cursor.range.min) {
|
||||
if (GetRangeSize(edit.range)) {
|
||||
cursor.range.min += edit.string.len;
|
||||
} else {
|
||||
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) {
|
||||
Cursor &old_cursor = window->cursors.data[i];
|
||||
Cursor &new_cursor = new_cursors.data[i];
|
||||
if (old_cursor.range.min == edit.range.min) {
|
||||
new_cursor.range.min = new_cursor.range.max = new_cursor.range.min + insert_size;
|
||||
} else if (old_cursor.range.min > edit.range.min) {
|
||||
new_cursor.range.min = new_cursor.range.max = new_cursor.range.min + offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; i < window->cursors.len; i += 1) window->cursors[i] = new_cursors[i];
|
||||
|
||||
// Make sure all cursors are in range
|
||||
For(window->cursors) it.range = Clamp(window->buffer, it.range);
|
||||
|
||||
@@ -405,11 +405,10 @@ int main() {
|
||||
|
||||
BeforeEdit(focused_window);
|
||||
Array<Edit> edits = {FrameArena};
|
||||
For(focused_window->cursors) {
|
||||
AddEdit(&edits, it.range, string);
|
||||
}
|
||||
For(focused_window->cursors) AddEdit(&edits, it.range, string);
|
||||
ApplyEdits(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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user