paint method

  1. @override
void paint(
  1. Context context
)
override

Draw itself and its children, according to the calculated box.offset

Implementation

@override
void paint(Context context) {
  super.paint(context);

  final adjustedValue = value.clamp(0.00001, .99999);
  final rx = box!.width / 2;
  final ry = box!.height / 2;
  const angleStart = math.pi / 2;
  final angleEnd = angleStart - math.pi * 2 * adjustedValue;
  final startTop = PdfPoint(
    box!.x + rx + math.cos(angleStart) * rx,
    box!.y + ry + math.sin(angleStart) * ry,
  );
  final endTop = PdfPoint(
    box!.x + rx + math.cos(angleEnd) * rx,
    box!.y + ry + math.sin(angleEnd) * ry,
  );
  final startBottom = PdfPoint(
    box!.x + rx + math.cos(angleStart) * (rx - strokeWidth),
    box!.y + ry + math.sin(angleStart) * (ry - strokeWidth),
  );
  final endBottom = PdfPoint(
    box!.x + rx + math.cos(angleEnd) * (rx - strokeWidth),
    box!.y + ry + math.sin(angleEnd) * (ry - strokeWidth),
  );

  if (backgroundColor != null && value < 1) {
    context.canvas
      ..moveTo(startTop.x, startTop.y)
      ..bezierArc(startTop.x, startTop.y, rx, ry, endTop.x, endTop.y,
          large: adjustedValue < .5, sweep: true)
      ..lineTo(endBottom.x, endBottom.y)
      ..bezierArc(endBottom.x, endBottom.y, rx - strokeWidth,
          ry - strokeWidth, startBottom.x, startBottom.y,
          large: adjustedValue < .5)
      ..lineTo(startTop.x, startTop.y)
      ..setFillColor(backgroundColor)
      ..fillPath();
  }

  if (value > 0) {
    context.canvas
      ..moveTo(startTop.x, startTop.y)
      ..bezierArc(startTop.x, startTop.y, rx, ry, endTop.x, endTop.y,
          large: adjustedValue > .5)
      ..lineTo(endBottom.x, endBottom.y)
      ..bezierArc(endBottom.x, endBottom.y, rx - strokeWidth,
          ry - strokeWidth, startBottom.x, startBottom.y,
          large: adjustedValue > .5, sweep: true)
      ..lineTo(startTop.x, startTop.y)
      ..setFillColor(color ?? PdfColors.indigo)
      ..fillPath();
  }
}