moveCursorToOffset function

TextCursorCommandResult moveCursorToOffset({
  1. required int textLength,
  2. required int cursorOffset,
  3. int? selectionBaseOffset,
  4. int? selectionExtentOffset,
  5. required int targetOffset,
  6. bool extendSelection = false,
  7. bool clearSelection = true,
  8. bool preserveCollapsedSelection = false,
})

Implementation

TextCursorCommandResult moveCursorToOffset({
  required int textLength,
  required int cursorOffset,
  int? selectionBaseOffset,
  int? selectionExtentOffset,
  required int targetOffset,
  bool extendSelection = false,
  bool clearSelection = true,
  bool preserveCollapsedSelection = false,
}) {
  final clampedCursor = cursorOffset.clamp(0, textLength);
  final clampedBase = selectionBaseOffset?.clamp(0, textLength);
  final clampedExtent = selectionExtentOffset?.clamp(0, textLength);
  final clampedTarget = targetOffset.clamp(0, textLength);

  if (!extendSelection) {
    final nextBase = clearSelection ? null : clampedBase;
    final nextExtent = clearSelection ? null : clampedExtent;
    if (clampedTarget == clampedCursor &&
        nextBase == clampedBase &&
        nextExtent == clampedExtent) {
      return _unchangedCursorResult(
        cursorOffset: clampedCursor,
        selectionBaseOffset: clampedBase,
        selectionExtentOffset: clampedExtent,
      );
    }
    return TextCursorCommandResult(
      cursorOffset: clampedTarget,
      selectionBaseOffset: nextBase,
      selectionExtentOffset: nextExtent,
    );
  }

  final anchor = clampedBase ?? clampedCursor;
  if (anchor == clampedTarget && !preserveCollapsedSelection) {
    final selectionChanged = clampedBase != null || clampedExtent != null;
    if (clampedTarget == clampedCursor && !selectionChanged) {
      return _unchangedCursorResult(cursorOffset: clampedCursor);
    }
    return TextCursorCommandResult(cursorOffset: clampedTarget);
  }

  if (clampedTarget == clampedCursor &&
      clampedBase == anchor &&
      clampedExtent == clampedTarget) {
    return _unchangedCursorResult(
      cursorOffset: clampedCursor,
      selectionBaseOffset: clampedBase,
      selectionExtentOffset: clampedExtent,
    );
  }

  return TextCursorCommandResult(
    cursorOffset: clampedTarget,
    selectionBaseOffset: anchor,
    selectionExtentOffset: clampedTarget,
  );
}