import 'package:flutter/material.dart';

const double _kMenuScreenPadding = 8.0;

class TrianglePainter extends CustomPainter {
  Paint _paint;
  final Color color;
  final RelativeRect position;
  final Size size;
  final double radius;
  final bool isInverted;
  final double screenWidth;

  TrianglePainter(
      {@required this.color,
        @required this.position,
        @required this.size,
        this.radius = 20,
        this.isInverted = false,
        this.screenWidth}) {
    _paint = Paint()
      ..style = PaintingStyle.fill
      ..color = color
      ..strokeWidth = 10
      ..isAntiAlias = true;
  }

  @override
  void paint(Canvas canvas, Size size) {
    var path = Path();

    // 如果 menu 的长度 大于 child 的长度
    if (size.width > this.size.width) {
      // 靠右
      if (position.left + this.size.width / 2 > position.right) {
        if (screenWidth - (position.left + this.size.width) > size.width / 2 + _kMenuScreenPadding) {
          path.moveTo(size.width / 2, isInverted ? 0 : size.height);
          path.lineTo(size.width / 2 - radius / 2, isInverted ? size.height : 0);
          path.lineTo(size.width / 2 + radius / 2, isInverted ? size.height : 0);
        }else {
          path.moveTo(size.width - this.size.width + this.size.width / 2,
              isInverted ? 0 : size.height);
          path.lineTo(
              size.width - this.size.width + this.size.width / 2 - radius / 2,
              isInverted ? size.height : 0);
          path.lineTo(
              size.width - this.size.width + this.size.width / 2 + radius / 2,
              isInverted ? size.height : 0);
        }
      }else{
        // 靠左
        if(position.left > size.width / 2 + _kMenuScreenPadding){
          path.moveTo(size.width / 2, isInverted ? 0 : size.height);
          path.lineTo(size.width / 2 - radius / 2, isInverted ? size.height : 0);
          path.lineTo(size.width / 2 + radius / 2, isInverted ? size.height : 0);
        }else {
          path.moveTo(this.size.width / 2, isInverted ? 0 : size.height);
          path.lineTo(
              this.size.width / 2 - radius / 2, isInverted ? size.height : 0);
          path.lineTo(
              this.size.width / 2 + radius / 2, isInverted ? size.height : 0);
        }
      }
    } else {
      path.moveTo(size.width / 2, isInverted ? 0 : size.height);
      path.lineTo(
          size.width / 2 - radius / 2, isInverted ? size.height : 0);
      path.lineTo(
          size.width / 2 + radius / 2, isInverted ? size.height : 0);
    }

    path.close();

    canvas.drawPath(
      path,
      _paint,
    );
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}
