refactor(zoom): don't interrupt while zoom/pan is active

This commit is contained in:
Braks
2022-07-16 14:37:08 +02:00
parent 95afba3e17
commit 45163f31c9
@@ -35,6 +35,8 @@ const {
const viewportEl = templateRef<HTMLDivElement>('viewport', null) const viewportEl = templateRef<HTMLDivElement>('viewport', null)
let isZoomingOrPanning = $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)) ||
@@ -94,9 +96,9 @@ onMounted(() => {
}) })
const selectionKeyPressed = useKeyPress($$(selectionKeyCode), (keyPress) => { const selectionKeyPressed = useKeyPress($$(selectionKeyCode), (keyPress) => {
if (keyPress) { if (keyPress && !isZoomingOrPanning) {
d3Zoom.on('zoom', null) d3Zoom.on('zoom', null)
} else { } else if (!keyPress) {
d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => {
setState({ viewport: { x: event.transform.x, y: event.transform.y, zoom: event.transform.k } }) setState({ viewport: { x: event.transform.x, y: event.transform.y, zoom: event.transform.k } })
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
@@ -108,12 +110,16 @@ onMounted(() => {
const zoomKeyPressed = useKeyPress($$(zoomActivationKeyCode)) const zoomKeyPressed = useKeyPress($$(zoomActivationKeyCode))
d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => {
isZoomingOrPanning = true
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
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
if (viewChanged(transform, event.transform)) { if (viewChanged(transform, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform = flowTransform transform = flowTransform