refactor(zoom): don't interrupt while zoom/pan is active
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user