don't put cursor position in NewlinePart after adding it

You can't append to it anyway, so mark it uneditable and skip
uneditable parts if that's where an edit ended up.

This has the added advantage that if there is text after a newly
insert pill, the cursor will be put just before it rather than
in the pill, after the last character.
pull/21833/head
Bruno Windels 2019-05-16 17:58:22 +01:00
parent 0e3d4fbc0c
commit f27607a74c
2 changed files with 19 additions and 1 deletions

View File

@ -88,7 +88,8 @@ export default class EditorModel {
} }
this._mergeAdjacentParts(); this._mergeAdjacentParts();
const caretOffset = diff.at - removedOffsetDecrease + addedLen; const caretOffset = diff.at - removedOffsetDecrease + addedLen;
const newPosition = this._positionForOffset(caretOffset, true); let newPosition = this._positionForOffset(caretOffset, true);
newPosition = newPosition.skipUneditableParts(this._parts);
this._setActivePart(newPosition); this._setActivePart(newPosition);
this._updateCallback(newPosition); this._updateCallback(newPosition);
} }
@ -261,4 +262,13 @@ class DocumentPosition {
get offset() { get offset() {
return this._offset; return this._offset;
} }
skipUneditableParts(parts) {
const part = parts[this.index];
if (part && !part.canEdit) {
return new DocumentPosition(this.index + 1, 0);
} else {
return this;
}
}
} }

View File

@ -205,6 +205,14 @@ export class NewlinePart extends BasePart {
get type() { get type() {
return "newline"; return "newline";
} }
// this makes the cursor skip this part when it is inserted
// rather than trying to append to it, which is what we want.
// As a newline can also be only one character, it makes sense
// as it can only be one character long. This caused #9741.
get canEdit() {
return false;
}
} }
export class RoomPillPart extends PillPart { export class RoomPillPart extends PillPart {