updateFloatingCursor method

  1. @override
void updateFloatingCursor(
  1. RawFloatingCursorPoint point
)
override

Updates the floating cursor position and state.

Implementation

@override
void updateFloatingCursor(RawFloatingCursorPoint point) {
  _floatingCursorResetController ??= AnimationController(
    vsync: this,
  )..addListener(_onFloatingCursorResetTick);
  switch (point.state) {
    case FloatingCursorDragState.Start:
      if (_floatingCursorResetController!.isAnimating) {
        _floatingCursorResetController!.stop();
        _onFloatingCursorResetTick();
      }
      // Stop cursor blinking and making it visible.
      _stopCursorBlink(resetCharTicks: false);
      _cursorBlinkOpacityController.value = 1.0;
      // We want to send in points that are centered around a (0,0) origin, so
      // we cache the position.
      _pointOffsetOrigin = point.offset;

      final Offset startCaretCenter;
      final TextPosition currentTextPosition;
      final bool shouldResetOrigin;
      // Only non-null when starting a floating cursor via long press.
      if (point.startLocation != null) {
        shouldResetOrigin = false;
        (startCaretCenter, currentTextPosition) = point.startLocation!;
      } else {
        shouldResetOrigin = true;
        currentTextPosition = TextPosition(offset: renderEditable.selection!.baseOffset, affinity: renderEditable.selection!.affinity);
        startCaretCenter = renderEditable.getLocalRectForCaret(currentTextPosition).center;
      }

      _startCaretCenter = startCaretCenter;
      _lastBoundedOffset = renderEditable.calculateBoundedFloatingCursorOffset(_startCaretCenter! - _floatingCursorOffset, shouldResetOrigin: shouldResetOrigin);
      _lastTextPosition = currentTextPosition;
      renderEditable.setFloatingCursor(point.state, _lastBoundedOffset!, _lastTextPosition!);
    case FloatingCursorDragState.Update:
      final Offset centeredPoint = point.offset! - _pointOffsetOrigin!;
      final Offset rawCursorOffset = _startCaretCenter! + centeredPoint - _floatingCursorOffset;

      _lastBoundedOffset = renderEditable.calculateBoundedFloatingCursorOffset(rawCursorOffset);
      _lastTextPosition = renderEditable.getPositionForPoint(renderEditable.localToGlobal(_lastBoundedOffset! + _floatingCursorOffset));
      renderEditable.setFloatingCursor(point.state, _lastBoundedOffset!, _lastTextPosition!);
    case FloatingCursorDragState.End:
      // Resume cursor blinking.
      _startCursorBlink();
      // We skip animation if no update has happened.
      if (_lastTextPosition != null && _lastBoundedOffset != null) {
        _floatingCursorResetController!.value = 0.0;
        _floatingCursorResetController!.animateTo(1.0, duration: _floatingCursorResetTime, curve: Curves.decelerate);
      }
  }
}