calculateSelectionMenuOffset method

void calculateSelectionMenuOffset(
  1. Rect rect
)

Implementation

void calculateSelectionMenuOffset(Rect rect) {
  // Workaround: We can customize the padding through the [EditorStyle],
  // but the coordinates of overlay are not properly converted currently.
  // Just subtract the padding here as a result.
  const menuHeight = 200.0;
  const menuOffset = Offset(0, 10);
  final editorOffset =
      editorState.renderBox?.localToGlobal(Offset.zero) ?? Offset.zero;
  final editorHeight = editorState.renderBox!.size.height;
  final editorWidth = editorState.renderBox!.size.width;

  // show below default
  _alignment = Alignment.topLeft;
  final bottomRight = rect.bottomRight;
  final topRight = rect.topRight;
  var offset = bottomRight + menuOffset;
  _offset = Offset(
    offset.dx,
    offset.dy,
  );

  // show above
  if (offset.dy + menuHeight >= editorOffset.dy + editorHeight) {
    offset = topRight - menuOffset;
    _alignment = Alignment.bottomLeft;

    _offset = Offset(
      offset.dx,
      MediaQuery.of(context).size.height - offset.dy,
    );
  }

  // show on left
  if (_offset.dx - editorOffset.dx > editorWidth / 2) {
    _alignment = _alignment == Alignment.topLeft
        ? Alignment.topRight
        : Alignment.bottomRight;

    _offset = Offset(
      editorWidth - _offset.dx + editorOffset.dx,
      _offset.dy,
    );
  }
}