|
1 |
| -import { zoomIdentity } from 'd3-zoom' |
2 | 1 | import { useVueFlow } from './useVueFlow'
|
3 |
| -import type { D3Selection, GraphNode, ViewportFunctions } from '~/types' |
4 |
| -import { clampPosition, getRectOfNodes, getTransformForBounds, pointToRendererPoint } from '~/utils' |
5 |
| - |
6 |
| -const DEFAULT_PADDING = 0.1 |
| 2 | +import { useViewport } from './useViewport' |
| 3 | +import type { ComputedGetters, State, ViewportFunctions } from '~/types' |
7 | 4 |
|
8 | 5 | /**
|
9 | 6 | * @deprecated use {@link useVueFlow} instead (all viewport functions are also available in {@link useVueFlow})
|
10 | 7 | */
|
11 | 8 | export function useZoomPanHelper(vueFlowId?: string): ViewportFunctions {
|
12 |
| - const { nodes, d3Zoom, d3Selection, dimensions, translateExtent, minZoom, maxZoom, viewport, snapToGrid, snapGrid, getNodes } = |
13 |
| - $(useVueFlow({ id: vueFlowId })) |
14 |
| - |
15 |
| - return { |
16 |
| - zoomIn: (options) => { |
17 |
| - zoom(1.2, options?.duration) |
18 |
| - }, |
19 |
| - zoomOut: (options) => { |
20 |
| - zoom(1 / 1.2, options?.duration) |
21 |
| - }, |
22 |
| - zoomTo: (zoomLevel, options) => { |
23 |
| - if (d3Selection && d3Zoom) { |
24 |
| - d3Zoom.scaleTo(transition(d3Selection, options?.duration), zoomLevel) |
25 |
| - } |
26 |
| - }, |
27 |
| - setTransform: (transform, options) => { |
28 |
| - transformViewport(transform.x, transform.y, transform.zoom, options?.duration) |
29 |
| - }, |
30 |
| - getTransform: () => ({ |
31 |
| - x: viewport.x, |
32 |
| - y: viewport.y, |
33 |
| - zoom: viewport.zoom, |
34 |
| - }), |
35 |
| - fitView: ( |
36 |
| - options = { |
37 |
| - padding: DEFAULT_PADDING, |
38 |
| - includeHiddenNodes: false, |
39 |
| - duration: 0, |
40 |
| - }, |
41 |
| - ) => { |
42 |
| - if (!nodes.length) { |
43 |
| - return |
44 |
| - } |
45 |
| - |
46 |
| - const nodesToFit: GraphNode[] = (options.includeHiddenNodes ? nodes : getNodes).filter((node) => { |
47 |
| - const initialized = node.initialized && node.dimensions.width && node.dimensions.height |
48 |
| - let shouldInclude = true |
49 |
| - |
50 |
| - if (options.nodes?.length) { |
51 |
| - shouldInclude = options.nodes.includes(node.id) |
52 |
| - } |
53 |
| - |
54 |
| - return initialized && shouldInclude |
55 |
| - }) |
56 |
| - |
57 |
| - const bounds = getRectOfNodes(nodesToFit) |
58 |
| - |
59 |
| - const { x, y, zoom } = getTransformForBounds( |
60 |
| - bounds, |
61 |
| - dimensions.width, |
62 |
| - dimensions.height, |
63 |
| - options.minZoom ?? minZoom, |
64 |
| - options.maxZoom ?? maxZoom, |
65 |
| - options.padding ?? DEFAULT_PADDING, |
66 |
| - options.offset, |
67 |
| - ) |
68 |
| - |
69 |
| - transformViewport(x, y, zoom, options?.duration) |
70 |
| - }, |
71 |
| - setCenter: (x, y, options) => { |
72 |
| - const nextZoom = typeof options?.zoom !== 'undefined' ? options.zoom : maxZoom |
73 |
| - const centerX = dimensions.width / 2 - x * nextZoom |
74 |
| - const centerY = dimensions.height / 2 - y * nextZoom |
| 9 | + const state = $(useVueFlow({ id: vueFlowId })) |
75 | 10 |
|
76 |
| - transformViewport(centerX, centerY, nextZoom, options?.duration) |
77 |
| - }, |
78 |
| - fitBounds: (bounds, options = { padding: DEFAULT_PADDING }) => { |
79 |
| - const { x, y, zoom } = getTransformForBounds(bounds, dimensions.width, dimensions.height, minZoom, maxZoom, options.padding) |
| 11 | + const viewportHelper = useViewport(state as State, state as unknown as ComputedGetters) |
80 | 12 |
|
81 |
| - transformViewport(x, y, zoom, options?.duration) |
82 |
| - }, |
83 |
| - project: (position) => pointToRendererPoint(position, viewport, snapToGrid, snapGrid), |
84 |
| - } |
85 |
| - |
86 |
| - function zoom(scale: number, duration?: number) { |
87 |
| - if (d3Selection && d3Zoom) { |
88 |
| - d3Zoom.scaleBy(transition(d3Selection, duration), scale) |
89 |
| - } |
90 |
| - } |
91 |
| - |
92 |
| - function transformViewport(x: number, y: number, zoom: number, duration?: number) { |
93 |
| - // enforce translate extent |
94 |
| - const { x: clampedX, y: clampedY } = clampPosition({ x: -x, y: -y }, translateExtent) |
95 |
| - |
96 |
| - const nextTransform = zoomIdentity.translate(-clampedX, -clampedY).scale(zoom) |
97 |
| - |
98 |
| - if (d3Selection && d3Zoom) { |
99 |
| - d3Zoom.transform(transition(d3Selection, duration), nextTransform) |
100 |
| - } |
| 13 | + return { |
| 14 | + fitView: (params) => viewportHelper.value.fitView(params), |
| 15 | + zoomIn: (transitionOpts) => viewportHelper.value.zoomIn(transitionOpts), |
| 16 | + zoomOut: (transitionOpts) => viewportHelper.value.zoomOut(transitionOpts), |
| 17 | + zoomTo: (zoomLevel, transitionOpts) => viewportHelper.value.zoomTo(zoomLevel, transitionOpts), |
| 18 | + setTransform: (params, transitionOpts) => viewportHelper.value.setTransform(params, transitionOpts), |
| 19 | + getTransform: () => viewportHelper.value.getTransform(), |
| 20 | + setCenter: (x, y, opts) => viewportHelper.value.setCenter(x, y, opts), |
| 21 | + fitBounds: (params, opts) => viewportHelper.value.fitBounds(params, opts), |
| 22 | + project: (params) => viewportHelper.value.project(params), |
101 | 23 | }
|
102 | 24 | }
|
103 |
| - |
104 |
| -function transition(selection: D3Selection, ms = 0) { |
105 |
| - return selection.transition().duration(ms) |
106 |
| -} |
0 commit comments