pressUpArrowKey method

void pressUpArrowKey({
  1. bool isShiftPressed = false,
})

Moves the cursor up one line, maintaining the column position.

If isShiftPressed is true, extends the selection.

Implementation

void pressUpArrowKey({bool isShiftPressed = false}) {
  final currentLine = getLineAtOffset(selection.extentOffset);

  if (currentLine <= 0) {
    if (isShiftPressed) {
      setSelectionSilently(
        TextSelection(baseOffset: selection.baseOffset, extentOffset: 0),
      );
    } else {
      setSelectionSilently(const TextSelection.collapsed(offset: 0));
    }
    return;
  }

  int targetLine = currentLine - 1;
  while (targetLine > 0 && _isLineInFoldedRegion(targetLine)) {
    targetLine--;
  }

  if (_isLineInFoldedRegion(targetLine)) {
    targetLine = _getFoldStartForLine(targetLine) ?? 0;
  }

  final lineStart = getLineStartOffset(currentLine);
  final column = selection.extentOffset - lineStart;
  final prevLineStart = getLineStartOffset(targetLine);
  final prevLineText = getLineText(targetLine);
  final prevLineLength = prevLineText.length;
  final newColumn = column.clamp(0, prevLineLength);
  final newOffset = (prevLineStart + newColumn).clamp(0, length);

  if (isShiftPressed) {
    setSelectionSilently(
      TextSelection(
        baseOffset: selection.baseOffset,
        extentOffset: newOffset,
      ),
    );
  } else {
    setSelectionSilently(TextSelection.collapsed(offset: newOffset));
  }
}