render method

  1. @override
void render(
  1. Canvas canvas,
  2. Graph graph,
  3. Paint paint
)
override

Implementation

@override
void render(Canvas canvas, Graph graph, Paint paint) {
  var trianglePaint = Paint()
    ..color = paint.color
    ..style = PaintingStyle.fill;

  graph.edges.forEach((edge) {
    final source = edge.source;

    var x = source.x;
    var y = source.y;

    var destination = edge.destination;

    var x1 = destination.x;
    var y1 = destination.y;
    path.reset();

    var clippedLine = <double>[];

    Paint? edgeTrianglePaint;
    if (edge.paint != null) {
      edgeTrianglePaint = Paint()
        ..color = edge.paint?.color ?? paint.color
        ..style = PaintingStyle.fill;
    }

    var currentPaint = edge.paint ?? paint
      ..style = PaintingStyle.stroke;

    if (edgeData.containsKey(edge) && edgeData[edge]!.bendPoints.isNotEmpty) {
      // draw bend points
      var bendPoints = edgeData[edge]!.bendPoints;
      final size = bendPoints.length;

      if (nodeData[source]!.isReversed) {
        clippedLine = clipLine(bendPoints[2], bendPoints[3], bendPoints[0], bendPoints[1], destination);
      } else {
        clippedLine = clipLine(
            bendPoints[size - 4], bendPoints[size - 3], bendPoints[size - 2], bendPoints[size - 1], destination);
      }

      final triangleCentroid = drawTriangle(
          canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], clippedLine[1], clippedLine[2], clippedLine[3]);

      path.reset();
      path.moveTo(bendPoints[0], bendPoints[1]);

      final bendPointsWithoutDuplication = <Offset>[];

      for (var i = 0; i < bendPoints.length; i += 2) {
        final isLastPoint = i == bendPoints.length - 2;

        final x = bendPoints[i];
        final y = bendPoints[i + 1];
        final x2 = isLastPoint ? -1 : bendPoints[i + 2];
        final y2 = isLastPoint ? -1 : bendPoints[i + 3];
        if (x == x2 && y == y2) {
          // Skip when two consecutive points are identical
          // because drawing a line between would be redundant in this case.
          continue;
        }
        bendPointsWithoutDuplication.add(Offset(x, y));
      }

      if (bendPointShape is MaxCurvedBendPointShape) {
        _drawMaxCurvedBendPointsEdge(bendPointsWithoutDuplication);
      } else if (bendPointShape is CurvedBendPointShape) {
        final shape = bendPointShape as CurvedBendPointShape;
        _drawCurvedBendPointsEdge(bendPointsWithoutDuplication, shape.curveLength);
      } else {
        _drawSharpBendPointsEdge(bendPointsWithoutDuplication);
      }

      path.lineTo(triangleCentroid[0], triangleCentroid[1]);
      canvas.drawPath(path, currentPaint);
    } else {
      final startX = x + source.width / 2;
      final startY = y + source.height / 2;
      final stopX = x1 + destination.width / 2;
      final stopY = y1 + destination.height / 2;

      clippedLine = clipLine(startX, startY, stopX, stopY, destination);

      final triangleCentroid = drawTriangle(
          canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], clippedLine[1], clippedLine[2], clippedLine[3]);

      canvas.drawLine(
          Offset(clippedLine[0], clippedLine[1]), Offset(triangleCentroid[0], triangleCentroid[1]), currentPaint);
    }
  });
}