in packages/diagrams/lib/src/utils.dart [89:145]
void paint(Canvas canvas, Size size) {
final RenderBox hero =
heroKey.currentContext!.findRenderObject()! as RenderBox;
final RenderBox diagram =
canvasKey.currentContext!.findRenderObject()! as RenderBox;
final Paint dotPaint = Paint();
final Paint linePaint = Paint()..strokeWidth = 2.0;
final Offset heroTopLeft =
diagram.globalToLocal(hero.localToGlobal(Offset.zero));
for (final Label label in labels) {
final RenderBox box =
label.key.currentContext!.findRenderObject()! as RenderBox;
final Offset anchor = diagram
.globalToLocal(box.localToGlobal(label.anchor.alongSize(box.size)));
final Offset anchorOnHero = anchor - heroTopLeft;
final FractionalOffset relativeAnchor =
FractionalOffset.fromOffsetAndSize(anchorOnHero, hero.size);
final double distanceToTop = anchorOnHero.dy;
final double distanceToBottom = hero.size.height - anchorOnHero.dy;
final double distanceToLeft = anchorOnHero.dx;
final double distanceToRight = hero.size.width - anchorOnHero.dx;
Offset labelPosition;
Offset textPosition = Offset.zero;
final TextPainter painter = _painters[label]!;
if (distanceToTop <= distanceToLeft &&
distanceToTop <= distanceToRight &&
distanceToTop <= distanceToBottom) {
labelPosition = Offset(anchor.dx + (relativeAnchor.dx - 0.5) * margin,
heroTopLeft.dy - margin);
textPosition = Offset(labelPosition.dx - painter.width / 2.0,
labelPosition.dy - painter.height);
} else if (distanceToBottom < distanceToLeft &&
distanceToBottom < distanceToRight &&
distanceToTop > distanceToBottom) {
labelPosition =
Offset(anchor.dx, heroTopLeft.dy + hero.size.height + margin);
textPosition =
Offset(labelPosition.dx - painter.width / 2.0, labelPosition.dy);
} else if (distanceToLeft < distanceToRight) {
labelPosition = Offset(heroTopLeft.dx - margin, anchor.dy);
textPosition = Offset(labelPosition.dx - painter.width - 2.0,
labelPosition.dy - painter.height / 2.0);
} else if (distanceToLeft > distanceToRight) {
labelPosition =
Offset(heroTopLeft.dx + hero.size.width + margin, anchor.dy);
textPosition =
Offset(labelPosition.dx, labelPosition.dy - painter.height / 2.0);
} else {
labelPosition = Offset(anchor.dx, heroTopLeft.dy - margin * 2.0);
textPosition = Offset(anchor.dx - painter.width / 2.0,
anchor.dy - margin - painter.height);
}
canvas.drawCircle(anchor, 4.0, dotPaint);
canvas.drawLine(anchor, labelPosition, linePaint);
painter.paint(canvas, textPosition);
}
}