getOrCreatePath method

Path? getOrCreatePath({
  1. required Connection connection,
  2. required Node sourceNode,
  3. required Node targetNode,
  4. required ConnectionStyle connectionStyle,
})

Get or create cached path during painting operations This is the only place where paths should be created

Implementation

Path? getOrCreatePath({
  required Connection connection,
  required Node sourceNode,
  required Node targetNode,
  required ConnectionStyle connectionStyle,
}) {
  // Skip path creation for hidden connections
  if (!sourceNode.isVisible || !targetNode.isVisible) {
    return null;
  }

  final currentSourcePos = sourceNode.position.value;
  final currentTargetPos = targetNode.position.value;
  final currentSourceSize = sourceNode.size.value;
  final currentTargetSize = targetNode.size.value;
  final connectionTheme = theme.connectionTheme;
  final currentStartGap = connection.startGap ?? connectionTheme.startGap;
  final currentEndGap = connection.endGap ?? connectionTheme.endGap;

  // Get current port offsets for cache invalidation
  final sourcePort = _findPort(sourceNode, connection.sourcePortId);
  final targetPort = _findPort(targetNode, connection.targetPortId);
  final currentSourcePortOffset = sourcePort?.offset ?? Offset.zero;
  final currentTargetPortOffset = targetPort?.offset ?? Offset.zero;

  // Check if cache needs updating (including node sizes and port offsets)
  final existing = _getCachedPath(connection.id);
  if (existing != null &&
      existing.sourcePosition == currentSourcePos &&
      existing.targetPosition == currentTargetPos &&
      existing.startGap == currentStartGap &&
      existing.endGap == currentEndGap &&
      existing.sourceNodeSize == currentSourceSize &&
      existing.targetNodeSize == currentTargetSize &&
      existing.sourcePortOffset == currentSourcePortOffset &&
      existing.targetPortOffset == currentTargetPortOffset) {
    return existing.originalPath; // Cache hit
  }

  // Create new path and cache it
  final newPath = _createAndCachePath(
    connection: connection,
    sourceNode: sourceNode,
    targetNode: targetNode,
    sourcePosition: currentSourcePos,
    targetPosition: currentTargetPos,
    connectionStyle: connectionStyle,
    startGap: currentStartGap,
    endGap: currentEndGap,
  );

  return newPath?.originalPath;
}