calculateSnap method
Calculate snapped position based on existing node positions Returns snapped offset and lists of guide lines to display
Implementation
SnapResult calculateSnap({
required Offset dragPosition,
required Map<String, Offset> existingPositions,
required String? draggingNodeId,
}) {
final verticalLines = <double>[];
final horizontalLines = <double>[];
var snappedX = dragPosition.dx;
var snappedY = dragPosition.dy;
// Find nearby positions to snap to
for (final entry in existingPositions.entries) {
// Skip the node being dragged
if (entry.key == draggingNodeId) continue;
final pos = entry.value;
// Check vertical alignment (X coordinate)
if ((dragPosition.dx - pos.dx).abs() < snapThreshold) {
snappedX = pos.dx;
verticalLines.add(pos.dx);
}
// Check horizontal alignment (Y coordinate)
if ((dragPosition.dy - pos.dy).abs() < snapThreshold) {
snappedY = pos.dy;
horizontalLines.add(pos.dy);
}
}
return SnapResult(
snappedPosition: Offset(snappedX, snappedY),
verticalGuides: verticalLines,
horizontalGuides: horizontalLines,
isSnapped: verticalLines.isNotEmpty || horizontalLines.isNotEmpty,
);
}