feat(core): add dragging class to pane

This commit is contained in:
braks
2022-10-13 23:23:43 +02:00
committed by Braks
parent 71eacd7035
commit 0044a14ac1
2 changed files with 14 additions and 2 deletions
@@ -88,6 +88,7 @@ export default {
<NodesSelection v-if="nodesSelectionActive" :key="`nodes-selection-${id}`" /> <NodesSelection v-if="nodesSelectionActive" :key="`nodes-selection-${id}`" />
<div <div
:key="`pane-${id}`" :key="`pane-${id}`"
v-bind="$attrs"
class="vue-flow__pane vue-flow__container" class="vue-flow__pane vue-flow__container"
@click="onClick" @click="onClick"
@contextmenu="onContextMenu" @contextmenu="onContextMenu"
@@ -37,6 +37,8 @@ const viewportEl = templateRef<HTMLDivElement>('viewport', null)
let isZoomingOrPanning = $ref(false) let isZoomingOrPanning = $ref(false)
let isDragging = $ref(false)
const viewChanged = (prevTransform: ViewpaneTransform, eventTransform: ZoomTransform): boolean => const viewChanged = (prevTransform: ViewpaneTransform, eventTransform: ZoomTransform): boolean =>
(prevTransform.x !== eventTransform.x && !isNaN(eventTransform.x)) || (prevTransform.x !== eventTransform.x && !isNaN(eventTransform.x)) ||
(prevTransform.y !== eventTransform.y && !isNaN(eventTransform.y)) || (prevTransform.y !== eventTransform.y && !isNaN(eventTransform.y)) ||
@@ -114,12 +116,19 @@ onMounted(() => {
isZoomingOrPanning = true isZoomingOrPanning = true
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
if (event.sourceEvent?.type === 'mousedown') {
isDragging = true
}
transform = flowTransform transform = flowTransform
emits.moveStart({ event, flowTransform }) emits.moveStart({ event, flowTransform })
}) })
d3Zoom.on('end', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('end', (event: D3ZoomEvent<HTMLDivElement, any>) => {
isZoomingOrPanning = false isZoomingOrPanning = false
isDragging = false
if (viewChanged(transform, event.transform)) { if (viewChanged(transform, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
@@ -177,6 +186,8 @@ onMounted(() => {
const zoomScroll = zoomKeyPressed.value || zoomOnScroll const zoomScroll = zoomKeyPressed.value || zoomOnScroll
const pinchZoom = zoomOnPinch && event.ctrlKey const pinchZoom = zoomOnPinch && event.ctrlKey
if (event.button === 1 && event.type === 'mousedown' && (event.target as HTMLElement)?.closest(`.vue-flow__node`)) return true
// if all interactions are disabled, we prevent all zoom events // if all interactions are disabled, we prevent all zoom events
if (!panOnDrag && !zoomScroll && !panOnScroll && !zoomOnDoubleClick && !zoomOnPinch) return false if (!panOnDrag && !zoomScroll && !panOnScroll && !zoomOnDoubleClick && !zoomOnPinch) return false
@@ -201,7 +212,7 @@ onMounted(() => {
if (!panOnDrag && (event.type === 'mousedown' || event.type === 'touchstart')) return false if (!panOnDrag && (event.type === 'mousedown' || event.type === 'touchstart')) return false
// default filter for d3-zoom // default filter for d3-zoom
return (!event.ctrlKey || event.type === 'wheel') && !event.button return (!event.ctrlKey || event.type === 'wheel') && (!event.button || event.button <= 1)
}) })
}) })
</script> </script>
@@ -217,6 +228,6 @@ export default {
<Transform> <Transform>
<slot /> <slot />
</Transform> </Transform>
<SelectionPane /> <SelectionPane :class="{ dragging: isDragging }" />
</div> </div>
</template> </template>