drawArrowsLeftToRight method

dynamic drawArrowsLeftToRight(
  1. Node<E> node,
  2. Canvas canvas
)

Implementation

drawArrowsLeftToRight(Node<E> node, Canvas canvas) {
  List<Node<E>> subNodes = controller.getSubNodes(node);
  if (node.hideNodes == false) {
    if (allLeaf(subNodes)) {
      for (var n in subNodes) {
        final bool horizontal = n.position.dx > node.position.dx;
        final bool vertical = n.position.dy > node.position.dy;
        final bool c = vertical ? horizontal : !horizontal;

        linePath.moveTo(
          node.position.dx + controller.boxSize.width / 2,
          node.position.dy + controller.boxSize.height / 2,
        );
        linePath.lineTo(
          n.position.dx +
              controller.boxSize.width / 2 +
              (horizontal ? -1 : 1) * cornerRadius,
          node.position.dy + controller.boxSize.height / 2,
        );
        linePath.arcToPoint(
          Offset(
            n.position.dx + controller.boxSize.width / 2,
            node.position.dy +
                controller.boxSize.height / 2 +
                (vertical ? 1 : -1) * cornerRadius,
          ),
          radius: Radius.circular(cornerRadius),
          clockwise: c,
        );
        linePath.lineTo(
          n.position.dx + controller.boxSize.width / 2,
          n.position.dy + controller.boxSize.height / 2,
        );
      }
    } else {
      for (var n in subNodes) {
        final minx = math.min(node.position.dx, n.position.dx);
        final maxx = math.max(node.position.dx, n.position.dx);
        final miny = math.min(node.position.dy, n.position.dy);
        final maxy = math.max(node.position.dy, n.position.dy);

        final dx = (maxx - minx) / 2 + controller.boxSize.width / 2;

        bool horizontal = maxx == node.position.dx;
        bool vertical = maxy == node.position.dy;

        bool clockwise = horizontal ? !vertical : vertical;

        linePath.moveTo(
          node.position.dx + controller.boxSize.width / 2,
          node.position.dy + controller.boxSize.height / 2,
        );

        linePath.lineTo(
          minx + dx + (horizontal ? 1 : -1) * cornerRadius, //
          node.position.dy + controller.boxSize.height / 2,
        );

        if (maxy - miny > cornerRadius * 2) {
          linePath.arcToPoint(
              Offset(
                minx + dx,
                node.position.dy +
                    controller.boxSize.height / 2 +
                    (vertical ? -1 : 1) * cornerRadius,
              ),
              radius: Radius.circular(cornerRadius),
              clockwise: !clockwise);

          linePath.lineTo(
            minx + dx,
            n.position.dy +
                controller.boxSize.height / 2 +
                (vertical ? 1 : -1) * cornerRadius,
          );

          linePath.arcToPoint(
              Offset(
                minx + dx + (!horizontal ? 1 : -1) * cornerRadius,
                n.position.dy + controller.boxSize.height / 2,
              ),
              radius: Radius.circular(cornerRadius),
              clockwise: clockwise);
        }

        linePath.lineTo(
          n.position.dx + controller.boxSize.width / 2,
          n.position.dy + controller.boxSize.height / 2,
        );

        drawArrowsLeftToRight(n, canvas);
      }
    }
  }
}