Files
vue-flow/packages/core/src/composables/useUpdateNodePositions.ts
T

44 lines
1.6 KiB
TypeScript

import { useVueFlow } from './useVueFlow'
import type { NodeDragItem, XYPosition } from '~/types'
import { calcNextPosition } from '~/utils'
export function useUpdateNodePositions() {
const { getSelectedNodes, nodeExtent, updateNodePositions, findNode, snapGrid, snapToGrid, nodesDraggable, emits } =
useVueFlow()
return (positionDiff: XYPosition, isShiftPressed = false) => {
// by default a node moves 5px on each key press, or 20px if shift is pressed
// if snap grid is enabled, we use that for the velocity.
const xVelo = snapToGrid.value ? snapGrid.value[0] : 5
const yVelo = snapToGrid.value ? snapGrid.value[1] : 5
const factor = isShiftPressed ? 4 : 1
const positionDiffX = positionDiff.x * xVelo * factor
const positionDiffY = positionDiff.y * yVelo * factor
const nodeUpdates = getSelectedNodes.value
.filter((n) => n.draggable || (nodesDraggable && typeof n.draggable === 'undefined'))
.map((n) => {
const nextPosition = { x: n.computedPosition.x + positionDiffX, y: n.computedPosition.y + positionDiffY }
const { computedPosition } = calcNextPosition(
n,
nextPosition,
emits.error,
nodeExtent.value,
n.parentNode ? findNode(n.parentNode) : undefined,
)
return {
id: n.id,
position: computedPosition,
from: n.position,
distance: { x: positionDiff.x, y: positionDiff.y },
dimensions: n.dimensions,
} as NodeDragItem
})
updateNodePositions(nodeUpdates, true, false)
}
}