Skip to content

Commit 0568ab7

Browse files
authored
feat(core): expose wheelDelta utility (#1918)
* feat(core): expose wheelDelta utility Signed-off-by: braks <[email protected]> * chore(changeset): add * fix(minimap): apply wheel delta to zoom Signed-off-by: braks <[email protected]> * chore(changeset): add --------- Signed-off-by: braks <[email protected]>
1 parent 4bc9acc commit 0568ab7

File tree

7 files changed

+52
-9
lines changed

7 files changed

+52
-9
lines changed

.changeset/perfect-coins-rest.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@vue-flow/core": minor
3+
---
4+
5+
Expose `wheelDelta` utility fn

.changeset/quick-dolphins-juggle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@vue-flow/minimap": patch
3+
---
4+
5+
Apply wheelDelta to zoom
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script setup>
2+
import { Handle, Position } from '@vue-flow/core'
3+
4+
const props = defineProps({ handleCount: { type: Number } })
5+
</script>
6+
7+
<template>
8+
<div class="custom-node">
9+
<Handle
10+
v-for="n in props.handleCount"
11+
:id="String(n - 1)"
12+
:key="`${n}-${props.handleCount}`"
13+
type="target"
14+
:position="Position.Top"
15+
:style="{ left: `${100 * (n / (props.handleCount + 1))}%` }"
16+
/>
17+
Custom
18+
</div>
19+
</template>
20+
21+
<style>
22+
.custom-node {
23+
min-width: 100px;
24+
gap: 4px;
25+
padding: 8px;
26+
background: white;
27+
border: 1px solid black;
28+
border-radius: 4px;
29+
}
30+
</style>

packages/core/src/container/Viewport/Viewport.vue

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { PanOnScrollMode } from '../../types'
88
import { useKeyPress } from '../../composables/useKeyPress'
99
import { useVueFlow } from '../../composables/useVueFlow'
1010
import { useResizeHandler } from '../../composables/useResizeHandler'
11-
import { clamp, isMacOs, warn } from '../../utils'
11+
import { clamp, isMacOs, warn, wheelDelta } from '../../utils'
1212
import Pane from '../Pane/Pane.vue'
1313
import Transform from './Transform.vue'
1414
@@ -380,12 +380,6 @@ function isRightClickPan(pan: boolean | number[], usedButton: number) {
380380
return usedButton === 2 && Array.isArray(pan) && pan.includes(2)
381381
}
382382
383-
function wheelDelta(event: any) {
384-
const factor = event.ctrlKey && isMacOs() ? 10 : 1
385-
386-
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * factor
387-
}
388-
389383
function viewChanged(prevViewport: ViewportTransform, eventTransform: ZoomTransform) {
390384
return (
391385
(prevViewport.x !== eventTransform.x && !Number.isNaN(eventTransform.x)) ||

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export {
4848
getBoundsofRects,
4949
connectionExists,
5050
clamp,
51+
wheelDelta,
5152
} from './utils/graph'
5253

5354
/**

packages/core/src/utils/graph.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import type {
2121
XYPosition,
2222
XYZPosition,
2323
} from '../types'
24-
import { isDef, snapPosition, warn } from '.'
24+
import { isDef, isMacOs, snapPosition, warn } from '.'
2525

2626
export function nodeToRect(node: GraphNode): Rect {
2727
return {
@@ -504,3 +504,9 @@ export function getMarkerId(marker: EdgeMarkerType | undefined, vueFlowId?: stri
504504
.map((key) => `${key}=${marker[<keyof EdgeMarkerType>key]}`)
505505
.join('&')}`
506506
}
507+
508+
export function wheelDelta(event: any) {
509+
const factor = event.ctrlKey && isMacOs() ? 10 : 1
510+
511+
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * factor
512+
}

packages/minimap/src/MiniMap.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts" setup>
22
import type { CoordinateExtent, GraphNode, PanelPosition } from '@vue-flow/core'
3-
import { Panel, getBoundsofRects, getConnectedEdges, getRectOfNodes, useVueFlow } from '@vue-flow/core'
3+
import { Panel, getBoundsofRects, getConnectedEdges, getRectOfNodes, useVueFlow, wheelDelta } from '@vue-flow/core'
44
import { zoom, zoomIdentity } from 'd3-zoom'
55
import type { D3ZoomEvent } from 'd3-zoom'
66
import { pointer, select } from 'd3-selection'
@@ -159,6 +159,7 @@ watchEffect(
159159
}
160160
161161
const zoomAndPanHandler = zoom()
162+
.wheelDelta((event) => wheelDelta(event) * (zoomStep / 10))
162163
.on('zoom', pannable ? panHandler : () => {})
163164
.on('zoom.wheel', zoomable ? zoomHandler : () => {})
164165
@@ -232,6 +233,7 @@ export default {
232233
v-for="node of getNodesInitialized"
233234
:id="node.id"
234235
:key="node.id"
236+
f
235237
:position="node.computedPosition"
236238
:dimensions="node.dimensions"
237239
:selected="node.selected"

0 commit comments

Comments
 (0)