tree-element 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +43 -31
  2. package/lib/animation.d.ts +2 -2
  3. package/lib/animation.d.ts.map +1 -1
  4. package/lib/animation.js +16 -12
  5. package/lib/animation.js.map +1 -1
  6. package/lib/classNames.d.ts.map +1 -1
  7. package/lib/classNames.js +2 -2
  8. package/lib/classNames.js.map +1 -1
  9. package/lib/dataLoader.d.ts +1 -0
  10. package/lib/dataLoader.d.ts.map +1 -1
  11. package/lib/dataLoader.js +22 -20
  12. package/lib/dataLoader.js.map +1 -1
  13. package/lib/dragAndDropHandler/binarySearch.js +3 -3
  14. package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
  15. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  16. package/lib/dragAndDropHandler/dragElement.js +11 -13
  17. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  18. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  19. package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
  20. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  21. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  22. package/lib/dragAndDropHandler/index.js +125 -158
  23. package/lib/dragAndDropHandler/index.js.map +1 -1
  24. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  25. package/lib/dragAndDropHandler/iterateVisibleNodes.js +23 -22
  26. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  27. package/lib/dragAndDropHandler/types.d.ts.map +1 -1
  28. package/lib/elementsRenderer.d.ts +20 -7
  29. package/lib/elementsRenderer.d.ts.map +1 -1
  30. package/lib/elementsRenderer.js +195 -136
  31. package/lib/elementsRenderer.js.map +1 -1
  32. package/lib/events.d.ts +44 -11
  33. package/lib/events.d.ts.map +1 -1
  34. package/lib/index.d.ts +36 -13
  35. package/lib/index.d.ts.map +1 -1
  36. package/lib/index.js +386 -349
  37. package/lib/index.js.map +1 -1
  38. package/lib/keyHandler.d.ts +13 -8
  39. package/lib/keyHandler.d.ts.map +1 -1
  40. package/lib/keyHandler.js +106 -51
  41. package/lib/keyHandler.js.map +1 -1
  42. package/lib/methodTypes.d.ts +3 -3
  43. package/lib/methodTypes.d.ts.map +1 -1
  44. package/lib/mouseHandler.d.ts +1 -1
  45. package/lib/mouseHandler.d.ts.map +1 -1
  46. package/lib/mouseHandler.js +36 -49
  47. package/lib/mouseHandler.js.map +1 -1
  48. package/lib/mouseUtils.d.ts.map +1 -1
  49. package/lib/mouseUtils.js +2 -2
  50. package/lib/mouseUtils.js.map +1 -1
  51. package/lib/node.d.ts +47 -16
  52. package/lib/node.d.ts.map +1 -1
  53. package/lib/node.js +169 -171
  54. package/lib/node.js.map +1 -1
  55. package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
  56. package/lib/nodeElement/borderDropHint.js +4 -5
  57. package/lib/nodeElement/borderDropHint.js.map +1 -1
  58. package/lib/nodeElement/folderElement.d.ts +8 -5
  59. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  60. package/lib/nodeElement/folderElement.js +75 -67
  61. package/lib/nodeElement/folderElement.js.map +1 -1
  62. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  63. package/lib/nodeElement/ghostDropHint.js +13 -13
  64. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  65. package/lib/nodeElement/index.d.ts +2 -1
  66. package/lib/nodeElement/index.d.ts.map +1 -1
  67. package/lib/nodeElement/index.js +38 -30
  68. package/lib/nodeElement/index.js.map +1 -1
  69. package/lib/nodeUtils.d.ts.map +1 -1
  70. package/lib/nodeUtils.js +1 -1
  71. package/lib/nodeUtils.js.map +1 -1
  72. package/lib/options.d.ts +19 -3
  73. package/lib/options.d.ts.map +1 -1
  74. package/lib/positionUtils.js +3 -3
  75. package/lib/positionUtils.js.map +1 -1
  76. package/lib/requestUrl.d.ts +1 -1
  77. package/lib/requestUrl.d.ts.map +1 -1
  78. package/lib/requestUrl.js +6 -17
  79. package/lib/requestUrl.js.map +1 -1
  80. package/lib/saveStateHandler.d.ts.map +1 -1
  81. package/lib/saveStateHandler.js +59 -89
  82. package/lib/saveStateHandler.js.map +1 -1
  83. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  84. package/lib/scrollHandler/containerScrollParent.js +11 -18
  85. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  86. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  87. package/lib/scrollHandler/createScrollParent.js +12 -13
  88. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  89. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  90. package/lib/scrollHandler/documentScrollParent.js +18 -27
  91. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  92. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  93. package/lib/scrollHandler/scrollParent.js +30 -34
  94. package/lib/scrollHandler/scrollParent.js.map +1 -1
  95. package/lib/scrollHandler.d.ts.map +1 -1
  96. package/lib/scrollHandler.js +11 -14
  97. package/lib/scrollHandler.js.map +1 -1
  98. package/lib/selectNodeHandler.d.ts +4 -2
  99. package/lib/selectNodeHandler.d.ts.map +1 -1
  100. package/lib/selectNodeHandler.js +64 -83
  101. package/lib/selectNodeHandler.js.map +1 -1
  102. package/lib/setDefaultOptions.d.ts.map +1 -1
  103. package/lib/setDefaultOptions.js +34 -38
  104. package/lib/setDefaultOptions.js.map +1 -1
  105. package/lib/triggerCustomEvent.d.ts.map +1 -1
  106. package/lib/triggerCustomEvent.js +2 -2
  107. package/lib/triggerCustomEvent.js.map +1 -1
  108. package/lib/util.d.ts.map +1 -1
  109. package/lib/util.js +2 -2
  110. package/lib/util.js.map +1 -1
  111. package/lib/version.d.ts +1 -1
  112. package/lib/version.js +1 -1
  113. package/lib/version.js.map +1 -1
  114. package/package.json +43 -32
  115. package/src/animation.ts +14 -12
  116. package/src/classNames.ts +52 -52
  117. package/src/dataLoader.ts +79 -71
  118. package/src/dragAndDropHandler/binarySearch.ts +17 -17
  119. package/src/dragAndDropHandler/dragElement.ts +51 -50
  120. package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
  121. package/src/dragAndDropHandler/index.ts +334 -348
  122. package/src/dragAndDropHandler/iterateVisibleNodes.ts +61 -63
  123. package/src/dragAndDropHandler/types.ts +5 -5
  124. package/src/elementsRenderer.ts +377 -294
  125. package/src/events.ts +241 -208
  126. package/src/header.txt +1 -1
  127. package/src/index.ts +259 -229
  128. package/src/keyHandler.ts +179 -115
  129. package/src/methodTypes.ts +7 -10
  130. package/src/mouseHandler.ts +316 -316
  131. package/src/mouseUtils.ts +14 -14
  132. package/src/node.ts +773 -771
  133. package/src/nodeElement/borderDropHint.ts +25 -25
  134. package/src/nodeElement/folderElement.ts +116 -102
  135. package/src/nodeElement/ghostDropHint.ts +64 -62
  136. package/src/nodeElement/index.ts +81 -73
  137. package/src/nodeUtils.ts +5 -5
  138. package/src/options.ts +25 -5
  139. package/src/requestUrl.ts +7 -14
  140. package/src/saveStateHandler.ts +191 -207
  141. package/src/scrollHandler/containerScrollParent.ts +40 -49
  142. package/src/scrollHandler/createScrollParent.ts +26 -27
  143. package/src/scrollHandler/documentScrollParent.ts +66 -72
  144. package/src/scrollHandler/scrollParent.ts +90 -86
  145. package/src/scrollHandler.ts +45 -45
  146. package/src/selectNodeHandler.ts +171 -165
  147. package/src/setDefaultOptions.ts +44 -32
  148. package/src/triggerCustomEvent.ts +7 -3
  149. package/src/util.ts +2 -3
  150. package/src/version.ts +1 -1
  151. package/tree_element.css +87 -69
  152. package/tree_element.debug.js +3866 -3831
  153. package/tree_element.debug.js.map +1 -1
  154. package/tree_element.js +2 -2
  155. package/tree_element.js.map +1 -1
@@ -4,8 +4,8 @@ import type { PositionInfo } from "./mouseUtils";
4
4
  import type { Node } from "./node";
5
5
 
6
6
  import {
7
- getPositionInfoFromMouseEvent,
8
- getPositionInfoFromTouch,
7
+ getPositionInfoFromMouseEvent,
8
+ getPositionInfoFromTouch,
9
9
  } from "./mouseUtils";
10
10
 
11
11
  export type GetMouseDelay = () => number;
@@ -14,378 +14,378 @@ export type MouseCapture = (positionInfo: PositionInfo) => boolean | null;
14
14
  export type MouseStart = (positionInfo: PositionInfo) => boolean;
15
15
 
16
16
  interface ClickTarget {
17
- node: Node;
18
- type: "button" | "label";
17
+ node: Node;
18
+ type: "button" | "label";
19
19
  }
20
20
 
21
21
  interface MouseHandlerParams {
22
- classNames: ClassNames;
23
- element: HTMLElement;
24
- getMouseDelay: () => number;
25
- getNode: GetNode;
26
- onClickButton: (node: Node) => void;
27
- onClickTitle: (node: Node) => void;
28
- onMouseCapture: MouseCapture;
29
- onMouseDrag: (positionInfo: PositionInfo) => void;
30
- onMouseStart: MouseStart;
31
- onMouseStop: (positionInfo: PositionInfo) => void;
32
- triggerEvent: TriggerEvent;
33
- useContextMenu: boolean;
22
+ classNames: ClassNames;
23
+ element: HTMLElement;
24
+ getMouseDelay: () => number;
25
+ getNode: GetNode;
26
+ onClickButton: (node: Node) => Promise<void>;
27
+ onClickTitle: (node: Node) => void;
28
+ onMouseCapture: MouseCapture;
29
+ onMouseDrag: (positionInfo: PositionInfo) => void;
30
+ onMouseStart: MouseStart;
31
+ onMouseStop: (positionInfo: PositionInfo) => void;
32
+ triggerEvent: TriggerEvent;
33
+ useContextMenu: boolean;
34
34
  }
35
35
 
36
36
  class MouseHandler {
37
- private classNames: ClassNames;
38
- private element: HTMLElement;
39
- private getMouseDelay: GetMouseDelay;
40
- private getNode: GetNode;
41
-
42
- private isMouseDelayMet: boolean;
43
-
44
- private isMouseStarted: boolean;
45
-
46
- private mouseDelayTimer: null | number;
47
-
48
- private mouseDownInfo: null | PositionInfo;
49
- private onClickButton: (node: Node) => void;
50
- private onClickTitle: (node: Node) => void;
51
-
52
- private onMouseCapture: MouseCapture;
53
-
54
- private onMouseDrag: (positionInfo: PositionInfo) => void;
55
-
56
- private onMouseStart: MouseStart;
57
-
58
- private onMouseStop: (positionInfo: PositionInfo) => void;
59
-
60
- private triggerEvent: TriggerEvent;
61
- private useContextMenu: boolean;
62
- constructor({
63
- classNames,
64
- element,
65
- getMouseDelay,
66
- getNode,
67
- onClickButton,
68
- onClickTitle,
69
- onMouseCapture,
70
- onMouseDrag,
71
- onMouseStart,
72
- onMouseStop,
73
- triggerEvent,
74
- useContextMenu,
75
- }: MouseHandlerParams) {
76
- this.classNames = classNames;
77
- this.element = element;
78
- this.getMouseDelay = getMouseDelay;
79
- this.getNode = getNode;
80
- this.onClickButton = onClickButton;
81
- this.onClickTitle = onClickTitle;
82
- this.onMouseCapture = onMouseCapture;
83
- this.onMouseDrag = onMouseDrag;
84
- this.onMouseStart = onMouseStart;
85
- this.onMouseStop = onMouseStop;
86
- this.triggerEvent = triggerEvent;
87
- this.useContextMenu = useContextMenu;
88
-
89
- element.addEventListener("click", this.handleClick);
90
- element.addEventListener("dblclick", this.handleDblclick);
91
- element.addEventListener("mousedown", this.mouseDown, {
92
- passive: false,
93
- });
94
- element.addEventListener("touchstart", this.touchStart, {
95
- passive: false,
96
- });
97
-
98
- if (useContextMenu) {
99
- element.addEventListener("contextmenu", this.handleContextmenu);
100
- }
101
-
102
- this.isMouseStarted = false;
103
- this.mouseDelayTimer = null;
104
- this.isMouseDelayMet = false;
105
- this.mouseDownInfo = null;
37
+ private classNames: ClassNames;
38
+ private element: HTMLElement;
39
+ private getMouseDelay: GetMouseDelay;
40
+ private getNode: GetNode;
41
+
42
+ private isMouseDelayMet: boolean;
43
+
44
+ private isMouseStarted: boolean;
45
+
46
+ private mouseDelayTimer: null | number;
47
+
48
+ private mouseDownInfo: null | PositionInfo;
49
+ private onClickButton: (node: Node) => Promise<void>;
50
+ private onClickTitle: (node: Node) => void;
51
+
52
+ private onMouseCapture: MouseCapture;
53
+
54
+ private onMouseDrag: (positionInfo: PositionInfo) => void;
55
+
56
+ private onMouseStart: MouseStart;
57
+
58
+ private onMouseStop: (positionInfo: PositionInfo) => void;
59
+
60
+ private triggerEvent: TriggerEvent;
61
+ private useContextMenu: boolean;
62
+ constructor({
63
+ classNames,
64
+ element,
65
+ getMouseDelay,
66
+ getNode,
67
+ onClickButton,
68
+ onClickTitle,
69
+ onMouseCapture,
70
+ onMouseDrag,
71
+ onMouseStart,
72
+ onMouseStop,
73
+ triggerEvent,
74
+ useContextMenu,
75
+ }: MouseHandlerParams) {
76
+ this.classNames = classNames;
77
+ this.element = element;
78
+ this.getMouseDelay = getMouseDelay;
79
+ this.getNode = getNode;
80
+ this.onClickButton = onClickButton;
81
+ this.onClickTitle = onClickTitle;
82
+ this.onMouseCapture = onMouseCapture;
83
+ this.onMouseDrag = onMouseDrag;
84
+ this.onMouseStart = onMouseStart;
85
+ this.onMouseStop = onMouseStop;
86
+ this.triggerEvent = triggerEvent;
87
+ this.useContextMenu = useContextMenu;
88
+
89
+ element.addEventListener("click", this.handleClick);
90
+ element.addEventListener("dblclick", this.handleDblclick);
91
+ element.addEventListener("mousedown", this.mouseDown, {
92
+ passive: false,
93
+ });
94
+ element.addEventListener("touchstart", this.touchStart, {
95
+ passive: false,
96
+ });
97
+
98
+ if (useContextMenu) {
99
+ element.addEventListener("contextmenu", this.handleContextmenu);
106
100
  }
107
- public deinit(): void {
108
- this.element.removeEventListener("click", this.handleClick);
109
- this.element.removeEventListener("dblclick", this.handleDblclick);
110
-
111
- if (this.useContextMenu) {
112
- this.element.removeEventListener(
113
- "contextmenu",
114
- this.handleContextmenu,
115
- );
116
- }
117
101
 
118
- this.element.removeEventListener("mousedown", this.mouseDown);
119
- this.element.removeEventListener("touchstart", this.touchStart);
120
- this.removeMouseMoveEventListeners();
102
+ this.isMouseStarted = false;
103
+ this.mouseDelayTimer = null;
104
+ this.isMouseDelayMet = false;
105
+ this.mouseDownInfo = null;
106
+ }
107
+ public deinit(): void {
108
+ this.element.removeEventListener("click", this.handleClick);
109
+ this.element.removeEventListener("dblclick", this.handleDblclick);
110
+
111
+ if (this.useContextMenu) {
112
+ this.element.removeEventListener("contextmenu", this.handleContextmenu);
121
113
  }
122
- private getClickTarget(element: HTMLElement): ClickTarget | null {
123
- const button = element.closest<HTMLElement>(
124
- `.${this.classNames.toggler}`,
125
- );
126
-
127
- if (button) {
128
- const node = this.getNode(button);
129
-
130
- if (node) {
131
- return {
132
- node,
133
- type: "button",
134
- };
135
- }
136
- } else {
137
- const treeElement = element.closest<HTMLElement>(
138
- `.${this.classNames.element}`,
139
- );
140
-
141
- if (treeElement) {
142
- const node = this.getNode(treeElement);
143
- if (node) {
144
- return {
145
- node,
146
- type: "label",
147
- };
148
- }
149
- }
114
+
115
+ this.element.removeEventListener("mousedown", this.mouseDown);
116
+ this.element.removeEventListener("touchstart", this.touchStart);
117
+ this.removeMouseMoveEventListeners();
118
+ }
119
+ private getClickTarget(element: HTMLElement): ClickTarget | null {
120
+ const button = element.closest<HTMLElement>(`.${this.classNames.toggler}`);
121
+
122
+ if (button) {
123
+ const node = this.getNode(button);
124
+
125
+ if (node) {
126
+ return {
127
+ node,
128
+ type: "button",
129
+ };
130
+ }
131
+ } else {
132
+ const treeElement = element.closest<HTMLElement>(
133
+ `.${this.classNames.element}`,
134
+ );
135
+
136
+ if (treeElement) {
137
+ const node = this.getNode(treeElement);
138
+ if (node) {
139
+ return {
140
+ node,
141
+ type: "label",
142
+ };
150
143
  }
144
+ }
145
+ }
151
146
 
152
- return null;
147
+ return null;
148
+ }
149
+ private handleClick = (e: MouseEvent): void => {
150
+ if (!e.target) {
151
+ return;
153
152
  }
154
- private handleClick = (e: MouseEvent): void => {
155
- if (!e.target) {
156
- return;
157
- }
158
153
 
159
- const clickTarget = this.getClickTarget(e.target as HTMLElement);
154
+ const clickTarget = this.getClickTarget(e.target as HTMLElement);
160
155
 
161
- if (!clickTarget) {
162
- return;
163
- }
156
+ if (!clickTarget) {
157
+ return;
158
+ }
164
159
 
165
- switch (clickTarget.type) {
166
- case "button":
167
- this.onClickButton(clickTarget.node);
168
-
169
- e.preventDefault();
170
- e.stopPropagation();
171
- break;
172
-
173
- case "label": {
174
- if (this.triggerEvent("tree.click", {
175
- node: clickTarget.node,
176
- originalEvent: e,
177
- })) {
178
- this.onClickTitle(clickTarget.node);
179
- }
180
- break;
181
- }
160
+ switch (clickTarget.type) {
161
+ case "button": {
162
+ void this.onClickButton(clickTarget.node);
163
+
164
+ e.preventDefault();
165
+ e.stopPropagation();
166
+ break;
167
+ }
168
+
169
+ case "label": {
170
+ if (
171
+ this.triggerEvent("tree.click", {
172
+ node: clickTarget.node,
173
+ originalEvent: e,
174
+ })
175
+ ) {
176
+ this.onClickTitle(clickTarget.node);
182
177
  }
183
- };
178
+ break;
179
+ }
180
+ }
181
+ };
184
182
 
185
- private handleContextmenu = (e: MouseEvent) => {
186
- if (!e.target) {
187
- return;
188
- }
183
+ private handleContextmenu = (e: MouseEvent) => {
184
+ if (!e.target) {
185
+ return;
186
+ }
189
187
 
190
- const div = (e.target as HTMLElement).closest<HTMLElement>(
191
- `ul.${this.classNames.tree} .${this.classNames.element}`,
192
- );
193
-
194
- if (div) {
195
- const node = this.getNode(div);
196
- if (node) {
197
- e.preventDefault();
198
- e.stopPropagation();
199
-
200
- this.triggerEvent("tree.contextmenu", {
201
- node,
202
- originalEvent: e,
203
- });
204
- return false;
205
- }
206
- }
188
+ const div = (e.target as HTMLElement).closest<HTMLElement>(
189
+ `ul.${this.classNames.tree} .${this.classNames.element}`,
190
+ );
207
191
 
208
- return null;
209
- };
192
+ if (div) {
193
+ const node = this.getNode(div);
194
+ if (node) {
195
+ e.preventDefault();
196
+ e.stopPropagation();
210
197
 
211
- private handleDblclick = (e: MouseEvent): void => {
212
- if (!e.target) {
213
- return;
214
- }
198
+ this.triggerEvent("tree.contextmenu", {
199
+ node,
200
+ originalEvent: e,
201
+ });
202
+ return false;
203
+ }
204
+ }
215
205
 
216
- const clickTarget = this.getClickTarget(e.target as HTMLElement);
206
+ return null;
207
+ };
217
208
 
218
- if (clickTarget?.type === "label") {
219
- this.triggerEvent("tree.dblclick", {
220
- node: clickTarget.node,
221
- originalEvent: e,
222
- });
223
- }
224
- };
209
+ private handleDblclick = (e: MouseEvent): void => {
210
+ if (!e.target) {
211
+ return;
212
+ }
225
213
 
226
- private handleMouseDown(positionInfo: PositionInfo): boolean {
227
- // We may have missed mouseup (out of window)
228
- if (this.isMouseStarted) {
229
- this.handleMouseUp(positionInfo);
230
- }
214
+ const clickTarget = this.getClickTarget(e.target as HTMLElement);
231
215
 
232
- this.mouseDownInfo = positionInfo;
216
+ if (clickTarget?.type === "label") {
217
+ this.triggerEvent("tree.dblclick", {
218
+ node: clickTarget.node,
219
+ originalEvent: e,
220
+ });
221
+ }
222
+ };
233
223
 
234
- if (!this.onMouseCapture(positionInfo)) {
235
- return false;
236
- }
224
+ private handleMouseDown(positionInfo: PositionInfo): boolean {
225
+ // We may have missed mouseup (out of window)
226
+ if (this.isMouseStarted) {
227
+ this.handleMouseUp(positionInfo);
228
+ }
237
229
 
238
- this.handleStartMouse();
230
+ this.mouseDownInfo = positionInfo;
239
231
 
240
- return true;
232
+ if (!this.onMouseCapture(positionInfo)) {
233
+ return false;
241
234
  }
242
235
 
243
- private handleMouseMove(
244
- e: MouseEvent | TouchEvent,
245
- positionInfo: PositionInfo,
246
- ): void {
247
- if (this.isMouseStarted) {
248
- this.onMouseDrag(positionInfo);
249
-
250
- if (e.cancelable) {
251
- e.preventDefault();
252
- }
253
- return;
254
- }
236
+ this.handleStartMouse();
255
237
 
256
- if (!this.isMouseDelayMet) {
257
- return;
258
- }
238
+ return true;
239
+ }
259
240
 
260
- if (this.mouseDownInfo) {
261
- this.isMouseStarted = this.onMouseStart(this.mouseDownInfo);
262
- }
263
-
264
- if (this.isMouseStarted) {
265
- this.onMouseDrag(positionInfo);
241
+ private handleMouseMove(
242
+ e: MouseEvent | TouchEvent,
243
+ positionInfo: PositionInfo,
244
+ ): void {
245
+ if (this.isMouseStarted) {
246
+ this.onMouseDrag(positionInfo);
266
247
 
267
- if (e.cancelable) {
268
- e.preventDefault();
269
- }
270
- } else {
271
- this.handleMouseUp(positionInfo);
272
- }
273
- }
274
- private handleMouseUp(positionInfo: PositionInfo): void {
275
- this.removeMouseMoveEventListeners();
276
- this.isMouseDelayMet = false;
277
- this.mouseDownInfo = null;
278
-
279
- if (this.isMouseStarted) {
280
- this.isMouseStarted = false;
281
- this.onMouseStop(positionInfo);
282
- }
248
+ if (e.cancelable) {
249
+ e.preventDefault();
250
+ }
251
+ return;
283
252
  }
284
253
 
285
- private handleStartMouse(): void {
286
- document.addEventListener("mousemove", this.mouseMove, {
287
- passive: false,
288
- });
289
- document.addEventListener("touchmove", this.touchMove, {
290
- passive: false,
291
- });
292
- document.addEventListener("mouseup", this.mouseUp, { passive: false });
293
- document.addEventListener("touchend", this.touchEnd, {
294
- passive: false,
295
- });
296
-
297
- const mouseDelay = this.getMouseDelay();
254
+ if (!this.isMouseDelayMet) {
255
+ return;
256
+ }
298
257
 
299
- if (mouseDelay) {
300
- this.startMouseDelayTimer(mouseDelay);
301
- } else {
302
- this.isMouseDelayMet = true;
303
- }
258
+ if (this.mouseDownInfo) {
259
+ this.isMouseStarted = this.onMouseStart(this.mouseDownInfo);
304
260
  }
305
261
 
306
- private mouseDown = (e: MouseEvent): void => {
307
- // Left mouse button?
308
- if (e.button !== 0) {
309
- return;
310
- }
262
+ if (this.isMouseStarted) {
263
+ this.onMouseDrag(positionInfo);
311
264
 
312
- const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));
265
+ if (e.cancelable) {
266
+ e.preventDefault();
267
+ }
268
+ } else {
269
+ this.handleMouseUp(positionInfo);
270
+ }
271
+ }
272
+ private handleMouseUp(positionInfo: PositionInfo): void {
273
+ this.removeMouseMoveEventListeners();
274
+ this.isMouseDelayMet = false;
275
+ this.mouseDownInfo = null;
276
+
277
+ if (!this.isMouseStarted) {
278
+ return;
279
+ }
313
280
 
314
- if (result && e.cancelable) {
315
- e.preventDefault();
316
- }
317
- };
281
+ this.isMouseStarted = false;
282
+ this.onMouseStop(positionInfo);
283
+ }
284
+
285
+ private handleStartMouse(): void {
286
+ document.addEventListener("mousemove", this.mouseMove, {
287
+ passive: false,
288
+ });
289
+ document.addEventListener("touchmove", this.touchMove, {
290
+ passive: false,
291
+ });
292
+ document.addEventListener("mouseup", this.mouseUp, { passive: false });
293
+ document.addEventListener("touchend", this.touchEnd, {
294
+ passive: false,
295
+ });
296
+
297
+ const mouseDelay = this.getMouseDelay();
298
+
299
+ if (mouseDelay) {
300
+ this.startMouseDelayTimer(mouseDelay);
301
+ } else {
302
+ this.isMouseDelayMet = true;
303
+ }
304
+ }
318
305
 
319
- private mouseMove = (e: MouseEvent): void => {
320
- this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));
321
- };
306
+ private mouseDown = (e: MouseEvent): void => {
307
+ // Left mouse button?
308
+ if (e.button !== 0) {
309
+ return;
310
+ }
322
311
 
323
- private mouseUp = (e: MouseEvent): void => {
324
- this.handleMouseUp(getPositionInfoFromMouseEvent(e));
325
- };
312
+ const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));
326
313
 
327
- private removeMouseMoveEventListeners() {
328
- document.removeEventListener("mousemove", this.mouseMove);
329
- document.removeEventListener("touchmove", this.touchMove);
330
- document.removeEventListener("mouseup", this.mouseUp);
331
- document.removeEventListener("touchend", this.touchEnd);
314
+ if (result && e.cancelable) {
315
+ e.preventDefault();
316
+ }
317
+ };
318
+
319
+ private mouseMove = (e: MouseEvent): void => {
320
+ this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));
321
+ };
322
+
323
+ private mouseUp = (e: MouseEvent): void => {
324
+ this.handleMouseUp(getPositionInfoFromMouseEvent(e));
325
+ };
326
+
327
+ private removeMouseMoveEventListeners() {
328
+ document.removeEventListener("mousemove", this.mouseMove);
329
+ document.removeEventListener("touchmove", this.touchMove);
330
+ document.removeEventListener("mouseup", this.mouseUp);
331
+ document.removeEventListener("touchend", this.touchEnd);
332
+ }
333
+
334
+ private startMouseDelayTimer(mouseDelay: number): void {
335
+ if (this.mouseDelayTimer) {
336
+ clearTimeout(this.mouseDelayTimer);
332
337
  }
333
338
 
334
- private startMouseDelayTimer(mouseDelay: number): void {
335
- if (this.mouseDelayTimer) {
336
- clearTimeout(this.mouseDelayTimer);
337
- }
339
+ this.mouseDelayTimer = window.setTimeout(() => {
340
+ if (this.mouseDownInfo) {
341
+ this.isMouseDelayMet = true;
342
+ }
343
+ }, mouseDelay);
338
344
 
339
- this.mouseDelayTimer = window.setTimeout(() => {
340
- if (this.mouseDownInfo) {
341
- this.isMouseDelayMet = true;
342
- }
343
- }, mouseDelay);
345
+ this.isMouseDelayMet = false;
346
+ }
344
347
 
345
- this.isMouseDelayMet = false;
348
+ private touchEnd = (e: TouchEvent): void => {
349
+ if (e.touches.length > 1) {
350
+ return;
346
351
  }
347
352
 
348
- private touchEnd = (e: TouchEvent): void => {
349
- if (e.touches.length > 1) {
350
- return;
351
- }
352
-
353
- const touch = e.touches[0];
353
+ const touch = e.touches[0];
354
354
 
355
- if (!touch) {
356
- return;
357
- }
355
+ if (!touch) {
356
+ return;
357
+ }
358
358
 
359
- this.handleMouseUp(getPositionInfoFromTouch(touch, e));
360
- };
359
+ this.handleMouseUp(getPositionInfoFromTouch(touch, e));
360
+ };
361
361
 
362
- private touchMove = (e: TouchEvent): void => {
363
- if (e.touches.length > 1) {
364
- return;
365
- }
362
+ private touchMove = (e: TouchEvent): void => {
363
+ if (e.touches.length > 1) {
364
+ return;
365
+ }
366
366
 
367
- const touch = e.touches[0];
367
+ const touch = e.touches[0];
368
368
 
369
- if (!touch) {
370
- return;
371
- }
369
+ if (!touch) {
370
+ return;
371
+ }
372
372
 
373
- this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));
374
- };
373
+ this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));
374
+ };
375
375
 
376
- private touchStart = (e: TouchEvent): void => {
377
- if (e.touches.length > 1) {
378
- return;
379
- }
376
+ private touchStart = (e: TouchEvent): void => {
377
+ if (e.touches.length > 1) {
378
+ return;
379
+ }
380
380
 
381
- const touch = e.touches[0];
381
+ const touch = e.touches[0];
382
382
 
383
- if (!touch) {
384
- return;
385
- }
383
+ if (!touch) {
384
+ return;
385
+ }
386
386
 
387
- this.handleMouseDown(getPositionInfoFromTouch(touch, e));
388
- };
387
+ this.handleMouseDown(getPositionInfoFromTouch(touch, e));
388
+ };
389
389
  }
390
390
 
391
391
  export default MouseHandler;