calculateSnap method

SnapResult calculateSnap({
  1. required Offset dragPosition,
  2. required Map<String, Offset> existingPositions,
  3. required String? draggingNodeId,
})

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,
  );
}