drawArrowsTopToBottom method
dynamic
drawArrowsTopToBottom(
- Node<E> node,
- 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);
}
}
}
}