generatePath method

Path generatePath({
  1. required Rect rect,
})

Implementation

Path generatePath({required Rect rect}) {
  final Path path = new Path();

  double topLeftDiameter = max(borderRadius, 0);
  double topRightDiameter = max(borderRadius, 0);
  double bottomLeftDiameter = max(borderRadius, 0);
  double bottomRightDiameter = max(borderRadius, 0);

  final double spacingLeft =
      this.position == BubblePosition.Left ? arrowHeight : 0;
  final double spacingTop =
      this.position == BubblePosition.Top ? arrowHeight : 0;
  final double spacingRight =
      this.position == BubblePosition.Right ? arrowHeight : 0;
  final double spacingBottom =
      this.position == BubblePosition.Bottom ? arrowHeight : 0;

  final double left = spacingLeft + rect.left;
  final double top = spacingTop + rect.top;
  final double right = rect.right - spacingRight;
  final double bottom = rect.bottom - spacingBottom;

  final double centerX = (rect.left + rect.right) * arrowPositionPercent;

  path.moveTo(left + topLeftDiameter / 2.0, top);
  //LEFT, TOP

  if (position == BubblePosition.Top) {
    path.lineTo(centerX - arrowWidth, top);
    path.lineTo(centerX, rect.top);
    path.lineTo(centerX + arrowWidth, top);
  }
  path.lineTo(right - topRightDiameter / 2.0, top);

  path.quadraticBezierTo(right, top, right, top + topRightDiameter / 2);
  //RIGHT, TOP

  if (position == BubblePosition.Right) {
    path.lineTo(
        right, bottom - (bottom * (1 - arrowPositionPercent)) - arrowWidth);
    path.lineTo(rect.right, bottom - (bottom * (1 - arrowPositionPercent)));
    path.lineTo(
        right, bottom - (bottom * (1 - arrowPositionPercent)) + arrowWidth);
  }
  path.lineTo(right, bottom - bottomRightDiameter / 2);

  path.quadraticBezierTo(
      right, bottom, right - bottomRightDiameter / 2, bottom);
  //RIGHT, BOTTOM

  if (position == BubblePosition.Bottom) {
    path.lineTo(centerX + arrowWidth, bottom);
    path.lineTo(centerX, rect.bottom);
    path.lineTo(centerX - arrowWidth, bottom);
  }
  path.lineTo(left + bottomLeftDiameter / 2, bottom);

  path.quadraticBezierTo(left, bottom, left, bottom - bottomLeftDiameter / 2);
  //LEFT, BOTTOM

  if (position == BubblePosition.Left) {
    path.lineTo(
        left, bottom - (bottom * (1 - arrowPositionPercent)) + arrowWidth);
    path.lineTo(rect.left, bottom - (bottom * (1 - arrowPositionPercent)));
    path.lineTo(
        left, bottom - (bottom * (1 - arrowPositionPercent)) - arrowWidth);
  }
  path.lineTo(left, top + topLeftDiameter / 2);

  path.quadraticBezierTo(left, top, left + topLeftDiameter / 2, top);

  path.close();

  return path;
}