-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
map_event.js
161 lines (132 loc) · 4.32 KB
/
map_event.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// @flow
import {MapMouseEvent, MapTouchEvent, MapWheelEvent} from '../events.js';
import type Map from '../map.js';
export class MapEventHandler {
_mousedownPos: Point;
_clickTolerance: number;
_map: Map;
constructor(map: Map, options: { clickTolerance: number }) {
this._map = map;
this._clickTolerance = options.clickTolerance;
}
reset() {
delete this._mousedownPos;
}
wheel(e: WheelEvent) {
// If mapEvent.preventDefault() is called by the user, prevent handlers such as:
// - ScrollZoom
return this._firePreventable(new MapWheelEvent(e.type, this._map, e));
}
mousedown(e: MouseEvent, point: Point) {
this._mousedownPos = point;
// If mapEvent.preventDefault() is called by the user, prevent handlers such as:
// - MousePan
// - MouseRotate
// - MousePitch
// - DblclickHandler
return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
}
mouseup(e: MouseEvent) {
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
preclick(e: MouseEvent) {
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
click(e: MouseEvent, point: Point) {
if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance) return;
this.preclick(e);
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
dblclick(e: MouseEvent) {
// If mapEvent.preventDefault() is called by the user, prevent handlers such as:
// - DblClickZoom
return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
}
mouseover(e: MouseEvent) {
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
mouseout(e: MouseEvent) {
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
touchstart(e: TouchEvent) {
// If mapEvent.preventDefault() is called by the user, prevent handlers such as:
// - TouchPan
// - TouchZoom
// - TouchRotate
// - TouchPitch
// - TapZoom
// - SwipeZoom
return this._firePreventable(new MapTouchEvent(e.type, this._map, e));
}
touchmove(e: TouchEvent) {
this._map.fire(new MapTouchEvent(e.type, this._map, e));
}
touchend(e: TouchEvent) {
this._map.fire(new MapTouchEvent(e.type, this._map, e));
}
touchcancel(e: TouchEvent) {
this._map.fire(new MapTouchEvent(e.type, this._map, e));
}
_firePreventable(mapEvent: MapMouseEvent | MapTouchEvent | MapWheelEvent) {
this._map.fire(mapEvent);
if (mapEvent.defaultPrevented) {
// returning an object marks the handler as active and resets other handlers
return {};
}
}
isEnabled() {
return true;
}
isActive() {
return false;
}
enable() {}
disable() {}
}
export class BlockableMapEventHandler {
_map: Map;
_delayContextMenu: boolean;
_contextMenuEvent: MouseEvent;
constructor(map: Map) {
this._map = map;
}
reset() {
this._delayContextMenu = false;
delete this._contextMenuEvent;
}
mousemove(e: MouseEvent) {
// mousemove map events should not be fired when interaction handlers (pan, rotate, etc) are active
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
mousedown() {
this._delayContextMenu = true;
}
mouseup() {
this._delayContextMenu = false;
if (this._contextMenuEvent) {
this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent));
delete this._contextMenuEvent;
}
}
contextmenu(e: MouseEvent) {
if (this._delayContextMenu) {
// Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake
this._contextMenuEvent = e;
} else {
// Windows: contextmenu fired on mouseup, so fire event now
this._map.fire(new MapMouseEvent(e.type, this._map, e));
}
// prevent browser context menu when necessary
if (this._map.listens('contextmenu')) {
e.preventDefault();
}
}
isEnabled() {
return true;
}
isActive() {
return false;
}
enable() {}
disable() {}
}