From 1a5742320439817190497d93e67192d4742bd77f Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 9 Nov 2023 22:41:59 +0100 Subject: [PATCH] refactor(system,panzoom): return promise from transitioned panzoom actions --- packages/system/src/xypanzoom/XYPanZoom.ts | 27 +++++++++++++++++++--- packages/system/src/xypanzoom/utils.ts | 2 ++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/system/src/xypanzoom/XYPanZoom.ts b/packages/system/src/xypanzoom/XYPanZoom.ts index 372e6134..2d9e8a84 100644 --- a/packages/system/src/xypanzoom/XYPanZoom.ts +++ b/packages/system/src/xypanzoom/XYPanZoom.ts @@ -73,8 +73,15 @@ export function XYPanZoom({ function setTransform(transform: ZoomTransform, options?: PanZoomTransformOptions) { if (d3Selection) { - d3ZoomInstance?.transform(getD3Transition(d3Selection, options?.duration), transform); + return new Promise((resolve) => { + d3ZoomInstance?.transform( + getD3Transition(d3Selection, options?.duration, () => resolve(true)), + transform + ); + }); } + + return Promise.resolve(false); } // public functions @@ -217,14 +224,28 @@ export function XYPanZoom({ function scaleTo(zoom: number, options?: PanZoomTransformOptions) { if (d3Selection) { - d3ZoomInstance?.scaleTo(getD3Transition(d3Selection, options?.duration), zoom); + return new Promise((resolve) => { + d3ZoomInstance?.scaleTo( + getD3Transition(d3Selection, options?.duration, () => resolve(true)), + zoom + ); + }); } + + return Promise.resolve(false); } function scaleBy(factor: number, options?: PanZoomTransformOptions) { if (d3Selection) { - d3ZoomInstance?.scaleBy(getD3Transition(d3Selection, options?.duration), factor); + return new Promise((resolve) => { + d3ZoomInstance?.scaleBy( + getD3Transition(d3Selection, options?.duration, () => resolve(true)), + factor + ); + }); } + + return Promise.resolve(false); } function setScaleExtent(scaleExtent: [number, number]) { diff --git a/packages/system/src/xypanzoom/utils.ts b/packages/system/src/xypanzoom/utils.ts index cad2b481..1a6f304f 100644 --- a/packages/system/src/xypanzoom/utils.ts +++ b/packages/system/src/xypanzoom/utils.ts @@ -22,6 +22,8 @@ export const isRightClickPan = (panOnDrag: boolean | number[], usedButton: numbe export const getD3Transition = (selection: D3SelectionInstance, duration = 0) => typeof duration === 'number' && duration > 0 ? selection.transition().duration(duration) : selection; +export const getD3Transition = (selection: D3SelectionInstance, duration = 0, onEnd = () => {}) => + typeof duration === 'number' && duration > 0 ? selection.transition().duration(duration).on('end', onEnd) : selection; export const wheelDelta = (event: any) => { const factor = event.ctrlKey && isMacOs() ? 10 : 1;