1
- import { closest } from 'shared/utils' ;
1
+ import { closest , distance } from 'shared/utils' ;
2
2
import Sensor from '../Sensor' ;
3
3
import { DragStartSensorEvent , DragMoveSensorEvent , DragStopSensorEvent } from '../SensorEvent' ;
4
4
5
5
const onContextMenuWhileDragging = Symbol ( 'onContextMenuWhileDragging' ) ;
6
6
const onMouseDown = Symbol ( 'onMouseDown' ) ;
7
7
const onMouseMove = Symbol ( 'onMouseMove' ) ;
8
8
const onMouseUp = Symbol ( 'onMouseUp' ) ;
9
+ const startDrag = Symbol ( 'startDrag' ) ;
10
+ const onDistanceChange = Symbol ( 'onDistanceChange' ) ;
9
11
10
12
/**
11
13
* This sensor picks up native browser mouse events and dictates drag operations
@@ -23,31 +25,19 @@ export default class MouseSensor extends Sensor {
23
25
constructor ( containers = [ ] , options = { } ) {
24
26
super ( containers , options ) ;
25
27
26
- /**
27
- * Indicates if mouse button is still down
28
- * @property mouseDown
29
- * @type {Boolean }
30
- */
31
- this . mouseDown = false ;
32
-
33
28
/**
34
29
* Mouse down timer which will end up triggering the drag start operation
35
30
* @property mouseDownTimeout
36
31
* @type {Number }
37
32
*/
38
33
this . mouseDownTimeout = null ;
39
34
40
- /**
41
- * Indicates if context menu has been opened during drag operation
42
- * @property openedContextMenu
43
- * @type {Boolean }
44
- */
45
- this . openedContextMenu = false ;
46
-
47
35
this [ onContextMenuWhileDragging ] = this [ onContextMenuWhileDragging ] . bind ( this ) ;
48
36
this [ onMouseDown ] = this [ onMouseDown ] . bind ( this ) ;
49
37
this [ onMouseMove ] = this [ onMouseMove ] . bind ( this ) ;
50
38
this [ onMouseUp ] = this [ onMouseUp ] . bind ( this ) ;
39
+ this [ startDrag ] = this [ startDrag ] . bind ( this ) ;
40
+ this [ onDistanceChange ] = this [ onDistanceChange ] . bind ( this ) ;
51
41
}
52
42
53
43
/**
@@ -74,43 +64,67 @@ export default class MouseSensor extends Sensor {
74
64
return ;
75
65
}
76
66
67
+ this . startEvent = event ;
68
+
77
69
document . addEventListener ( 'mouseup' , this [ onMouseUp ] ) ;
70
+ document . addEventListener ( 'mousemove' , this [ onDistanceChange ] ) ;
78
71
79
- const target = document . elementFromPoint ( event . clientX , event . clientY ) ;
80
- const container = closest ( target , this . containers ) ;
72
+ const container = closest ( event . target , this . containers ) ;
81
73
82
74
if ( ! container ) {
83
75
return ;
84
76
}
85
77
86
78
document . addEventListener ( 'dragstart' , preventNativeDragStart ) ;
87
79
88
- this . mouseDown = true ;
89
-
90
- clearTimeout ( this . mouseDownTimeout ) ;
80
+ this . currentContainer = container ;
91
81
this . mouseDownTimeout = setTimeout ( ( ) => {
92
- if ( ! this . mouseDown ) {
82
+ this . delayOver = true ;
83
+ if ( this . distance < this . options . distance ) {
93
84
return ;
94
85
}
86
+ this [ startDrag ] ( ) ;
87
+ } , this . options . delay ) ;
88
+ }
89
+
90
+ /**
91
+ * Start the drag
92
+ * @private
93
+ */
94
+ [ startDrag ] ( ) {
95
+ const startEvent = this . startEvent ;
96
+ const container = this . currentContainer ;
97
+
98
+ const dragStartEvent = new DragStartSensorEvent ( {
99
+ clientX : startEvent . clientX ,
100
+ clientY : startEvent . clientY ,
101
+ target : startEvent . target ,
102
+ container,
103
+ originalEvent : startEvent ,
104
+ } ) ;
95
105
96
- const dragStartEvent = new DragStartSensorEvent ( {
97
- clientX : event . clientX ,
98
- clientY : event . clientY ,
99
- target,
100
- container,
101
- originalEvent : event ,
102
- } ) ;
106
+ this . trigger ( this . currentContainer , dragStartEvent ) ;
103
107
104
- this . trigger ( container , dragStartEvent ) ;
108
+ this . dragging = ! dragStartEvent . canceled ( ) ;
105
109
106
- this . currentContainer = container ;
107
- this . dragging = ! dragStartEvent . canceled ( ) ;
110
+ if ( this . dragging ) {
111
+ document . addEventListener ( 'contextmenu' , this [ onContextMenuWhileDragging ] , true ) ;
112
+ document . addEventListener ( 'mousemove' , this [ onMouseMove ] ) ;
113
+ }
114
+ }
108
115
109
- if ( this . dragging ) {
110
- document . addEventListener ( 'contextmenu' , this [ onContextMenuWhileDragging ] ) ;
111
- document . addEventListener ( 'mousemove' , this [ onMouseMove ] ) ;
112
- }
113
- } , this . options . delay ) ;
116
+ /**
117
+ * Detect change in distance
118
+ * @private
119
+ * @param {Event } event - Mouse move event
120
+ */
121
+ [ onDistanceChange ] ( event ) {
122
+ if ( this . dragging ) return ;
123
+ this . distance = distance ( this . startEvent . pageX , this . startEvent . pageY , event . pageX , event . pageY ) ;
124
+
125
+ if ( this . delayOver && this . distance >= this . options . distance ) {
126
+ this [ startDrag ] ( ) ;
127
+ }
114
128
}
115
129
116
130
/**
@@ -142,15 +156,15 @@ export default class MouseSensor extends Sensor {
142
156
* @param {Event } event - Mouse up event
143
157
*/
144
158
[ onMouseUp ] ( event ) {
145
- this . mouseDown = Boolean ( this . openedContextMenu ) ;
159
+ clearTimeout ( this . mouseDownTimeout ) ;
146
160
147
- if ( this . openedContextMenu ) {
148
- this . openedContextMenu = false ;
161
+ if ( event . button !== 0 ) {
149
162
return ;
150
163
}
151
164
152
165
document . removeEventListener ( 'mouseup' , this [ onMouseUp ] ) ;
153
166
document . removeEventListener ( 'dragstart' , preventNativeDragStart ) ;
167
+ document . removeEventListener ( 'mousemove' , this [ onDistanceChange ] ) ;
154
168
155
169
if ( ! this . dragging ) {
156
170
return ;
@@ -168,11 +182,14 @@ export default class MouseSensor extends Sensor {
168
182
169
183
this . trigger ( this . currentContainer , dragStopEvent ) ;
170
184
171
- document . removeEventListener ( 'contextmenu' , this [ onContextMenuWhileDragging ] ) ;
185
+ document . removeEventListener ( 'contextmenu' , this [ onContextMenuWhileDragging ] , true ) ;
172
186
document . removeEventListener ( 'mousemove' , this [ onMouseMove ] ) ;
173
187
174
188
this . currentContainer = null ;
175
189
this . dragging = false ;
190
+ this . distance = 0 ;
191
+ this . delayOver = false ;
192
+ this . startEvent = null ;
176
193
}
177
194
178
195
/**
@@ -182,7 +199,6 @@ export default class MouseSensor extends Sensor {
182
199
*/
183
200
[ onContextMenuWhileDragging ] ( event ) {
184
201
event . preventDefault ( ) ;
185
- this . openedContextMenu = true ;
186
202
}
187
203
}
188
204
0 commit comments