diff --git a/src/components/Edges/EdgeWrapper.vue b/src/components/Edges/EdgeWrapper.vue index c5947001..bc8554f2 100644 --- a/src/components/Edges/EdgeWrapper.vue +++ b/src/components/Edges/EdgeWrapper.vue @@ -12,35 +12,37 @@ interface EdgeWrapper { updatable?: boolean } -const props = withDefaults(defineProps(), {}) +const props = defineProps() +const emit = defineEmits(['update:edge']) +const edge = useVModel(props, 'edge', emit) const { store } = useVueFlow() -const updating = ref(false) +const updating = ref(false) const handler = useHandle() const onEdgeClick = (event: MouseEvent) => { - const data = { event, edge: props.edge } + const data = { event, edge: edge.value } if (store.elementsSelectable) { store.nodesSelectionActive = false - store.addSelectedEdges([props.edge]) + store.addSelectedEdges([edge.value]) } store.hooks.edgeClick.trigger(data) } -const onEdgeContextMenu = (event: MouseEvent) => store.hooks.edgeContextMenu.trigger({ event, edge: props.edge }) -const onDoubleClick = (event: MouseEvent) => store.hooks.edgeDoubleClick.trigger({ event, edge: props.edge }) -const onEdgeMouseEnter = (event: MouseEvent) => store.hooks.edgeMouseEnter.trigger({ event, edge: props.edge }) -const onEdgeMouseMove = (event: MouseEvent) => store.hooks.edgeMouseMove.trigger({ event, edge: props.edge }) -const onEdgeMouseLeave = (event: MouseEvent) => store.hooks.edgeMouseLeave.trigger({ event, edge: props.edge }) +const onEdgeContextMenu = (event: MouseEvent) => store.hooks.edgeContextMenu.trigger({ event, edge: edge.value }) +const onDoubleClick = (event: MouseEvent) => store.hooks.edgeDoubleClick.trigger({ event, edge: edge.value }) +const onEdgeMouseEnter = (event: MouseEvent) => store.hooks.edgeMouseEnter.trigger({ event, edge: edge.value }) +const onEdgeMouseMove = (event: MouseEvent) => store.hooks.edgeMouseMove.trigger({ event, edge: edge.value }) +const onEdgeMouseLeave = (event: MouseEvent) => store.hooks.edgeMouseLeave.trigger({ event, edge: edge.value }) const onEdgeUpdaterMouseEnter = () => (updating.value = true) const onEdgeUpdaterMouseOut = () => (updating.value = false) const onEdgeUpdaterSourceMouseDown = (event: MouseEvent) => handleEdgeUpdater(event, true) const onEdgeUpdaterTargetMouseDown = (event: MouseEvent) => handleEdgeUpdater(event, false) const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => { - const nodeId = isSourceHandle ? props.edge.target : props.edge.source - const handleId = (isSourceHandle ? props.edge.targetHandle : props.edge.sourceHandle) ?? '' + const nodeId = isSourceHandle ? edge.value.target : edge.value.source + const handleId = (isSourceHandle ? edge.value.targetHandle : edge.value.sourceHandle) ?? '' - store.hooks.edgeUpdateStart.trigger({ event, edge: props.edge }) + store.hooks.edgeUpdateStart.trigger({ event, edge: edge.value }) handler( event, handleId, @@ -48,31 +50,57 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => { isSourceHandle, undefined, isSourceHandle ? 'target' : 'source', - (connection) => store.hooks.edgeUpdate.trigger({ edge: props.edge, connection }), - () => store.hooks.edgeUpdateEnd.trigger({ event, edge: props.edge }), + (connection) => store.hooks.edgeUpdate.trigger({ edge: edge.value, connection }), + () => store.hooks.edgeUpdateEnd.trigger({ event, edge: edge.value }), ) } // when connection type is loose we can define all handles as sources const targetNodeHandles = computed(() => store.connectionMode === ConnectionMode.Strict - ? props.edge.targetNode.handleBounds.target - : props.edge.targetNode.handleBounds.target ?? props.edge.targetNode.handleBounds.source, + ? edge.value.targetNode.handleBounds.target + : edge.value.targetNode.handleBounds.target ?? edge.value.targetNode.handleBounds.source, ) -const sourceHandle = computed(() => getHandle(props.edge.sourceNode.handleBounds.source, props.edge.sourceHandle)) -const targetHandle = computed(() => getHandle(targetNodeHandles.value, props.edge.targetHandle)) +const sourceHandle = controlledComputed( + () => edge.value.sourceNode.handleBounds, + () => getHandle(edge.value.sourceNode.handleBounds.source, edge.value.sourceHandle), +) +const targetHandle = computed(() => getHandle(targetNodeHandles.value, edge.value.targetHandle)) const sourcePosition = eagerComputed(() => (sourceHandle.value ? sourceHandle.value.position : Position.Bottom)) const targetPosition = eagerComputed(() => (targetHandle.value ? targetHandle.value.position : Position.Top)) -const edgePos = computed(() => - getEdgePositions( - props.edge.sourceNode, - sourceHandle.value, - sourcePosition.value, - props.edge.targetNode, - targetHandle.value, - targetPosition.value, - ), -) + +onMounted(() => { + nextTick(() => { + watch( + [ + sourcePosition, + targetPosition, + () => edge.value.sourceNode.position, + () => edge.value.targetNode.position, + () => edge.value.sourceNode.computedPosition, + () => edge.value.targetNode.computedPosition, + () => edge.value.sourceNode.dimensions, + () => edge.value.targetNode.dimensions, + ], + () => { + const { sourceX, sourceY, targetY, targetX } = getEdgePositions( + edge.value.sourceNode, + sourceHandle.value, + sourcePosition.value, + edge.value.targetNode, + targetHandle.value, + targetPosition.value, + ) + if (edge.value.sourceX !== sourceX) edge.value.sourceX = sourceX + if (edge.value.sourceY !== sourceY) edge.value.sourceY = sourceY + if (edge.value.targetX !== targetX) edge.value.targetX = targetX + if (edge.value.targetY !== targetY) edge.value.targetY = targetY + }, + { immediate: true, deep: true }, + ) + }) +}) +onRenderTriggered(console.log) diff --git a/src/container/VueFlow/VueFlow.vue b/src/container/VueFlow/VueFlow.vue index b6188fad..00e8ccb5 100644 --- a/src/container/VueFlow/VueFlow.vue +++ b/src/container/VueFlow/VueFlow.vue @@ -58,7 +58,7 @@ export default { - +