@@ -38,6 +38,7 @@ export function useDrag(params: UseDragParams) {
38
38
noDragClassName,
39
39
nodes,
40
40
nodeExtent,
41
+ nodeDragThreshold,
41
42
viewport,
42
43
autoPanOnNodeDrag,
43
44
nodesDraggable,
@@ -65,6 +66,7 @@ export function useDrag(params: UseDragParams) {
65
66
let lastPos : Partial < XYPosition > = { x : undefined , y : undefined }
66
67
let mousePosition : XYPosition = { x : 0 , y : 0 }
67
68
let dragEvent : MouseEvent | null = null
69
+ let dragStarted = false
68
70
69
71
let autoPanId = 0
70
72
let autoPanStarted = false
@@ -147,64 +149,89 @@ export function useDrag(params: UseDragParams) {
147
149
if ( isDisabled ) {
148
150
selection . on ( '.drag' , null )
149
151
} else {
150
- dragHandler = drag ( )
151
- . on ( 'start' , ( event : UseDragEvent ) => {
152
- const node = findNode ( id )
153
- if ( ! selectNodesOnDrag . value && ! multiSelectionActive . value && node ) {
154
- if ( ! node . selected ) {
155
- // we need to reset selected nodes when selectNodesOnDrag=false
156
- removeSelectedElements ( )
157
- }
152
+ const startDrag = ( event : UseDragEvent ) => {
153
+ dragStarted = true
154
+
155
+ const node = findNode ( id )
156
+ if ( ! selectNodesOnDrag . value && ! multiSelectionActive . value && node ) {
157
+ if ( ! node . selected ) {
158
+ // we need to reset selected nodes when selectNodesOnDrag=false
159
+ removeSelectedElements ( )
158
160
}
161
+ }
162
+
163
+ if ( node && toValue ( selectable ) && selectNodesOnDrag . value ) {
164
+ handleNodeClick (
165
+ node ,
166
+ multiSelectionActive . value ,
167
+ addSelectedNodes ,
168
+ removeSelectedElements ,
169
+ nodesSelectionActive ,
170
+ false ,
171
+ nodeEl as HTMLDivElement ,
172
+ )
173
+ }
159
174
160
- if ( node && toValue ( selectable ) && selectNodesOnDrag . value ) {
161
- handleNodeClick (
162
- node ,
163
- multiSelectionActive . value ,
164
- addSelectedNodes ,
165
- removeSelectedElements ,
166
- nodesSelectionActive ,
167
- false ,
168
- nodeEl as HTMLDivElement ,
169
- )
170
- }
175
+ const pointerPos = getPointerPosition ( event )
176
+ lastPos = pointerPos
177
+ dragItems = getDragItems ( nodes . value , nodesDraggable . value , pointerPos , findNode , id )
171
178
172
- const pointerPos = getPointerPosition ( event )
173
- lastPos = pointerPos
174
- dragItems = getDragItems ( nodes . value , nodesDraggable . value , pointerPos , findNode , id )
179
+ if ( dragItems . length ) {
180
+ const [ currentNode , nodes ] = getEventHandlerParams ( {
181
+ id,
182
+ dragItems,
183
+ findNode,
184
+ } )
175
185
176
- if ( dragItems . length ) {
177
- const [ currentNode , nodes ] = getEventHandlerParams ( {
178
- id,
179
- dragItems,
180
- findNode,
181
- } )
186
+ onStart ( { event : event . sourceEvent , node : currentNode , nodes } )
187
+ }
188
+ }
182
189
183
- onStart ( { event : event . sourceEvent , node : currentNode , nodes } )
190
+ dragHandler = drag ( )
191
+ . on ( 'start' , ( event : UseDragEvent ) => {
192
+ if ( nodeDragThreshold . value === 0 ) {
193
+ startDrag ( event )
184
194
}
185
195
196
+ lastPos = getPointerPosition ( event )
197
+
186
198
containerBounds = vueFlowRef . value ?. getBoundingClientRect ( ) || null
187
199
mousePosition = getEventPosition ( event . sourceEvent , containerBounds ! )
188
200
} )
189
201
. on ( 'drag' , ( event : UseDragEvent ) => {
190
202
const pointerPos = getPointerPosition ( event )
191
203
192
- if ( ! autoPanStarted && autoPanOnNodeDrag . value ) {
204
+ if ( ! autoPanStarted && dragStarted && autoPanOnNodeDrag . value ) {
193
205
autoPanStarted = true
194
206
autoPan ( )
195
207
}
196
208
209
+ if ( ! dragStarted ) {
210
+ const x = pointerPos . xSnapped - ( lastPos . x ?? 0 )
211
+ const y = pointerPos . ySnapped - ( lastPos . y ?? 0 )
212
+ const distance = Math . sqrt ( x * x + y * y )
213
+
214
+ if ( distance > nodeDragThreshold . value ) {
215
+ startDrag ( event )
216
+ }
217
+ }
218
+
197
219
// skip events without movement
198
- if ( ( lastPos . x !== pointerPos . xSnapped || lastPos . y !== pointerPos . ySnapped ) && dragItems . length ) {
220
+ if ( ( lastPos . x !== pointerPos . xSnapped || lastPos . y !== pointerPos . ySnapped ) && dragItems . length && dragStarted ) {
199
221
dragEvent = event . sourceEvent as MouseEvent
200
222
mousePosition = getEventPosition ( event . sourceEvent , containerBounds ! )
201
223
202
224
updateNodes ( pointerPos )
203
225
}
204
226
} )
205
227
. on ( 'end' , ( event : UseDragEvent ) => {
228
+ if ( ! dragStarted ) {
229
+ return
230
+ }
231
+
206
232
dragging . value = false
207
233
autoPanStarted = false
234
+ dragStarted = false
208
235
cancelAnimationFrame ( autoPanId )
209
236
210
237
if ( dragItems . length ) {
0 commit comments