Fix non-edit doing caret adjustment

This commit is contained in:
Krzosa Karol
2024-08-10 07:25:44 +02:00
parent 4e1ae87a8e
commit 3aa4806515

View File

@@ -119,7 +119,7 @@ void AssertRanges(Array<Caret> carets) {
}
}
void AdjustCarets(Array<Edit> edits, Array<Caret> *carets, bool kill_selection = false) {
void AdjustCarets(Array<Edit> edits, Array<Caret> *carets) {
Scratch scratch;
Array<Caret> new_carets = TightCopy(scratch, *carets);
ForItem(edit, edits) {
@@ -131,28 +131,14 @@ void AdjustCarets(Array<Edit> edits, Array<Caret> *carets, bool kill_selection =
Caret &old_cursor = carets->data[i];
Caret &new_cursor = new_carets.data[i];
if (old_cursor.range.min == edit.range.min) {
new_cursor.range.min += insert_size;
} else if (old_cursor.range.min > edit.range.min) {
if (old_cursor.range.min > edit.range.min) {
new_cursor.range.min += offset;
}
if (old_cursor.range.max == edit.range.max) {
new_cursor.range.max += insert_size;
} else if (old_cursor.range.max > edit.range.max) {
new_cursor.range.max += offset;
}
}
}
for (Int i = 0; i < carets->len; i += 1) {
carets->data[i] = new_carets[i];
if (kill_selection) {
carets->data[i].range.max = carets->data[i].range.min;
}
}
IF_DEBUG(AssertRanges(*carets));
for (Int i = 0; i < carets->len; i += 1) carets->data[i] = new_carets[i];
}
bool KILL_SELECTION = true;
@@ -174,5 +160,40 @@ void EndEdit(Buffer *buffer, Array<Edit> *edits, Array<Caret> *carets, bool kill
}
#endif
AdjustCarets(*edits, carets, kill_selection);
// Adjust carets
// this one also moves the carets forward if they are aligned with edit
//
Scratch scratch;
Array<Caret> new_carets = TightCopy(scratch, *carets);
ForItem(edit, *edits) {
Int remove_size = GetSize(edit.range);
Int insert_size = edit.string.len;
Int offset = insert_size - remove_size;
for (Int i = 0; i < carets->len; i += 1) {
Caret &old_cursor = carets->data[i];
Caret &new_cursor = new_carets.data[i];
if (old_cursor.range.min == edit.range.min) {
new_cursor.range.min += insert_size;
} else if (old_cursor.range.min > edit.range.min) {
new_cursor.range.min += offset;
}
if (old_cursor.range.max == edit.range.max) {
new_cursor.range.max += insert_size;
} else if (old_cursor.range.max > edit.range.max) {
new_cursor.range.max += offset;
}
Assert(new_cursor.range.max >= new_cursor.range.min);
}
}
for (Int i = 0; i < carets->len; i += 1) {
carets->data[i] = new_carets[i];
if (kill_selection) {
carets->data[i].range.max = carets->data[i].range.min;
}
}
}