tree-element 0.1.1 → 0.2.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.
- package/README.md +33 -29
- package/lib/animation.js +5 -5
- package/lib/animation.js.map +1 -1
- package/lib/classNames.d.ts.map +1 -1
- package/lib/classNames.js +2 -2
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +14 -20
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/binarySearch.js +3 -3
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +9 -12
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +90 -114
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +10 -10
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +15 -6
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +157 -121
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +249 -252
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +2 -3
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +26 -25
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +1 -1
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +26 -42
- package/lib/mouseHandler.js.map +1 -1
- package/lib/mouseUtils.d.ts.map +1 -1
- package/lib/mouseUtils.js +2 -2
- package/lib/mouseUtils.js.map +1 -1
- package/lib/node.d.ts +2 -1
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +36 -35
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
- package/lib/nodeElement/borderDropHint.js +4 -5
- package/lib/nodeElement/borderDropHint.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +7 -4
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +61 -42
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +5 -9
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts +2 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +34 -26
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/nodeUtils.d.ts.map +1 -1
- package/lib/nodeUtils.js +1 -1
- package/lib/nodeUtils.js.map +1 -1
- package/lib/options.d.ts.map +1 -1
- package/lib/positionUtils.js +3 -3
- package/lib/positionUtils.js.map +1 -1
- package/lib/requestUrl.d.ts +1 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +4 -6
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +38 -48
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +9 -11
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +10 -10
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +16 -19
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +11 -17
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/scrollHandler.d.ts.map +1 -1
- package/lib/scrollHandler.js +11 -14
- package/lib/scrollHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +2 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +45 -54
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +23 -28
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/triggerCustomEvent.d.ts.map +1 -1
- package/lib/triggerCustomEvent.js +2 -2
- package/lib/triggerCustomEvent.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +2 -2
- package/lib/util.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -3
- package/src/animation.ts +1 -1
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +68 -71
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +50 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +342 -351
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +59 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +351 -298
- package/src/events.ts +216 -216
- package/src/header.txt +1 -1
- package/src/index.ts +52 -82
- package/src/keyHandler.ts +125 -115
- package/src/methodTypes.ts +4 -7
- package/src/mouseHandler.ts +314 -317
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +761 -766
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +135 -112
- package/src/nodeElement/ghostDropHint.ts +62 -62
- package/src/nodeElement/index.ts +88 -74
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +6 -2
- package/src/requestUrl.ts +3 -3
- package/src/saveStateHandler.ts +204 -206
- package/src/scrollHandler/containerScrollParent.ts +49 -52
- package/src/scrollHandler/createScrollParent.ts +27 -27
- package/src/scrollHandler/documentScrollParent.ts +70 -70
- package/src/scrollHandler/scrollParent.ts +98 -98
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +176 -166
- package/src/setDefaultOptions.ts +25 -22
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -2
- package/src/version.ts +1 -1
- package/tree_element.debug.js +3752 -3784
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
|
@@ -1,62 +1,62 @@
|
|
|
1
1
|
import type { ClassNames } from "../classNames";
|
|
2
2
|
|
|
3
3
|
interface DragElementParams {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
autoEscape: boolean;
|
|
5
|
+
classNames: ClassNames;
|
|
6
|
+
nodeName: string;
|
|
7
|
+
offsetX: number;
|
|
8
|
+
offsetY: number;
|
|
9
|
+
treeElement: HTMLElement;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
class DragElement {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
private element: HTMLElement;
|
|
14
|
+
private offsetX: number;
|
|
15
|
+
private offsetY: number;
|
|
16
|
+
|
|
17
|
+
constructor({
|
|
18
|
+
autoEscape,
|
|
19
|
+
classNames,
|
|
20
|
+
nodeName,
|
|
21
|
+
offsetX,
|
|
22
|
+
offsetY,
|
|
23
|
+
treeElement,
|
|
24
|
+
}: DragElementParams) {
|
|
25
|
+
this.offsetX = offsetX;
|
|
26
|
+
this.offsetY = offsetY;
|
|
27
|
+
|
|
28
|
+
this.element = this.createElement(nodeName, autoEscape, classNames);
|
|
29
|
+
|
|
30
|
+
treeElement.appendChild(this.element);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public move(pageX: number, pageY: number): void {
|
|
34
|
+
this.element.style.left = `${pageX - this.offsetX}px`;
|
|
35
|
+
this.element.style.top = `${pageY - this.offsetY}px`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public remove(): void {
|
|
39
|
+
this.element.remove();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private createElement(
|
|
43
|
+
nodeName: string,
|
|
44
|
+
autoEscape: boolean,
|
|
45
|
+
classNames: ClassNames,
|
|
46
|
+
) {
|
|
47
|
+
const element = document.createElement("span");
|
|
48
|
+
element.classList.add(classNames.title, classNames.dragging);
|
|
49
|
+
|
|
50
|
+
if (autoEscape) {
|
|
51
|
+
element.textContent = nodeName;
|
|
52
|
+
} else {
|
|
53
|
+
element.innerHTML = nodeName;
|
|
31
54
|
}
|
|
32
55
|
|
|
33
|
-
|
|
34
|
-
this.element.style.left = `${pageX - this.offsetX}px`;
|
|
35
|
-
this.element.style.top = `${pageY - this.offsetY}px`;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public remove(): void {
|
|
39
|
-
this.element.remove();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private createElement(
|
|
43
|
-
nodeName: string,
|
|
44
|
-
autoEscape: boolean,
|
|
45
|
-
classNames: ClassNames,
|
|
46
|
-
) {
|
|
47
|
-
const element = document.createElement("span");
|
|
48
|
-
element.classList.add(classNames.title, classNames.dragging);
|
|
56
|
+
element.style.position = "absolute";
|
|
49
57
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
} else {
|
|
53
|
-
element.innerHTML = nodeName;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
element.style.position = "absolute";
|
|
57
|
-
|
|
58
|
-
return element;
|
|
59
|
-
}
|
|
58
|
+
return element;
|
|
59
|
+
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
export default DragElement;
|
|
@@ -5,191 +5,186 @@ import { getOffsetTop } from "../positionUtils";
|
|
|
5
5
|
import iterateVisibleNodes from "./iterateVisibleNodes";
|
|
6
6
|
|
|
7
7
|
interface HitPosition {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
node: Node;
|
|
9
|
+
position: null | Position;
|
|
10
|
+
top: number;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export const generateHitPositions = (
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
tree: Node,
|
|
15
|
+
currentNode: Node,
|
|
16
16
|
): HitPosition[] => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
});
|
|
30
|
-
lastTop = top;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {
|
|
34
|
-
if (node === currentNode || nextNode === currentNode) {
|
|
35
|
-
// Cannot move before or after current item
|
|
36
|
-
addHitPosition(node, null, lastTop);
|
|
37
|
-
} else {
|
|
38
|
-
addHitPosition(node, "after", lastTop);
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const handleClosedFolder = (
|
|
43
|
-
node: Node,
|
|
44
|
-
nextNode: Node | null,
|
|
45
|
-
element: HTMLElement,
|
|
46
|
-
) => {
|
|
47
|
-
const top = getOffsetTop(element);
|
|
48
|
-
|
|
49
|
-
if (node === currentNode) {
|
|
50
|
-
// Cannot move after current item
|
|
51
|
-
addHitPosition(node, null, top);
|
|
52
|
-
} else {
|
|
53
|
-
addHitPosition(node, "inside", top);
|
|
54
|
-
|
|
55
|
-
// Cannot move before current item
|
|
56
|
-
if (nextNode !== currentNode) {
|
|
57
|
-
addHitPosition(node, "after", top);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const handleFirstNode = (node: Node) => {
|
|
63
|
-
if (node !== currentNode && node.element) {
|
|
64
|
-
addHitPosition(node, "before", getOffsetTop(node.element));
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const handleNode = (
|
|
69
|
-
node: Node,
|
|
70
|
-
nextNode: Node | null,
|
|
71
|
-
element: HTMLElement,
|
|
72
|
-
) => {
|
|
73
|
-
const top = getOffsetTop(element);
|
|
74
|
-
|
|
75
|
-
if (node === currentNode) {
|
|
76
|
-
// Cannot move inside current item
|
|
77
|
-
addHitPosition(node, null, top);
|
|
78
|
-
} else {
|
|
79
|
-
addHitPosition(node, "inside", top);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (nextNode === currentNode || node === currentNode) {
|
|
83
|
-
// Cannot move before or after current item
|
|
84
|
-
addHitPosition(node, null, top);
|
|
85
|
-
} else {
|
|
86
|
-
addHitPosition(node, "after", top);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
const handleOpenFolder = (node: Node, element: HTMLElement) => {
|
|
91
|
-
if (node === currentNode) {
|
|
92
|
-
// Cannot move inside current item
|
|
93
|
-
|
|
94
|
-
// Dnd over the current element is not possible: add a position with type None for the top and the bottom.
|
|
95
|
-
const top = getOffsetTop(element);
|
|
96
|
-
const height = element.clientHeight;
|
|
97
|
-
addHitPosition(node, null, top);
|
|
98
|
-
|
|
99
|
-
if (height > 5) {
|
|
100
|
-
// Subtract 5 pixels to allow more space for the next element.
|
|
101
|
-
addHitPosition(node, null, top + height - 5);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Stop iterating
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Cannot move before current item
|
|
109
|
-
if (node.children[0] !== currentNode) {
|
|
110
|
-
addHitPosition(node, "inside", getOffsetTop(element));
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Continue iterating
|
|
114
|
-
return true;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
iterateVisibleNodes(tree, {
|
|
118
|
-
handleAfterOpenFolder,
|
|
119
|
-
handleClosedFolder,
|
|
120
|
-
handleFirstNode,
|
|
121
|
-
handleNode,
|
|
122
|
-
handleOpenFolder,
|
|
17
|
+
const hitPositions: HitPosition[] = [];
|
|
18
|
+
let lastTop = 0;
|
|
19
|
+
|
|
20
|
+
const addHitPosition = (
|
|
21
|
+
node: Node,
|
|
22
|
+
position: null | Position,
|
|
23
|
+
top: number,
|
|
24
|
+
) => {
|
|
25
|
+
hitPositions.push({
|
|
26
|
+
node,
|
|
27
|
+
position,
|
|
28
|
+
top,
|
|
123
29
|
});
|
|
30
|
+
lastTop = top;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {
|
|
34
|
+
if (node === currentNode || nextNode === currentNode) {
|
|
35
|
+
// Cannot move before or after current item
|
|
36
|
+
addHitPosition(node, null, lastTop);
|
|
37
|
+
} else {
|
|
38
|
+
addHitPosition(node, "after", lastTop);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const handleClosedFolder = (
|
|
43
|
+
node: Node,
|
|
44
|
+
nextNode: Node | null,
|
|
45
|
+
element: HTMLElement,
|
|
46
|
+
) => {
|
|
47
|
+
const top = getOffsetTop(element);
|
|
48
|
+
|
|
49
|
+
if (node === currentNode) {
|
|
50
|
+
// Cannot move after current item
|
|
51
|
+
addHitPosition(node, null, top);
|
|
52
|
+
} else {
|
|
53
|
+
addHitPosition(node, "inside", top);
|
|
54
|
+
|
|
55
|
+
// Cannot move before current item
|
|
56
|
+
if (nextNode !== currentNode) {
|
|
57
|
+
addHitPosition(node, "after", top);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
124
61
|
|
|
125
|
-
|
|
126
|
-
|
|
62
|
+
const handleFirstNode = (node: Node) => {
|
|
63
|
+
if (node !== currentNode && node.element) {
|
|
64
|
+
addHitPosition(node, "before", getOffsetTop(node.element));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const handleNode = (
|
|
69
|
+
node: Node,
|
|
70
|
+
nextNode: Node | null,
|
|
71
|
+
element: HTMLElement,
|
|
72
|
+
) => {
|
|
73
|
+
const top = getOffsetTop(element);
|
|
74
|
+
|
|
75
|
+
if (node === currentNode) {
|
|
76
|
+
// Cannot move inside current item
|
|
77
|
+
addHitPosition(node, null, top);
|
|
78
|
+
} else {
|
|
79
|
+
addHitPosition(node, "inside", top);
|
|
80
|
+
}
|
|
127
81
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
82
|
+
if (nextNode === currentNode || node === currentNode) {
|
|
83
|
+
// Cannot move before or after current item
|
|
84
|
+
addHitPosition(node, null, top);
|
|
85
|
+
} else {
|
|
86
|
+
addHitPosition(node, "after", top);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const handleOpenFolder = (node: Node, element: HTMLElement) => {
|
|
91
|
+
if (node === currentNode) {
|
|
92
|
+
// Cannot move inside current item
|
|
136
93
|
|
|
137
|
-
|
|
138
|
-
|
|
94
|
+
// Dnd over the current element is not possible: add a position with type None for the top and the bottom.
|
|
95
|
+
const top = getOffsetTop(element);
|
|
96
|
+
const height = element.clientHeight;
|
|
97
|
+
addHitPosition(node, null, top);
|
|
139
98
|
|
|
140
|
-
|
|
141
|
-
|
|
99
|
+
if (height > 5) {
|
|
100
|
+
// Subtract 5 pixels to allow more space for the next element.
|
|
101
|
+
addHitPosition(node, null, top + height - 5);
|
|
102
|
+
}
|
|
142
103
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
node: position.node,
|
|
147
|
-
position: position.position,
|
|
148
|
-
top: areaTop,
|
|
149
|
-
});
|
|
150
|
-
}
|
|
104
|
+
// Stop iterating
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
151
107
|
|
|
152
|
-
|
|
108
|
+
// Cannot move before current item
|
|
109
|
+
if (node.children[0] !== currentNode) {
|
|
110
|
+
addHitPosition(node, "inside", getOffsetTop(element));
|
|
153
111
|
}
|
|
112
|
+
|
|
113
|
+
// Continue iterating
|
|
114
|
+
return true;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
iterateVisibleNodes(tree, {
|
|
118
|
+
handleAfterOpenFolder,
|
|
119
|
+
handleClosedFolder,
|
|
120
|
+
handleFirstNode,
|
|
121
|
+
handleNode,
|
|
122
|
+
handleOpenFolder,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
return hitPositions;
|
|
154
126
|
};
|
|
155
127
|
|
|
156
|
-
export const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
128
|
+
export const generateHitAreasForGroup = (
|
|
129
|
+
hitAreas: HitArea[],
|
|
130
|
+
positionsInGroup: HitPosition[],
|
|
131
|
+
top: number,
|
|
132
|
+
bottom: number,
|
|
133
|
+
) => {
|
|
134
|
+
// limit positions in group
|
|
135
|
+
const positionCount = Math.min(positionsInGroup.length, 4);
|
|
136
|
+
|
|
137
|
+
const areaHeight = Math.round((bottom - top) / positionCount);
|
|
138
|
+
let areaTop = top;
|
|
139
|
+
|
|
140
|
+
for (let i = 0; i < positionCount; i++) {
|
|
141
|
+
const position = positionsInGroup[i] as HitPosition;
|
|
142
|
+
|
|
143
|
+
if (position.position) {
|
|
144
|
+
hitAreas.push({
|
|
145
|
+
bottom: areaTop + areaHeight,
|
|
146
|
+
node: position.node,
|
|
147
|
+
position: position.position,
|
|
148
|
+
top: areaTop,
|
|
149
|
+
});
|
|
162
150
|
}
|
|
163
151
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
152
|
+
areaTop += areaHeight;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export const generateHitAreasFromPositions = (
|
|
157
|
+
hitPositions: HitPosition[],
|
|
158
|
+
treeBottom: number,
|
|
159
|
+
): HitArea[] => {
|
|
160
|
+
if (!hitPositions.length) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
167
163
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
hitAreas,
|
|
172
|
-
group,
|
|
173
|
-
previousTop,
|
|
174
|
-
position.top,
|
|
175
|
-
);
|
|
164
|
+
let previousTop = (hitPositions[0] as HitPosition).top;
|
|
165
|
+
let group: HitPosition[] = [];
|
|
166
|
+
const hitAreas: HitArea[] = [];
|
|
176
167
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
168
|
+
for (const position of hitPositions) {
|
|
169
|
+
if (position.top !== previousTop && group.length) {
|
|
170
|
+
generateHitAreasForGroup(hitAreas, group, previousTop, position.top);
|
|
180
171
|
|
|
181
|
-
|
|
172
|
+
previousTop = position.top;
|
|
173
|
+
group = [];
|
|
182
174
|
}
|
|
183
175
|
|
|
184
|
-
|
|
176
|
+
group.push(position);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);
|
|
185
180
|
|
|
186
|
-
|
|
181
|
+
return hitAreas;
|
|
187
182
|
};
|
|
188
183
|
|
|
189
184
|
const generateHitAreas = (tree: Node, currentNode: Node, treeBottom: number) =>
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
185
|
+
generateHitAreasFromPositions(
|
|
186
|
+
generateHitPositions(tree, currentNode),
|
|
187
|
+
treeBottom,
|
|
188
|
+
);
|
|
194
189
|
|
|
195
190
|
export default generateHitAreas;
|