@krainovsd/graph 0.9.0 → 0.10.0-rc2
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/lib/cjs/index.cjs +2672 -1803
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/esm/index.js +12 -3
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lib/draw-time.js +5 -1
- package/lib/esm/lib/draw-time.js.map +1 -1
- package/lib/esm/lib/get-controls-info.js +451 -224
- package/lib/esm/lib/get-controls-info.js.map +1 -1
- package/lib/esm/module/GraphCanvas/GraphCanvas.js +44 -934
- package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
- package/lib/esm/module/GraphCanvas/constants/settings.js +70 -47
- package/lib/esm/module/GraphCanvas/constants/settings.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +12 -1
- package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +270 -0
- package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -0
- package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js +2 -2
- package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +19 -4
- package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +29 -4
- package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js +53 -4
- package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +2 -2
- package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js +3 -13
- package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
- package/lib/esm/module/GraphCanvas/slices/draw-links.js +207 -0
- package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +367 -0
- package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -0
- package/lib/esm/module/GraphCanvas/{lib/utils → slices}/draw-text.js +30 -7
- package/lib/esm/module/GraphCanvas/slices/draw-text.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-area.js +31 -0
- package/lib/esm/module/GraphCanvas/slices/init-area.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-dnd.js +62 -0
- package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-draw.js +84 -0
- package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-pointer.js +211 -0
- package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-resize.js +28 -0
- package/lib/esm/module/GraphCanvas/slices/init-resize.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-simulation.js +172 -0
- package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -0
- package/lib/esm/module/GraphCanvas/slices/init-zoom.js +36 -0
- package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -0
- package/lib/index.d.ts +197 -154
- package/package.json +1 -1
- package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js +0 -20
- package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js.map +0 -1
- package/lib/esm/module/GraphCanvas/lib/utils/draw-text.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { COMMON_SETTINGS } from '../../constants/settings.js';
|
|
2
|
+
|
|
3
|
+
function calculateLinkPositionByNode(link, arrowSize = 0) {
|
|
4
|
+
const source = link.source;
|
|
5
|
+
const target = link.target;
|
|
6
|
+
if (typeof source != "object" || typeof target != "object")
|
|
7
|
+
return null;
|
|
8
|
+
const sourcePoint = getLinkPoint({
|
|
9
|
+
arrowSize: 0,
|
|
10
|
+
node: source,
|
|
11
|
+
oppositeNode: target,
|
|
12
|
+
});
|
|
13
|
+
const targetPoint = getLinkPoint({
|
|
14
|
+
arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,
|
|
15
|
+
node: target,
|
|
16
|
+
oppositeNode: source,
|
|
17
|
+
});
|
|
18
|
+
if (!sourcePoint || !targetPoint)
|
|
19
|
+
return null;
|
|
20
|
+
const distance = targetPoint && sourcePoint
|
|
21
|
+
? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)
|
|
22
|
+
: 0;
|
|
23
|
+
return {
|
|
24
|
+
x1: sourcePoint.x,
|
|
25
|
+
y1: sourcePoint.y,
|
|
26
|
+
x2: targetPoint.x,
|
|
27
|
+
y2: targetPoint.y,
|
|
28
|
+
distance,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function getLinkPoint(opts) {
|
|
32
|
+
if (opts.node.x == undefined ||
|
|
33
|
+
opts.node.y == undefined ||
|
|
34
|
+
opts.oppositeNode.x == undefined ||
|
|
35
|
+
opts.oppositeNode.y == undefined)
|
|
36
|
+
return null;
|
|
37
|
+
let nodePoint;
|
|
38
|
+
switch (opts.node._shape) {
|
|
39
|
+
case "circle": {
|
|
40
|
+
nodePoint = getCircleIntersection({
|
|
41
|
+
x: opts.node.x,
|
|
42
|
+
y: opts.node.y,
|
|
43
|
+
radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
|
|
44
|
+
oppositeX: opts.oppositeNode.x,
|
|
45
|
+
oppositeY: opts.oppositeNode.y,
|
|
46
|
+
arrowSize: opts.arrowSize,
|
|
47
|
+
});
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case "square":
|
|
51
|
+
case "text": {
|
|
52
|
+
nodePoint = getRectangleIntersection({
|
|
53
|
+
arrowSize: opts.arrowSize,
|
|
54
|
+
x: opts.node.x,
|
|
55
|
+
y: opts.node.y,
|
|
56
|
+
height: opts.node._height ?? COMMON_SETTINGS.nodeSize,
|
|
57
|
+
width: opts.node._width ?? COMMON_SETTINGS.nodeSize,
|
|
58
|
+
oppositeX: opts.oppositeNode.x,
|
|
59
|
+
oppositeY: opts.oppositeNode.y,
|
|
60
|
+
borderRadius: opts.node._shape === "text" ? 0 : (opts.node._borderRadius ?? 0),
|
|
61
|
+
});
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
default: {
|
|
65
|
+
nodePoint = getCircleIntersection({
|
|
66
|
+
x: opts.node.x,
|
|
67
|
+
y: opts.node.y,
|
|
68
|
+
radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
|
|
69
|
+
oppositeX: opts.oppositeNode.x,
|
|
70
|
+
oppositeY: opts.oppositeNode.y,
|
|
71
|
+
arrowSize: opts.arrowSize,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return nodePoint;
|
|
76
|
+
}
|
|
77
|
+
function getCircleIntersection(opts) {
|
|
78
|
+
const dx = opts.oppositeX - opts.x;
|
|
79
|
+
const dy = opts.oppositeY - opts.y;
|
|
80
|
+
const dr = Math.sqrt(dx * dx + dy * dy);
|
|
81
|
+
const radius = opts.radius + opts.arrowSize;
|
|
82
|
+
return {
|
|
83
|
+
x: opts.x + (dx * radius) / dr,
|
|
84
|
+
y: opts.y + (dy * radius) / dr,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function getRectangleIntersection(opts) {
|
|
88
|
+
const halfWidth = opts.width / 2;
|
|
89
|
+
const halfHeight = opts.height / 2;
|
|
90
|
+
const dx = opts.oppositeX - opts.x;
|
|
91
|
+
const dy = opts.oppositeY - opts.y;
|
|
92
|
+
let relX, relY;
|
|
93
|
+
if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {
|
|
94
|
+
const distToRight = halfWidth - dx;
|
|
95
|
+
const distToLeft = halfWidth + dx;
|
|
96
|
+
const distToTop = halfHeight - dy;
|
|
97
|
+
const distToBottom = halfHeight + dy;
|
|
98
|
+
const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);
|
|
99
|
+
relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;
|
|
100
|
+
relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const absDx = Math.abs(dx);
|
|
104
|
+
const absDy = Math.abs(dy);
|
|
105
|
+
if (halfWidth * absDy < halfHeight * absDx) {
|
|
106
|
+
relX = dx > 0 ? halfWidth : -halfWidth;
|
|
107
|
+
relY = (relX * dy) / dx;
|
|
108
|
+
if (Math.abs(relY) > halfHeight) {
|
|
109
|
+
relY = dy > 0 ? halfHeight : -halfHeight;
|
|
110
|
+
relX = (relY * dx) / dy;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
relY = dy > 0 ? halfHeight : -halfHeight;
|
|
115
|
+
relX = (relY * dx) / dy;
|
|
116
|
+
if (Math.abs(relX) > halfWidth) {
|
|
117
|
+
relX = dx > 0 ? halfWidth : -halfWidth;
|
|
118
|
+
relY = (relX * dy) / dx;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (opts.borderRadius != undefined) {
|
|
123
|
+
const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);
|
|
124
|
+
if (x != undefined)
|
|
125
|
+
relX = x;
|
|
126
|
+
if (y != undefined)
|
|
127
|
+
relY = y;
|
|
128
|
+
}
|
|
129
|
+
if (opts.arrowSize > 0) {
|
|
130
|
+
const edgeDist = Math.sqrt(relX * relX + relY * relY);
|
|
131
|
+
const scale = (edgeDist + opts.arrowSize) / edgeDist;
|
|
132
|
+
relX *= scale;
|
|
133
|
+
relY *= scale;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
x: opts.x + relX,
|
|
137
|
+
y: opts.y + relY,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line no-warning-comments
|
|
141
|
+
// TODO: Need upgrade
|
|
142
|
+
function squareRadiusFix(relX, relY, halfWidth, halfHeight, borderRadius) {
|
|
143
|
+
const epsilon = 1e-6;
|
|
144
|
+
const absX = Math.abs(relX);
|
|
145
|
+
const absY = Math.abs(relY);
|
|
146
|
+
let side = null;
|
|
147
|
+
if (absX >= halfWidth - epsilon) {
|
|
148
|
+
side = relX > 0 ? "right" : "left";
|
|
149
|
+
}
|
|
150
|
+
else if (absY >= halfHeight - epsilon) {
|
|
151
|
+
side = relY > 0 ? "top" : "bottom";
|
|
152
|
+
}
|
|
153
|
+
if (side) {
|
|
154
|
+
const topBound = halfHeight - borderRadius;
|
|
155
|
+
const bottomBound = -topBound;
|
|
156
|
+
const rightBound = halfWidth - borderRadius;
|
|
157
|
+
const leftBound = -rightBound;
|
|
158
|
+
switch (side) {
|
|
159
|
+
case "right":
|
|
160
|
+
if (relY > topBound) {
|
|
161
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "right-top");
|
|
162
|
+
}
|
|
163
|
+
else if (relY < bottomBound) {
|
|
164
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "right-bottom");
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
case "left":
|
|
168
|
+
if (relY > topBound) {
|
|
169
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "left-top");
|
|
170
|
+
}
|
|
171
|
+
else if (relY < bottomBound) {
|
|
172
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "left-bottom");
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case "top":
|
|
176
|
+
if (relX > rightBound) {
|
|
177
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "top-right");
|
|
178
|
+
}
|
|
179
|
+
else if (relX < leftBound) {
|
|
180
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "top-left");
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
case "bottom":
|
|
184
|
+
if (relX > rightBound) {
|
|
185
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "bottom-right");
|
|
186
|
+
}
|
|
187
|
+
else if (relX < leftBound) {
|
|
188
|
+
return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "bottom-left");
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return { x: undefined, y: undefined };
|
|
194
|
+
}
|
|
195
|
+
function checkIntersection(relX, relY, halfWidth, halfHeight, r, corner) {
|
|
196
|
+
const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);
|
|
197
|
+
return intersect ?? { x: undefined, y: undefined };
|
|
198
|
+
}
|
|
199
|
+
function intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner) {
|
|
200
|
+
switch (corner) {
|
|
201
|
+
case "top-right":
|
|
202
|
+
corner = "right-top";
|
|
203
|
+
break;
|
|
204
|
+
case "bottom-right":
|
|
205
|
+
corner = "right-bottom";
|
|
206
|
+
break;
|
|
207
|
+
case "top-left":
|
|
208
|
+
corner = "left-top";
|
|
209
|
+
break;
|
|
210
|
+
case "bottom-left":
|
|
211
|
+
corner = "left-bottom";
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
let cx, cy;
|
|
215
|
+
switch (corner) {
|
|
216
|
+
case "right-top":
|
|
217
|
+
cx = halfWidth - r;
|
|
218
|
+
cy = halfHeight - r;
|
|
219
|
+
break;
|
|
220
|
+
case "right-bottom":
|
|
221
|
+
cx = halfWidth - r;
|
|
222
|
+
cy = -halfHeight + r;
|
|
223
|
+
break;
|
|
224
|
+
case "left-top":
|
|
225
|
+
cx = -halfWidth + r;
|
|
226
|
+
cy = halfHeight - r;
|
|
227
|
+
break;
|
|
228
|
+
case "left-bottom":
|
|
229
|
+
cx = -halfWidth + r;
|
|
230
|
+
cy = -halfHeight + r;
|
|
231
|
+
break;
|
|
232
|
+
default:
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
const a = relX ** 2 + relY ** 2;
|
|
236
|
+
if (a === 0)
|
|
237
|
+
return null;
|
|
238
|
+
const b = -2 * (relX * cx + relY * cy);
|
|
239
|
+
const c = cx ** 2 + cy ** 2 - r ** 2;
|
|
240
|
+
const discriminant = b ** 2 - 4 * a * c;
|
|
241
|
+
if (discriminant < 0)
|
|
242
|
+
return null;
|
|
243
|
+
const sqrtD = Math.sqrt(discriminant);
|
|
244
|
+
const t2 = (-b - sqrtD) / (2 * a);
|
|
245
|
+
const t1 = (-b + sqrtD) / (2 * a);
|
|
246
|
+
const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;
|
|
247
|
+
if (t === null || t >= 1)
|
|
248
|
+
return null;
|
|
249
|
+
const x = t * relX;
|
|
250
|
+
const y = t * relY;
|
|
251
|
+
let valid = false;
|
|
252
|
+
switch (corner) {
|
|
253
|
+
case "right-top":
|
|
254
|
+
valid = x >= cx && y >= cy;
|
|
255
|
+
break;
|
|
256
|
+
case "right-bottom":
|
|
257
|
+
valid = x >= cx && y <= cy;
|
|
258
|
+
break;
|
|
259
|
+
case "left-top":
|
|
260
|
+
valid = x <= cx && y >= cy;
|
|
261
|
+
break;
|
|
262
|
+
case "left-bottom":
|
|
263
|
+
valid = x <= cx && y <= cy;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
return valid ? { x, y } : null;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export { calculateLinkPositionByNode };
|
|
270
|
+
//# sourceMappingURL=calculate-link-position-by-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport type { LinkInterface, NodeInterface } from \"@/types\";\nimport { COMMON_SETTINGS } from \"../../constants\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport function calculateLinkPositionByNode<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(link: LinkInterface<NodeData, LinkData>, arrowSize = 0) {\n const source = link.source;\n const target = link.target;\n\n if (typeof source != \"object\" || typeof target != \"object\") return null;\n\n const sourcePoint = getLinkPoint({\n arrowSize: 0,\n node: source,\n oppositeNode: target,\n });\n const targetPoint = getLinkPoint({\n arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,\n node: target,\n oppositeNode: source,\n });\n\n if (!sourcePoint || !targetPoint) return null;\n\n const distance =\n targetPoint && sourcePoint\n ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)\n : 0;\n\n return {\n x1: sourcePoint.x,\n y1: sourcePoint.y,\n x2: targetPoint.x,\n y2: targetPoint.y,\n distance,\n };\n}\n\ntype GetLinkPointProps<NodeData extends Record<string, unknown>> = {\n arrowSize: number;\n node: NodeInterface<NodeData>;\n oppositeNode: NodeInterface<NodeData>;\n};\nfunction getLinkPoint<NodeData extends Record<string, unknown>>(opts: GetLinkPointProps<NodeData>) {\n if (\n opts.node.x == undefined ||\n opts.node.y == undefined ||\n opts.oppositeNode.x == undefined ||\n opts.oppositeNode.y == undefined\n )\n return null;\n\n let nodePoint: Point;\n switch (opts.node._shape) {\n case \"circle\": {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n break;\n }\n case \"square\":\n case \"text\": {\n nodePoint = getRectangleIntersection({\n arrowSize: opts.arrowSize,\n x: opts.node.x,\n y: opts.node.y,\n height: opts.node._height ?? COMMON_SETTINGS.nodeSize,\n width: opts.node._width ?? COMMON_SETTINGS.nodeSize,\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n borderRadius: opts.node._shape === \"text\" ? 0 : (opts.node._borderRadius ?? 0),\n });\n break;\n }\n default: {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n }\n }\n\n return nodePoint;\n}\n\ntype GetCircleIntersection = {\n x: number;\n y: number;\n radius: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n};\n\nfunction getCircleIntersection(opts: GetCircleIntersection): Point {\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n const dr = Math.sqrt(dx * dx + dy * dy);\n\n const radius = opts.radius + opts.arrowSize;\n\n return {\n x: opts.x + (dx * radius) / dr,\n y: opts.y + (dy * radius) / dr,\n };\n}\n\ntype GetRectangleIntersection = {\n x: number;\n y: number;\n width: number;\n height: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n borderRadius: number;\n};\n\nfunction getRectangleIntersection(opts: GetRectangleIntersection): Point {\n const halfWidth = opts.width / 2;\n const halfHeight = opts.height / 2;\n\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n\n let relX: number, relY: number;\n\n if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {\n const distToRight = halfWidth - dx;\n const distToLeft = halfWidth + dx;\n const distToTop = halfHeight - dy;\n const distToBottom = halfHeight + dy;\n\n const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);\n\n relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;\n relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;\n } else {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (halfWidth * absDy < halfHeight * absDx) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n if (Math.abs(relY) > halfHeight) {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n }\n } else {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n if (Math.abs(relX) > halfWidth) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n }\n }\n }\n\n if (opts.borderRadius != undefined) {\n const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);\n if (x != undefined) relX = x;\n if (y != undefined) relY = y;\n }\n\n if (opts.arrowSize > 0) {\n const edgeDist = Math.sqrt(relX * relX + relY * relY);\n const scale = (edgeDist + opts.arrowSize) / edgeDist;\n relX *= scale;\n relY *= scale;\n }\n\n return {\n x: opts.x + relX,\n y: opts.y + relY,\n };\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Need upgrade\nfunction squareRadiusFix(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const epsilon = 1e-6;\n const absX = Math.abs(relX);\n const absY = Math.abs(relY);\n\n let side: string | null = null;\n if (absX >= halfWidth - epsilon) {\n side = relX > 0 ? \"right\" : \"left\";\n } else if (absY >= halfHeight - epsilon) {\n side = relY > 0 ? \"top\" : \"bottom\";\n }\n\n if (side) {\n const topBound = halfHeight - borderRadius;\n const bottomBound = -topBound;\n const rightBound = halfWidth - borderRadius;\n const leftBound = -rightBound;\n\n switch (side) {\n case \"right\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-bottom\");\n }\n break;\n case \"left\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-bottom\");\n }\n break;\n case \"top\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-left\");\n }\n break;\n case \"bottom\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-left\");\n }\n break;\n default:\n break;\n }\n }\n\n return { x: undefined, y: undefined };\n}\n\nfunction checkIntersection(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner: Parameters<typeof intersectWithCircle>[5],\n) {\n const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);\n\n return intersect ?? { x: undefined, y: undefined };\n}\n\nfunction intersectWithCircle(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner:\n | \"right-top\"\n | \"right-bottom\"\n | \"left-top\"\n | \"left-bottom\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\",\n) {\n switch (corner) {\n case \"top-right\":\n corner = \"right-top\";\n break;\n case \"bottom-right\":\n corner = \"right-bottom\";\n break;\n case \"top-left\":\n corner = \"left-top\";\n break;\n case \"bottom-left\":\n corner = \"left-bottom\";\n break;\n default:\n break;\n }\n\n let cx: number, cy: number;\n switch (corner) {\n case \"right-top\":\n cx = halfWidth - r;\n cy = halfHeight - r;\n break;\n case \"right-bottom\":\n cx = halfWidth - r;\n cy = -halfHeight + r;\n break;\n case \"left-top\":\n cx = -halfWidth + r;\n cy = halfHeight - r;\n break;\n case \"left-bottom\":\n cx = -halfWidth + r;\n cy = -halfHeight + r;\n break;\n default:\n return null;\n }\n\n const a = relX ** 2 + relY ** 2;\n if (a === 0) return null;\n\n const b = -2 * (relX * cx + relY * cy);\n const c = cx ** 2 + cy ** 2 - r ** 2;\n const discriminant = b ** 2 - 4 * a * c;\n\n if (discriminant < 0) return null;\n const sqrtD = Math.sqrt(discriminant);\n\n const t2 = (-b - sqrtD) / (2 * a);\n const t1 = (-b + sqrtD) / (2 * a);\n const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;\n\n if (t === null || t >= 1) return null;\n\n const x = t * relX;\n const y = t * relY;\n\n let valid = false;\n switch (corner) {\n case \"right-top\":\n valid = x >= cx && y >= cy;\n break;\n case \"right-bottom\":\n valid = x >= cx && y <= cy;\n break;\n case \"left-top\":\n valid = x <= cx && y >= cy;\n break;\n case \"left-bottom\":\n valid = x <= cx && y <= cy;\n break;\n default:\n break;\n }\n\n return valid ? { x, y } : null;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { isOverlapsNode } from './is-overlaps-node.js';
|
|
2
2
|
|
|
3
|
-
function dragPlaceCoefficientGetter(node, pointerX, pointerY
|
|
3
|
+
function dragPlaceCoefficientGetter(node, pointerX, pointerY) {
|
|
4
4
|
if (!node.x || !node.y)
|
|
5
5
|
return undefined;
|
|
6
|
-
if (isOverlapsNode(node,
|
|
6
|
+
if (isOverlapsNode(node, pointerX, pointerY, undefined))
|
|
7
7
|
return node.index;
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drag-place-coefficient-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\n\nexport function dragPlaceCoefficientGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n
|
|
1
|
+
{"version":3,"file":"drag-place-coefficient-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\n\nexport function dragPlaceCoefficientGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n): number | undefined {\n if (!node.x || !node.y) return undefined;\n\n if (isOverlapsNode(node, pointerX, pointerY, undefined)) return node.index;\n}\n"],"names":[],"mappings":";;SAGgB,0BAA0B,CACxC,IAA6B,EAC7B,QAAgB,EAChB,QAAgB,EAAA;IAEhB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS;IAExC,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK;AAC5E;;;;"}
|
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
function getParticlePosition(opts) {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
const prevStepDifference = opts.particle.step - (opts.particle.prev?.step ?? 0);
|
|
3
|
+
const nextStepDifference = (opts.particle.next?.step ?? 0) - opts.particle.step;
|
|
4
|
+
const needWait = opts.particle.next &&
|
|
5
|
+
opts.particle.next.step > opts.particle.step &&
|
|
6
|
+
nextStepDifference <= opts.distance;
|
|
7
|
+
const needSpeed = opts.particle.prev &&
|
|
8
|
+
opts.particle.prev.step !== 0 &&
|
|
9
|
+
opts.particle.prev.step < opts.particle.step &&
|
|
10
|
+
prevStepDifference < opts.distance;
|
|
11
|
+
if (opts.particle.step === 0 && needWait) {
|
|
12
|
+
opts.particle.x = undefined;
|
|
13
|
+
opts.particle.y = undefined;
|
|
4
14
|
return;
|
|
5
15
|
}
|
|
6
16
|
const remainingSteps = opts.totalSteps - opts.particle.step;
|
|
7
17
|
const progress = opts.particle.step / opts.totalSteps;
|
|
8
|
-
if (remainingSteps
|
|
18
|
+
if (remainingSteps <= 0) {
|
|
9
19
|
opts.particle.x = opts.xEnd;
|
|
10
20
|
opts.particle.y = opts.yEnd;
|
|
11
21
|
opts.particle.step = 0;
|
|
@@ -17,7 +27,12 @@ function getParticlePosition(opts) {
|
|
|
17
27
|
const newY = opts.yStart + dy * progress;
|
|
18
28
|
opts.particle.x = newX;
|
|
19
29
|
opts.particle.y = newY;
|
|
20
|
-
|
|
30
|
+
if (needSpeed) {
|
|
31
|
+
opts.particle.step += prevStepDifference <= 3 ? prevStepDifference : 3;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
opts.particle.step++;
|
|
35
|
+
}
|
|
21
36
|
}
|
|
22
37
|
|
|
23
38
|
export { getParticlePosition };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { GraphParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: GraphParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n totalSteps: number;\n};\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n
|
|
1
|
+
{"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { GraphParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: GraphParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n totalSteps: number;\n totalCount: number;\n distance: number;\n};\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n const prevStepDifference = opts.particle.step - (opts.particle.prev?.step ?? 0);\n const nextStepDifference = (opts.particle.next?.step ?? 0) - opts.particle.step;\n\n const needWait =\n opts.particle.next &&\n opts.particle.next.step > opts.particle.step &&\n nextStepDifference <= opts.distance;\n const needSpeed =\n opts.particle.prev &&\n opts.particle.prev.step !== 0 &&\n opts.particle.prev.step < opts.particle.step &&\n prevStepDifference < opts.distance;\n\n if (opts.particle.step === 0 && needWait) {\n opts.particle.x = undefined;\n opts.particle.y = undefined;\n\n return;\n }\n\n const remainingSteps = opts.totalSteps - opts.particle.step;\n const progress = opts.particle.step / opts.totalSteps;\n\n if (remainingSteps <= 0) {\n opts.particle.x = opts.xEnd;\n opts.particle.y = opts.yEnd;\n opts.particle.step = 0;\n\n return;\n }\n\n const dx = opts.xEnd - opts.xStart;\n const dy = opts.yEnd - opts.yStart;\n\n const newX = opts.xStart + dx * progress;\n const newY = opts.yStart + dy * progress;\n\n opts.particle.x = newX;\n opts.particle.y = newY;\n\n if (needSpeed) {\n opts.particle.step += prevStepDifference <= 3 ? prevStepDifference : 3;\n } else {\n opts.particle.step++;\n }\n}\n"],"names":[],"mappings":"AAaM,SAAU,mBAAmB,CAAC,IAAgC,EAAA;AAClE,IAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;AAC/E,IAAA,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI;AAE/E,IAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,CAAC,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,kBAAkB,IAAI,IAAI,CAAC,QAAQ;AACrC,IAAA,MAAM,SAAS,GACb,IAAI,CAAC,QAAQ,CAAC,IAAI;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,kBAAkB,GAAG,IAAI,CAAC,QAAQ;IAEpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,EAAE;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;QAE3B;;IAGF,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU;AAErD,IAAA,IAAI,cAAc,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;QAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;QAEtB;;IAGF,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;AAExC,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;AACtB,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;IAEtB,IAAI,SAAS,EAAE;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,kBAAkB,IAAI,CAAC,GAAG,kBAAkB,GAAG,CAAC;;SACjE;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;AAExB;;;;"}
|
|
@@ -1,13 +1,38 @@
|
|
|
1
|
+
import { COMMON_SETTINGS } from '../../constants/settings.js';
|
|
2
|
+
|
|
1
3
|
const ADDITIONAL_VIEWPORT = 10;
|
|
2
4
|
function isNodeVisible(opts) {
|
|
3
5
|
const left = -opts.transform.x / opts.transform.k;
|
|
4
6
|
const right = (opts.width - opts.transform.x) / opts.transform.k;
|
|
5
7
|
const top = -opts.transform.y / opts.transform.k;
|
|
6
8
|
const bottom = (opts.height - opts.transform.y) / opts.transform.k;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
if (opts.node.x == undefined || opts.node.y == undefined)
|
|
10
|
+
return false;
|
|
11
|
+
switch (opts.node._shape) {
|
|
12
|
+
case "circle": {
|
|
13
|
+
const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;
|
|
14
|
+
return (left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&
|
|
15
|
+
opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&
|
|
16
|
+
top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&
|
|
17
|
+
opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom);
|
|
18
|
+
}
|
|
19
|
+
case "square":
|
|
20
|
+
case "text": {
|
|
21
|
+
const width = opts.node._width ?? COMMON_SETTINGS.nodeSize;
|
|
22
|
+
const height = opts.node._height ?? COMMON_SETTINGS.nodeSize;
|
|
23
|
+
return (left < opts.node.x + width + ADDITIONAL_VIEWPORT &&
|
|
24
|
+
opts.node.x - width - ADDITIONAL_VIEWPORT < right &&
|
|
25
|
+
top < opts.node.y + height + ADDITIONAL_VIEWPORT &&
|
|
26
|
+
opts.node.y - height - ADDITIONAL_VIEWPORT < bottom);
|
|
27
|
+
}
|
|
28
|
+
default: {
|
|
29
|
+
const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;
|
|
30
|
+
return (left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&
|
|
31
|
+
opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&
|
|
32
|
+
top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&
|
|
33
|
+
opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
11
36
|
}
|
|
12
37
|
|
|
13
38
|
export { isNodeVisible };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-node-visible.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-node-visible.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\n\ntype IsNodeVisibleOptions = {\n
|
|
1
|
+
{"version":3,"file":"is-node-visible.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-node-visible.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\nimport type { NodeInterface } from \"@/types\";\nimport { COMMON_SETTINGS } from \"../../constants\";\n\ntype IsNodeVisibleOptions<NodeData extends Record<string, unknown>> = {\n width: number;\n height: number;\n transform: ZoomTransform;\n node: NodeInterface<NodeData>;\n};\n\nconst ADDITIONAL_VIEWPORT = 10;\n\nexport function isNodeVisible<NodeData extends Record<string, unknown>>(\n opts: IsNodeVisibleOptions<NodeData>,\n) {\n const left = -opts.transform.x / opts.transform.k;\n const right = (opts.width - opts.transform.x) / opts.transform.k;\n const top = -opts.transform.y / opts.transform.k;\n const bottom = (opts.height - opts.transform.y) / opts.transform.k;\n\n if (opts.node.x == undefined || opts.node.y == undefined) return false;\n\n switch (opts.node._shape) {\n case \"circle\": {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n case \"square\":\n case \"text\": {\n const width = opts.node._width ?? COMMON_SETTINGS.nodeSize;\n const height = opts.node._height ?? COMMON_SETTINGS.nodeSize;\n\n return (\n left < opts.node.x + width + ADDITIONAL_VIEWPORT &&\n opts.node.x - width - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + height + ADDITIONAL_VIEWPORT &&\n opts.node.y - height - ADDITIONAL_VIEWPORT < bottom\n );\n }\n default: {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAWA,MAAM,mBAAmB,GAAG,EAAE;AAExB,SAAU,aAAa,CAC3B,IAAoC,EAAA;AAEpC,IAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,IAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAChE,IAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAElE,IAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS;AAAE,QAAA,OAAO,KAAK;AAEtE,IAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QACtB,KAAK,QAAQ,EAAE;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;AAGvD,QAAA,KAAK,QAAQ;QACb,KAAK,MAAM,EAAE;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,QAAQ;YAE5D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB,GAAG,KAAK;gBACjD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;QAGvD,SAAS;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;;AAI3D;;;;"}
|
|
@@ -1,9 +1,58 @@
|
|
|
1
|
-
function isOverlapsNode(node,
|
|
1
|
+
function isOverlapsNode(node, pointerX, pointerY, radius) {
|
|
2
2
|
if (node.x == undefined || node.y == undefined)
|
|
3
3
|
return false;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
switch (node._shape) {
|
|
5
|
+
case "circle": {
|
|
6
|
+
const nodeRadius = node._radius ?? radius ?? 5;
|
|
7
|
+
const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;
|
|
8
|
+
const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;
|
|
9
|
+
return isOverX && isOverY;
|
|
10
|
+
}
|
|
11
|
+
case "square":
|
|
12
|
+
case "text": {
|
|
13
|
+
const width = node._width ?? 5;
|
|
14
|
+
const height = node._height ?? 5;
|
|
15
|
+
const borderRadius = node._borderRadius ?? 0;
|
|
16
|
+
const overlaps = Math.abs(pointerX - node.x) <= width / 2 && Math.abs(pointerY - node.y) <= height / 2;
|
|
17
|
+
if (node._shape !== "text" && borderRadius != undefined && borderRadius > 0 && overlaps) {
|
|
18
|
+
return isCursorOverRoundedRect(pointerX, pointerY, node.x, node.y, width / 2, height / 2, borderRadius);
|
|
19
|
+
}
|
|
20
|
+
return overlaps;
|
|
21
|
+
}
|
|
22
|
+
default: {
|
|
23
|
+
const nodeRadius = node._radius ?? radius ?? 5;
|
|
24
|
+
const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;
|
|
25
|
+
const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;
|
|
26
|
+
return isOverX && isOverY;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isCursorOverRoundedRect(pointerX, pointerY, x, y, halfWidth, halfHeight, borderRadius) {
|
|
31
|
+
const left = x - halfWidth;
|
|
32
|
+
const right = x + halfWidth;
|
|
33
|
+
const top = y - halfHeight;
|
|
34
|
+
const bottom = y + halfHeight;
|
|
35
|
+
if (pointerX < left + borderRadius && pointerY < top + borderRadius) {
|
|
36
|
+
const dx = pointerX - (left + borderRadius);
|
|
37
|
+
const dy = pointerY - (top + borderRadius);
|
|
38
|
+
return dx * dx + dy * dy <= borderRadius * borderRadius;
|
|
39
|
+
}
|
|
40
|
+
else if (pointerX > right - borderRadius && pointerY < top + borderRadius) {
|
|
41
|
+
const dx = pointerX - (right - borderRadius);
|
|
42
|
+
const dy = pointerY - (top + borderRadius);
|
|
43
|
+
return dx * dx + dy * dy <= borderRadius * borderRadius;
|
|
44
|
+
}
|
|
45
|
+
else if (pointerX < left + borderRadius && pointerY > bottom - borderRadius) {
|
|
46
|
+
const dx = pointerX - (left + borderRadius);
|
|
47
|
+
const dy = pointerY - (bottom - borderRadius);
|
|
48
|
+
return dx * dx + dy * dy <= borderRadius * borderRadius;
|
|
49
|
+
}
|
|
50
|
+
else if (pointerX > right - borderRadius && pointerY > bottom - borderRadius) {
|
|
51
|
+
const dx = pointerX - (right - borderRadius);
|
|
52
|
+
const dy = pointerY - (bottom - borderRadius);
|
|
53
|
+
return dx * dx + dy * dy <= borderRadius * borderRadius;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
7
56
|
}
|
|
8
57
|
|
|
9
58
|
export { isOverlapsNode };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-overlaps-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-overlaps-node.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\n\nexport function isOverlapsNode<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n
|
|
1
|
+
{"version":3,"file":"is-overlaps-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-overlaps-node.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\n\nexport function isOverlapsNode<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n radius: number | undefined,\n) {\n if (node.x == undefined || node.y == undefined) return false;\n\n switch (node._shape) {\n case \"circle\": {\n const nodeRadius = node._radius ?? radius ?? 5;\n const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;\n const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;\n\n return isOverX && isOverY;\n }\n case \"square\":\n case \"text\": {\n const width = node._width ?? 5;\n const height = node._height ?? 5;\n const borderRadius = node._borderRadius ?? 0;\n const overlaps =\n Math.abs(pointerX - node.x) <= width / 2 && Math.abs(pointerY - node.y) <= height / 2;\n\n if (node._shape !== \"text\" && borderRadius != undefined && borderRadius > 0 && overlaps) {\n return isCursorOverRoundedRect(\n pointerX,\n pointerY,\n node.x,\n node.y,\n width / 2,\n height / 2,\n borderRadius,\n );\n }\n\n return overlaps;\n }\n default: {\n const nodeRadius = node._radius ?? radius ?? 5;\n const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;\n const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;\n\n return isOverX && isOverY;\n }\n }\n}\n\nfunction isCursorOverRoundedRect(\n pointerX: number,\n pointerY: number,\n x: number,\n y: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const left = x - halfWidth;\n const right = x + halfWidth;\n const top = y - halfHeight;\n const bottom = y + halfHeight;\n\n if (pointerX < left + borderRadius && pointerY < top + borderRadius) {\n const dx = pointerX - (left + borderRadius);\n const dy = pointerY - (top + borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX > right - borderRadius && pointerY < top + borderRadius) {\n const dx = pointerX - (right - borderRadius);\n const dy = pointerY - (top + borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX < left + borderRadius && pointerY > bottom - borderRadius) {\n const dx = pointerX - (left + borderRadius);\n const dy = pointerY - (bottom - borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX > right - borderRadius && pointerY > bottom - borderRadius) {\n const dx = pointerX - (right - borderRadius);\n const dy = pointerY - (bottom - borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n }\n\n return true;\n}\n"],"names":[],"mappings":"AAEM,SAAU,cAAc,CAC5B,IAA6B,EAC7B,QAAgB,EAChB,QAAgB,EAChB,MAA0B,EAAA;IAE1B,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS;AAAE,QAAA,OAAO,KAAK;AAE5D,IAAA,QAAQ,IAAI,CAAC,MAAM;QACjB,KAAK,QAAQ,EAAE;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,CAAC;AAC9C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU;AAClF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU;YAElF,OAAO,OAAO,IAAI,OAAO;;AAE3B,QAAA,KAAK,QAAQ;QACb,KAAK,MAAM,EAAE;AACX,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC;AAC9B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;AAChC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC;AAC5C,YAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC;AAEvF,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,YAAY,IAAI,SAAS,IAAI,YAAY,GAAG,CAAC,IAAI,QAAQ,EAAE;gBACvF,OAAO,uBAAuB,CAC5B,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,CAAC,EACN,IAAI,CAAC,CAAC,EACN,KAAK,GAAG,CAAC,EACT,MAAM,GAAG,CAAC,EACV,YAAY,CACb;;AAGH,YAAA,OAAO,QAAQ;;QAEjB,SAAS;YACP,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,CAAC;AAC9C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU;AAClF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU;YAElF,OAAO,OAAO,IAAI,OAAO;;;AAG/B;AAEA,SAAS,uBAAuB,CAC9B,QAAgB,EAChB,QAAgB,EAChB,CAAS,EACT,CAAS,EACT,SAAiB,EACjB,UAAkB,EAClB,YAAoB,EAAA;AAEpB,IAAA,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS;AAC1B,IAAA,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS;AAC3B,IAAA,MAAM,GAAG,GAAG,CAAC,GAAG,UAAU;AAC1B,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU;AAE7B,IAAA,IAAI,QAAQ,GAAG,IAAI,GAAG,YAAY,IAAI,QAAQ,GAAG,GAAG,GAAG,YAAY,EAAE;QACnE,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,GAAG,YAAY,CAAC;QAC3C,MAAM,EAAE,GAAG,QAAQ,IAAI,GAAG,GAAG,YAAY,CAAC;QAE1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,GAAG,YAAY;;AAClD,SAAA,IAAI,QAAQ,GAAG,KAAK,GAAG,YAAY,IAAI,QAAQ,GAAG,GAAG,GAAG,YAAY,EAAE;QAC3E,MAAM,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG,YAAY,CAAC;QAC5C,MAAM,EAAE,GAAG,QAAQ,IAAI,GAAG,GAAG,YAAY,CAAC;QAE1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,GAAG,YAAY;;AAClD,SAAA,IAAI,QAAQ,GAAG,IAAI,GAAG,YAAY,IAAI,QAAQ,GAAG,MAAM,GAAG,YAAY,EAAE;QAC7E,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,GAAG,YAAY,CAAC;QAC3C,MAAM,EAAE,GAAG,QAAQ,IAAI,MAAM,GAAG,YAAY,CAAC;QAE7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,GAAG,YAAY;;AAClD,SAAA,IAAI,QAAQ,GAAG,KAAK,GAAG,YAAY,IAAI,QAAQ,GAAG,MAAM,GAAG,YAAY,EAAE;QAC9E,MAAM,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG,YAAY,CAAC;QAC5C,MAAM,EAAE,GAAG,QAAQ,IAAI,MAAM,GAAG,YAAY,CAAC;QAE7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,YAAY,GAAG,YAAY;;AAGzD,IAAA,OAAO,IAAI;AACb;;;;"}
|
|
@@ -3,12 +3,12 @@ import { greatest } from 'd3-array';
|
|
|
3
3
|
import { pointerGetter } from './pointer-getter.js';
|
|
4
4
|
|
|
5
5
|
/* eslint-disable id-length */
|
|
6
|
-
function linkByPointerGetter({ areaRect, areaTransform, mouseEvent, links,
|
|
6
|
+
function linkByPointerGetter({ areaRect, areaTransform, mouseEvent, links, linkSettings, }) {
|
|
7
7
|
if (!areaRect)
|
|
8
8
|
return undefined;
|
|
9
9
|
const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
|
|
10
10
|
return greatest(links, (link) => {
|
|
11
|
-
if (isNearLink(pointerX, pointerY, link,
|
|
11
|
+
if (isNearLink(pointerX, pointerY, link, linkSettings.hoverLinkThreshold))
|
|
12
12
|
return link.index;
|
|
13
13
|
});
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-by-pointer-getter.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { LinkInterface } from \"@/types\";\nimport type {
|
|
1
|
+
{"version":3,"file":"link-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-by-pointer-getter.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { LinkInterface } from \"@/types\";\nimport type { LinkSettingsInterface } from \"../../types\";\nimport { pointerGetter } from \"./pointer-getter\";\n\nexport type LinkByPointerGetterOptions<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> = {\n mouseEvent: MouseEvent | TouchEvent;\n areaRect: DOMRect | undefined;\n areaTransform: ZoomTransform;\n links: LinkInterface<NodeData, LinkData>[];\n linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">;\n};\n\nexport function linkByPointerGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>({\n areaRect,\n areaTransform,\n mouseEvent,\n links,\n linkSettings,\n}: LinkByPointerGetterOptions<NodeData, LinkData>): LinkInterface<NodeData, LinkData> | undefined {\n if (!areaRect) return undefined;\n\n const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);\n\n return greatest(links, (link) => {\n if (isNearLink(pointerX, pointerY, link, linkSettings.hoverLinkThreshold)) return link.index;\n });\n}\n\nfunction isNearLink<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(mouseX: number, mouseY: number, link: LinkInterface<NodeData, LinkData>, threshold = 2) {\n if (!isObject(link.source) || !isObject(link.target)) return false;\n\n const x1 = link.source.x as number;\n const y1 = link.source.y as number;\n const x2 = link.target.x as number;\n const y2 = link.target.y as number;\n\n const distance = distanceToLine(mouseX, mouseY, x1, y1, x2, y2);\n\n return distance <= threshold;\n}\n\nfunction distanceToLine(x: number, y: number, x1: number, y1: number, x2: number, y2: number) {\n const A = x - x1;\n const B = y - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx, yy;\n\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n\n const dx = x - xx;\n const dy = y - yy;\n\n return Math.sqrt(dx * dx + dy * dy);\n}\n"],"names":[],"mappings":";;;;AAAA;AAoBgB,SAAA,mBAAmB,CAGjC,EACA,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,GACmC,EAAA;AAC/C,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,SAAS;AAE/B,IAAA,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC;AAE/E,IAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;QAC9B,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC9F,KAAC,CAAC;AACJ;AAEA,SAAS,UAAU,CAGjB,MAAc,EAAE,MAAc,EAAE,IAAuC,EAAE,SAAS,GAAG,CAAC,EAAA;AACtF,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,KAAK;AAElE,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAElC,IAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAE/D,OAAO,QAAQ,IAAI,SAAS;AAC9B;AAEA,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAA;AAC1F,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AAChB,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AAChB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;AACjB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;IAEjB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3B,IAAA,IAAI,KAAK,GAAG,EAAE;AAEd,IAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,QAAA,KAAK,GAAG,GAAG,GAAG,KAAK;;IAGrB,IAAI,EAAE,EAAE,EAAE;AAEV,IAAA,IAAI,KAAK,GAAG,CAAC,EAAE;QACb,EAAE,GAAG,EAAE;QACP,EAAE,GAAG,EAAE;;AACF,SAAA,IAAI,KAAK,GAAG,CAAC,EAAE;QACpB,EAAE,GAAG,EAAE;QACP,EAAE,GAAG,EAAE;;SACF;AACL,QAAA,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;AACnB,QAAA,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;;AAGrB,IAAA,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;AACjB,IAAA,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;AAEjB,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACrC;;;;"}
|
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
import { greatest } from 'd3-array';
|
|
2
|
-
import { pointerGetter } from './pointer-getter.js';
|
|
3
2
|
import { isOverlapsNode } from './is-overlaps-node.js';
|
|
4
|
-
import '
|
|
5
|
-
import { nodeRadiusGetter } from '../settings/node-settings-getter.js';
|
|
3
|
+
import { pointerGetter } from './pointer-getter.js';
|
|
6
4
|
|
|
7
|
-
function nodeByPointerGetter({ areaRect, areaTransform, mouseEvent, nodes,
|
|
5
|
+
function nodeByPointerGetter({ areaRect, areaTransform, mouseEvent, nodes, }) {
|
|
8
6
|
if (!areaRect)
|
|
9
7
|
return undefined;
|
|
10
8
|
const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
|
|
11
9
|
return greatest(nodes, (node) => {
|
|
12
|
-
|
|
13
|
-
nodeRadiusGetter({
|
|
14
|
-
radiusFlexible: graphSettings.nodeRadiusFlexible,
|
|
15
|
-
radiusInitial: graphSettings.nodeRadiusInitial,
|
|
16
|
-
radiusCoefficient: graphSettings.nodeRadiusCoefficient,
|
|
17
|
-
radiusFactor: graphSettings.nodeRadiusFactor,
|
|
18
|
-
linkCount: node.linkCount,
|
|
19
|
-
});
|
|
20
|
-
if (isOverlapsNode(node, radius, pointerX, pointerY))
|
|
10
|
+
if (isOverlapsNode(node, pointerX, pointerY, undefined))
|
|
21
11
|
return node.index;
|
|
22
12
|
});
|
|
23
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-by-pointer-getter.ts"],"sourcesContent":["import { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { NodeInterface } from \"@/types\";\nimport
|
|
1
|
+
{"version":3,"file":"node-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-by-pointer-getter.ts"],"sourcesContent":["import { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { NodeInterface } from \"@/types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\nimport { pointerGetter } from \"./pointer-getter\";\n\nexport type NodeByPointerGetterOptions<NodeData extends Record<string, unknown>> = {\n mouseEvent: MouseEvent | TouchEvent;\n areaRect: DOMRect | undefined;\n areaTransform: ZoomTransform;\n nodes: NodeInterface<NodeData>[];\n};\n\nexport function nodeByPointerGetter<NodeData extends Record<string, unknown>>({\n areaRect,\n areaTransform,\n mouseEvent,\n nodes,\n}: NodeByPointerGetterOptions<NodeData>): NodeInterface<NodeData> | undefined {\n if (!areaRect) return undefined;\n\n const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);\n\n return greatest(nodes, (node) => {\n if (isOverlapsNode(node, pointerX, pointerY, undefined)) return node.index;\n });\n}\n"],"names":[],"mappings":";;;;AAaM,SAAU,mBAAmB,CAA2C,EAC5E,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,GACgC,EAAA;AACrC,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,SAAS;AAE/B,IAAA,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC;AAE/E,IAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;QAC9B,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC5E,KAAC,CAAC;AACJ;;;;"}
|