drawArrowsTopToBottom method

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

Implementation

drawArrowsTopToBottom(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(
          node.position.dx + controller.boxSize.width / 2,
          n.position.dy +
              controller.boxSize.height / 2 +
              (vertical ? -1 : 1) * cornerRadius,
        );

        linePath.arcToPoint(
          Offset(
            node.position.dx +
                controller.boxSize.width / 2 +
                (horizontal ? 1 : -1) * cornerRadius,
            n.position.dy + controller.boxSize.height / 2,
          ),
          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 dy = (maxy - miny) / 2 + controller.boxSize.height / 2;

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

        bool clockwise = vertical ? !horizontal : horizontal;

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

        linePath.lineTo(
          node.position.dx + controller.boxSize.width / 2,
          miny + dy + (vertical ? 1 : -1) * cornerRadius,
        );

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

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

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

        drawArrowsTopToBottom(n, canvas);
      }
    }
  }
}