backspace method
void
backspace()
Remove the selection or last char if the selection is empty (backspace key)
Implementation
void backspace() {
if (readOnly) return;
if (_undoController?.isUndoRedoInProgress ?? false) return;
final selectionBefore = _selection;
final sel = _selection;
String deletedText;
if (sel.start < sel.end) {
_flushBuffer();
deletedText = _rope.substring(sel.start, sel.end);
_rope.delete(sel.start, sel.end);
_currentVersion++;
_selection = TextSelection.collapsed(offset: sel.start);
dirtyLine = _rope.getLineAtOffset(sel.start);
_recordDeletion(sel.start, deletedText, selectionBefore, _selection);
_syncToConnection();
notifyListeners();
return;
}
if (sel.start <= 0) return;
final deleteOffset = sel.start - 1;
String charToDelete;
if (_bufferLineIndex != null && _bufferDirty) {
final bufferEnd = _bufferLineRopeStart + _bufferLineText!.length;
if (deleteOffset >= _bufferLineRopeStart && deleteOffset < bufferEnd) {
charToDelete = _bufferLineText![deleteOffset - _bufferLineRopeStart];
} else {
charToDelete = _rope.charAt(deleteOffset);
}
} else {
charToDelete = _rope.charAt(deleteOffset);
}
if (charToDelete == '\n') {
_flushBuffer();
_rope.delete(deleteOffset, sel.start);
_currentVersion++;
_selection = TextSelection.collapsed(offset: deleteOffset);
dirtyLine = _rope.getLineAtOffset(deleteOffset);
lineStructureChanged = true;
_recordDeletion(deleteOffset, '\n', selectionBefore, _selection);
_syncToConnection();
notifyListeners();
return;
}
if (_bufferLineIndex != null && _bufferDirty) {
final bufferEnd = _bufferLineRopeStart + _bufferLineText!.length;
if (deleteOffset >= _bufferLineRopeStart && deleteOffset < bufferEnd) {
final localOffset = deleteOffset - _bufferLineRopeStart;
deletedText = _bufferLineText![localOffset];
_bufferLineText =
_bufferLineText!.substring(0, localOffset) +
_bufferLineText!.substring(localOffset + 1);
_selection = TextSelection.collapsed(offset: deleteOffset);
_currentVersion++;
bufferNeedsRepaint = true;
_recordDeletion(deleteOffset, deletedText, selectionBefore, _selection);
_scheduleSyncToConnection();
_scheduleFlush();
notifyListeners();
return;
}
_flushBuffer();
}
final lineIndex = _rope.getLineAtOffset(deleteOffset);
_initBuffer(lineIndex);
final localOffset = deleteOffset - _bufferLineRopeStart;
if (localOffset >= 0 && localOffset < _bufferLineText!.length) {
deletedText = _bufferLineText![localOffset];
_bufferLineText =
_bufferLineText!.substring(0, localOffset) +
_bufferLineText!.substring(localOffset + 1);
_bufferDirty = true;
_selection = TextSelection.collapsed(offset: deleteOffset);
_currentVersion++;
dirtyLine = lineIndex;
bufferNeedsRepaint = true;
_recordDeletion(deleteOffset, deletedText, selectionBefore, _selection);
_scheduleSyncToConnection();
_scheduleFlush();
notifyListeners();
}
}