Fix non-edit doing caret adjustment
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user