@react-fabric/graph 1.0.0-beta.58
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/LICENSE +21 -0
- package/README.md +10 -0
- package/css/styles.css +56 -0
- package/dist/cjs/_virtual/_commonjs-dynamic-modules.js +7 -0
- package/dist/cjs/_virtual/_commonjsHelpers.js +7 -0
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +14 -0
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +9 -0
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +35 -0
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +11 -0
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +20 -0
- package/dist/cjs/_virtual/elk-worker.js +8 -0
- package/dist/cjs/_virtual/elk.bundled.js +5 -0
- package/dist/cjs/node_modules/elkjs/lib/elk.bundled.js +6667 -0
- package/dist/cjs/packages/graph/src/components/Context.js +108 -0
- package/dist/cjs/packages/graph/src/components/ContextMenu.js +134 -0
- package/dist/cjs/packages/graph/src/components/Tools.js +127 -0
- package/dist/cjs/packages/graph/src/components/Viewer.js +57 -0
- package/dist/cjs/packages/graph/src/constants/index.js +16 -0
- package/dist/cjs/packages/graph/src/graph/index.js +425 -0
- package/dist/cjs/packages/graph/src/hooks/sigmaDragSelect.js +169 -0
- package/dist/cjs/packages/graph/src/hooks/sigmaHilighter.js +83 -0
- package/dist/cjs/packages/graph/src/hooks/sigmaMouseActions.js +145 -0
- package/dist/cjs/packages/graph/src/hooks/useGraphology.js +41 -0
- package/dist/cjs/packages/graph/src/hooks/useSigma.js +112 -0
- package/dist/cjs/packages/graph/src/index.js +33 -0
- package/dist/cjs/packages/graph/src/programs/arrow-head/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/arrow-head/index.js +142 -0
- package/dist/cjs/packages/graph/src/programs/arrow-head/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/edge-curve/drawLabel.js +136 -0
- package/dist/cjs/packages/graph/src/programs/edge-curve/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/edge-curve/index.js +157 -0
- package/dist/cjs/packages/graph/src/programs/edge-curve/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/edge-line/drawLabel.js +70 -0
- package/dist/cjs/packages/graph/src/programs/edge-line/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/edge-line/index.js +166 -0
- package/dist/cjs/packages/graph/src/programs/edge-line/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-badge/factory.js +249 -0
- package/dist/cjs/packages/graph/src/programs/node-badge/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-badge/index.js +33 -0
- package/dist/cjs/packages/graph/src/programs/node-badge/texture.js +455 -0
- package/dist/cjs/packages/graph/src/programs/node-badge/vert.glsl.js +19 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/base/drawHover.js +70 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/base/drawLabel.js +112 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/base/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/base/index.js +136 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/base/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-circle/index.js +15 -0
- package/dist/cjs/packages/graph/src/programs/node-image/factory.js +223 -0
- package/dist/cjs/packages/graph/src/programs/node-image/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-image/index.js +14 -0
- package/dist/cjs/packages/graph/src/programs/node-image/texture.js +472 -0
- package/dist/cjs/packages/graph/src/programs/node-image/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/base/drawHover.js +67 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/base/drawLabel.js +106 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/base/frag.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/base/index.js +135 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/base/vert.glsl.js +8 -0
- package/dist/cjs/packages/graph/src/programs/node-rect/index.js +15 -0
- package/dist/esm/_virtual/_commonjs-dynamic-modules.js +7 -0
- package/dist/esm/_virtual/_commonjsHelpers.js +7 -0
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +14 -0
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +9 -0
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +34 -0
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +13 -0
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +20 -0
- package/dist/esm/_virtual/elk-worker.js +8 -0
- package/dist/esm/_virtual/elk.bundled.js +5 -0
- package/dist/esm/node_modules/elkjs/lib/elk.bundled.js +6667 -0
- package/dist/esm/packages/graph/src/components/Context.js +107 -0
- package/dist/esm/packages/graph/src/components/ContextMenu.js +134 -0
- package/dist/esm/packages/graph/src/components/Tools.js +127 -0
- package/dist/esm/packages/graph/src/components/Viewer.js +57 -0
- package/dist/esm/packages/graph/src/constants/index.js +16 -0
- package/dist/esm/packages/graph/src/graph/index.js +425 -0
- package/dist/esm/packages/graph/src/hooks/sigmaDragSelect.js +169 -0
- package/dist/esm/packages/graph/src/hooks/sigmaHilighter.js +83 -0
- package/dist/esm/packages/graph/src/hooks/sigmaMouseActions.js +145 -0
- package/dist/esm/packages/graph/src/hooks/useGraphology.js +41 -0
- package/dist/esm/packages/graph/src/hooks/useSigma.js +112 -0
- package/dist/esm/packages/graph/src/index.js +30 -0
- package/dist/esm/packages/graph/src/programs/arrow-head/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/arrow-head/index.js +141 -0
- package/dist/esm/packages/graph/src/programs/arrow-head/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/edge-curve/drawLabel.js +136 -0
- package/dist/esm/packages/graph/src/programs/edge-curve/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/edge-curve/index.js +156 -0
- package/dist/esm/packages/graph/src/programs/edge-curve/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/edge-line/drawLabel.js +70 -0
- package/dist/esm/packages/graph/src/programs/edge-line/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/edge-line/index.js +166 -0
- package/dist/esm/packages/graph/src/programs/edge-line/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-badge/factory.js +249 -0
- package/dist/esm/packages/graph/src/programs/node-badge/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-badge/index.js +32 -0
- package/dist/esm/packages/graph/src/programs/node-badge/texture.js +445 -0
- package/dist/esm/packages/graph/src/programs/node-badge/vert.glsl.js +19 -0
- package/dist/esm/packages/graph/src/programs/node-circle/base/drawHover.js +70 -0
- package/dist/esm/packages/graph/src/programs/node-circle/base/drawLabel.js +112 -0
- package/dist/esm/packages/graph/src/programs/node-circle/base/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-circle/base/index.js +136 -0
- package/dist/esm/packages/graph/src/programs/node-circle/base/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-circle/index.js +15 -0
- package/dist/esm/packages/graph/src/programs/node-image/factory.js +223 -0
- package/dist/esm/packages/graph/src/programs/node-image/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-image/index.js +13 -0
- package/dist/esm/packages/graph/src/programs/node-image/texture.js +462 -0
- package/dist/esm/packages/graph/src/programs/node-image/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-rect/base/drawHover.js +67 -0
- package/dist/esm/packages/graph/src/programs/node-rect/base/drawLabel.js +106 -0
- package/dist/esm/packages/graph/src/programs/node-rect/base/frag.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-rect/base/index.js +135 -0
- package/dist/esm/packages/graph/src/programs/node-rect/base/vert.glsl.js +8 -0
- package/dist/esm/packages/graph/src/programs/node-rect/index.js +15 -0
- package/dist/types/components/Context.d.ts +18 -0
- package/dist/types/components/ContextMenu.d.ts +1 -0
- package/dist/types/components/Tools.d.ts +1 -0
- package/dist/types/components/Viewer.d.ts +2 -0
- package/dist/types/constants/index.d.ts +12 -0
- package/dist/types/graph/index.d.ts +30 -0
- package/dist/types/graph/layout.worker.d.ts +1 -0
- package/dist/types/hooks/sigmaDragSelect.d.ts +8 -0
- package/dist/types/hooks/sigmaHilighter.d.ts +3 -0
- package/dist/types/hooks/sigmaMouseActions.d.ts +3 -0
- package/dist/types/hooks/useGraphology.d.ts +6 -0
- package/dist/types/hooks/useSigma.d.ts +8 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/programs/arrow-head/frag.glsl.d.ts +2 -0
- package/dist/types/programs/arrow-head/index.d.ts +9 -0
- package/dist/types/programs/arrow-head/vert.glsl.d.ts +2 -0
- package/dist/types/programs/edge-curve/drawLabel.d.ts +6 -0
- package/dist/types/programs/edge-curve/frag.glsl.d.ts +2 -0
- package/dist/types/programs/edge-curve/index.d.ts +43 -0
- package/dist/types/programs/edge-curve/vert.glsl.d.ts +2 -0
- package/dist/types/programs/edge-line/drawLabel.d.ts +5 -0
- package/dist/types/programs/edge-line/frag.glsl.d.ts +2 -0
- package/dist/types/programs/edge-line/index.d.ts +11 -0
- package/dist/types/programs/edge-line/vert.glsl.d.ts +2 -0
- package/dist/types/programs/node-badge/factory.d.ts +27 -0
- package/dist/types/programs/node-badge/frag.glsl.d.ts +2 -0
- package/dist/types/programs/node-badge/index.d.ts +5 -0
- package/dist/types/programs/node-badge/texture.d.ts +102 -0
- package/dist/types/programs/node-badge/vert.glsl.d.ts +2 -0
- package/dist/types/programs/node-circle/base/drawHover.d.ts +8 -0
- package/dist/types/programs/node-circle/base/drawLabel.d.ts +8 -0
- package/dist/types/programs/node-circle/base/frag.glsl.d.ts +2 -0
- package/dist/types/programs/node-circle/base/index.d.ts +37 -0
- package/dist/types/programs/node-circle/base/vert.glsl.d.ts +2 -0
- package/dist/types/programs/node-circle/index.d.ts +11 -0
- package/dist/types/programs/node-image/factory.d.ts +25 -0
- package/dist/types/programs/node-image/frag.glsl.d.ts +2 -0
- package/dist/types/programs/node-image/index.d.ts +5 -0
- package/dist/types/programs/node-image/texture.d.ts +102 -0
- package/dist/types/programs/node-image/vert.glsl.d.ts +2 -0
- package/dist/types/programs/node-rect/base/drawHover.d.ts +8 -0
- package/dist/types/programs/node-rect/base/drawLabel.d.ts +8 -0
- package/dist/types/programs/node-rect/base/frag.glsl.d.ts +2 -0
- package/dist/types/programs/node-rect/base/index.d.ts +34 -0
- package/dist/types/programs/node-rect/base/vert.glsl.d.ts +2 -0
- package/dist/types/programs/node-rect/index.d.ts +11 -0
- package/dist/types/types/index.d.ts +189 -0
- package/package.json +69 -0
- package/src/components/Context.tsx +135 -0
- package/src/components/ContextMenu.tsx +156 -0
- package/src/components/Tools.tsx +107 -0
- package/src/components/Viewer.tsx +75 -0
- package/src/constants/index.ts +22 -0
- package/src/graph/index.ts +428 -0
- package/src/graph/layout.worker.ts +42 -0
- package/src/hooks/sigmaDragSelect.ts +219 -0
- package/src/hooks/sigmaHilighter.ts +107 -0
- package/src/hooks/sigmaMouseActions.ts +153 -0
- package/src/hooks/useGraphology.ts +31 -0
- package/src/hooks/useSigma.ts +118 -0
- package/src/index.ts +34 -0
- package/src/programs/arrow-head/frag.glsl.ts +18 -0
- package/src/programs/arrow-head/index.ts +148 -0
- package/src/programs/arrow-head/vert.glsl.ts +75 -0
- package/src/programs/edge-curve/drawLabel.ts +166 -0
- package/src/programs/edge-curve/frag.glsl.ts +86 -0
- package/src/programs/edge-curve/index.ts +158 -0
- package/src/programs/edge-curve/vert.glsl.ts +110 -0
- package/src/programs/edge-line/drawLabel.ts +113 -0
- package/src/programs/edge-line/frag.glsl.ts +34 -0
- package/src/programs/edge-line/index.ts +165 -0
- package/src/programs/edge-line/vert.glsl.ts +104 -0
- package/src/programs/node-badge/factory.ts +327 -0
- package/src/programs/node-badge/frag.glsl.ts +79 -0
- package/src/programs/node-badge/index.ts +35 -0
- package/src/programs/node-badge/texture.ts +425 -0
- package/src/programs/node-badge/vert.glsl.ts +99 -0
- package/src/programs/node-circle/base/drawHover.ts +80 -0
- package/src/programs/node-circle/base/drawLabel.ts +145 -0
- package/src/programs/node-circle/base/frag.glsl.ts +72 -0
- package/src/programs/node-circle/base/index.ts +102 -0
- package/src/programs/node-circle/base/vert.glsl.ts +83 -0
- package/src/programs/node-circle/index.ts +19 -0
- package/src/programs/node-image/factory.ts +301 -0
- package/src/programs/node-image/frag.glsl.ts +97 -0
- package/src/programs/node-image/index.ts +7 -0
- package/src/programs/node-image/texture.ts +435 -0
- package/src/programs/node-image/vert.glsl.ts +60 -0
- package/src/programs/node-rect/base/drawHover.ts +77 -0
- package/src/programs/node-rect/base/drawLabel.ts +149 -0
- package/src/programs/node-rect/base/frag.glsl.ts +67 -0
- package/src/programs/node-rect/base/index.ts +109 -0
- package/src/programs/node-rect/base/vert.glsl.ts +87 -0
- package/src/programs/node-rect/index.ts +19 -0
- package/src/types/index.ts +210 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
4
|
+
|
|
5
|
+
var attachMouseActions = function attachMouseActions(renderer) {
|
|
6
|
+
var isDragging = false;
|
|
7
|
+
var isDragged = false;
|
|
8
|
+
var startPos = {
|
|
9
|
+
x: 0,
|
|
10
|
+
y: 0
|
|
11
|
+
};
|
|
12
|
+
var draggedNode;
|
|
13
|
+
var handleDrag = function handleDrag(renderer) {
|
|
14
|
+
return function (e) {
|
|
15
|
+
if (!isDragging || !draggedNode) return;
|
|
16
|
+
isDragged = true;
|
|
17
|
+
// Get new position of node
|
|
18
|
+
var pos = renderer.viewportToGraph(e);
|
|
19
|
+
var diff = {
|
|
20
|
+
x: pos.x - startPos.x,
|
|
21
|
+
y: pos.y - startPos.y
|
|
22
|
+
};
|
|
23
|
+
var graph = renderer.getGraph();
|
|
24
|
+
Object.entries(draggedNode).forEach(function (_ref) {
|
|
25
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
26
|
+
node = _ref2[0],
|
|
27
|
+
xy = _ref2[1];
|
|
28
|
+
graph.setNodeAttribute(node, "x", xy.x + diff.x);
|
|
29
|
+
graph.setNodeAttribute(node, "y", xy.y + diff.y);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Prevent sigma to move camera:
|
|
33
|
+
e.preventSigmaDefault();
|
|
34
|
+
e.original.preventDefault();
|
|
35
|
+
e.original.stopPropagation();
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
var stopDragging = function stopDragging(graph) {
|
|
39
|
+
// if (draggedNode) {
|
|
40
|
+
// Object.entries<KeyValue>(draggedNode).forEach(([node, xy]) => {
|
|
41
|
+
// const atts = graph.getNodeAttributes(node);
|
|
42
|
+
// if (atts.isGroup) {
|
|
43
|
+
// const diff = { x: atts.x - xy.x, y: atts.y - xy.y };
|
|
44
|
+
// atts.nodes?.forEach((id: string) => {
|
|
45
|
+
// try {
|
|
46
|
+
// const { x, y } = graph.getNodeAttributes(id);
|
|
47
|
+
// graph.setNodeAttribute(id, "x", x + diff.x);
|
|
48
|
+
// graph.setNodeAttribute(id, "y", y + diff.y);
|
|
49
|
+
// } catch {
|
|
50
|
+
// //
|
|
51
|
+
// }
|
|
52
|
+
// });
|
|
53
|
+
// }
|
|
54
|
+
// });
|
|
55
|
+
// }
|
|
56
|
+
isDragging = false;
|
|
57
|
+
draggedNode = undefined;
|
|
58
|
+
};
|
|
59
|
+
var enableDragging = function enableDragging(renderer) {
|
|
60
|
+
renderer.on("downNode", function (e) {
|
|
61
|
+
if ("button" in e.event.original && e.event.original.button === 0) {
|
|
62
|
+
var graph = renderer.getGraph();
|
|
63
|
+
isDragging = true;
|
|
64
|
+
draggedNode = {};
|
|
65
|
+
var _graph$getNodeAttribu = graph.getNodeAttributes(e.node),
|
|
66
|
+
_graph$getNodeAttribu2 = _graph$getNodeAttribu.x,
|
|
67
|
+
x = _graph$getNodeAttribu2 === void 0 ? 0 : _graph$getNodeAttribu2,
|
|
68
|
+
_graph$getNodeAttribu3 = _graph$getNodeAttribu.y,
|
|
69
|
+
y = _graph$getNodeAttribu3 === void 0 ? 0 : _graph$getNodeAttribu3;
|
|
70
|
+
draggedNode[e.node] = {
|
|
71
|
+
x: x,
|
|
72
|
+
y: y
|
|
73
|
+
};
|
|
74
|
+
startPos = {
|
|
75
|
+
x: x,
|
|
76
|
+
y: y
|
|
77
|
+
};
|
|
78
|
+
graph.forEachNode(function (node, atts) {
|
|
79
|
+
if (atts.selected) {
|
|
80
|
+
draggedNode[node] = {
|
|
81
|
+
x: atts.x,
|
|
82
|
+
y: atts.y
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// On mouse move, if the drag mode is enabled, we change the position of the draggedNode
|
|
90
|
+
renderer.getMouseCaptor().on("mousemovebody", handleDrag(renderer));
|
|
91
|
+
|
|
92
|
+
// On mouse up, we reset the autoscale and the dragging mode
|
|
93
|
+
renderer.getMouseCaptor().on("mouseup", function (e) {
|
|
94
|
+
if (isDragging) {
|
|
95
|
+
stopDragging(renderer.getGraph());
|
|
96
|
+
e.original.preventDefault();
|
|
97
|
+
e.preventSigmaDefault();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Disable the autoscale at the first down interaction
|
|
102
|
+
renderer.getMouseCaptor().on("mousedown", function () {
|
|
103
|
+
if (!renderer.getCustomBBox()) renderer.setCustomBBox(renderer.getBBox());
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
var resetSelection = function resetSelection(graph) {
|
|
107
|
+
graph.forEachNode(function (node, atts) {
|
|
108
|
+
return atts.selected && graph.setNodeAttribute(node, "selected", false);
|
|
109
|
+
});
|
|
110
|
+
graph.forEachEdge(function (node, atts) {
|
|
111
|
+
return atts.selected && graph.setEdgeAttribute(node, "selected", false);
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
var enableSelection = function enableSelection(renderer) {
|
|
115
|
+
renderer.on("downNode", function (e) {
|
|
116
|
+
if ("button" in e.event.original && e.event.original.button === 2) {
|
|
117
|
+
var isSelected = renderer.getGraph().getNodeAttribute(e.node, "selected");
|
|
118
|
+
!isSelected && resetSelection(renderer.getGraph());
|
|
119
|
+
!isSelected && renderer.getGraph().setNodeAttribute(e.node, "selected", true);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
renderer.on("downEdge", function (e) {
|
|
123
|
+
if ("button" in e.event.original && e.event.original.button === 2) {
|
|
124
|
+
var isSelected = renderer.getGraph().getEdgeAttribute(e.edge, "selected");
|
|
125
|
+
!isSelected && resetSelection(renderer.getGraph());
|
|
126
|
+
!isSelected && renderer.getGraph().setEdgeAttribute(e.edge, "selected", true);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
renderer.on("clickNode", function (e) {
|
|
130
|
+
if (!isDragged && "button" in e.event.original && e.event.original.button === 0) {
|
|
131
|
+
var isSelected = renderer.getGraph().getNodeAttribute(e.node, "selected");
|
|
132
|
+
!e.event.original.shiftKey && resetSelection(renderer.getGraph());
|
|
133
|
+
renderer.getGraph().setNodeAttribute(e.node, "selected", !isSelected);
|
|
134
|
+
}
|
|
135
|
+
isDragged = false;
|
|
136
|
+
});
|
|
137
|
+
renderer.on("downStage", function (e) {
|
|
138
|
+
resetSelection(renderer.getGraph());
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
enableSelection(renderer);
|
|
142
|
+
enableDragging(renderer);
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
exports.attachMouseActions = attachMouseActions;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var index = require('../graph/index.js');
|
|
6
|
+
|
|
7
|
+
var useGraphology = function useGraphology(data) {
|
|
8
|
+
var _useState = react.useState(new index.Graph({
|
|
9
|
+
multi: true
|
|
10
|
+
})),
|
|
11
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
12
|
+
graph = _useState2[0],
|
|
13
|
+
setGraph = _useState2[1];
|
|
14
|
+
var _useState3 = react.useState([]),
|
|
15
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
16
|
+
selected = _useState4[0],
|
|
17
|
+
setSelected = _useState4[1];
|
|
18
|
+
react.useEffect(function () {
|
|
19
|
+
if (data instanceof index.Graph) {
|
|
20
|
+
setGraph(data);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
graph.clear();
|
|
24
|
+
data && graph["import"](data, false);
|
|
25
|
+
}, [data]);
|
|
26
|
+
react.useEffect(function () {
|
|
27
|
+
var handler = function handler(nodes) {
|
|
28
|
+
setSelected(nodes);
|
|
29
|
+
};
|
|
30
|
+
graph.on("nodesSelected", handler);
|
|
31
|
+
return function () {
|
|
32
|
+
graph.off("nodesSelected", handler);
|
|
33
|
+
};
|
|
34
|
+
}, [graph]);
|
|
35
|
+
return {
|
|
36
|
+
graph: graph,
|
|
37
|
+
selected: selected
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
exports.useGraphology = useGraphology;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
4
|
+
var core = require('@react-fabric/core');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var Sigma = require('sigma');
|
|
7
|
+
var index$1 = require('../programs/edge-curve/index.js');
|
|
8
|
+
var index = require('../programs/edge-line/index.js');
|
|
9
|
+
var index$3 = require('../programs/node-circle/index.js');
|
|
10
|
+
var index$2 = require('../programs/node-rect/index.js');
|
|
11
|
+
var sigmaHilighter = require('./sigmaHilighter.js');
|
|
12
|
+
var sigmaMouseActions = require('./sigmaMouseActions.js');
|
|
13
|
+
|
|
14
|
+
var useSigma = function useSigma(graph, _nodeReducer, _edgeReducer) {
|
|
15
|
+
var _useState = react.useState(null),
|
|
16
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
17
|
+
containerRef = _useState2[0],
|
|
18
|
+
setContainerRef = _useState2[1];
|
|
19
|
+
var _useState3 = react.useState(null),
|
|
20
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
21
|
+
componentsRef = _useState4[0],
|
|
22
|
+
setComponentsRef = _useState4[1];
|
|
23
|
+
var isDark = core.useIsDark();
|
|
24
|
+
var _useState5 = react.useState(),
|
|
25
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
26
|
+
sigma = _useState6[0],
|
|
27
|
+
updateSigma = _useState6[1];
|
|
28
|
+
react.useEffect(function () {
|
|
29
|
+
if (containerRef) {
|
|
30
|
+
var renderer = new Sigma(graph, containerRef, {
|
|
31
|
+
allowInvalidContainer: true,
|
|
32
|
+
enableEdgeEvents: true,
|
|
33
|
+
renderEdgeLabels: true,
|
|
34
|
+
renderLabels: true,
|
|
35
|
+
labelSize: 14,
|
|
36
|
+
defaultEdgeType: "line",
|
|
37
|
+
defaultNodeType: "circle",
|
|
38
|
+
edgeProgramClasses: {
|
|
39
|
+
line: index.EdgeLineProgram,
|
|
40
|
+
curved: index$1.EdgeCurveProgram
|
|
41
|
+
},
|
|
42
|
+
// for some reason max ratio is min zoom and min ratio is max zoom
|
|
43
|
+
maxCameraRatio: 10,
|
|
44
|
+
minCameraRatio: 0.01,
|
|
45
|
+
nodeProgramClasses: {
|
|
46
|
+
rect: index$2.NodeRectProgram,
|
|
47
|
+
circle: index$3.NodeCircleProgram
|
|
48
|
+
},
|
|
49
|
+
nodeReducer: function nodeReducer(key, data) {
|
|
50
|
+
var _nodeData$size;
|
|
51
|
+
var nodeData = (_nodeReducer === null || _nodeReducer === void 0 ? void 0 : _nodeReducer(data)) || data;
|
|
52
|
+
// Ensure node size is at least 16 for visibility
|
|
53
|
+
if (!nodeData.size && nodeData.weight) {
|
|
54
|
+
nodeData.size = Math.max(16, nodeData.weight * 3);
|
|
55
|
+
}
|
|
56
|
+
if (((_nodeData$size = nodeData.size) !== null && _nodeData$size !== void 0 ? _nodeData$size : 0) < 16) {
|
|
57
|
+
nodeData.size = 16;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ensure node label renderer is called in order to render selected border
|
|
61
|
+
nodeData.label = nodeData.label || "";
|
|
62
|
+
nodeData.id = key;
|
|
63
|
+
return nodeData;
|
|
64
|
+
},
|
|
65
|
+
edgeReducer: function edgeReducer(key, data) {
|
|
66
|
+
var _edgeData$size;
|
|
67
|
+
var edgeData = (_edgeReducer === null || _edgeReducer === void 0 ? void 0 : _edgeReducer(data)) || data;
|
|
68
|
+
// Ensure edge size is at least 0.5 for visibility
|
|
69
|
+
if (!edgeData.size && edgeData.weight) {
|
|
70
|
+
edgeData.size = Math.max(0.5, edgeData.weight * 6);
|
|
71
|
+
}
|
|
72
|
+
if (((_edgeData$size = edgeData.size) !== null && _edgeData$size !== void 0 ? _edgeData$size : 0) < 0.5) {
|
|
73
|
+
edgeData.size = 0.5;
|
|
74
|
+
}
|
|
75
|
+
edgeData.id = key;
|
|
76
|
+
return edgeData;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
sigmaMouseActions.attachMouseActions(renderer);
|
|
80
|
+
sigmaHilighter.attachHighlighter(renderer);
|
|
81
|
+
|
|
82
|
+
// containerRef?.insertBefore(
|
|
83
|
+
// componentsRef,
|
|
84
|
+
// renderer.getCanvases().mouse,
|
|
85
|
+
// );
|
|
86
|
+
|
|
87
|
+
// @ts-expect-error ignore
|
|
88
|
+
window.sigma = renderer;
|
|
89
|
+
updateSigma(renderer);
|
|
90
|
+
return function () {
|
|
91
|
+
renderer.kill();
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}, [graph, containerRef, componentsRef]);
|
|
95
|
+
react.useEffect(function () {
|
|
96
|
+
sigma === null || sigma === void 0 || sigma.setSettings({
|
|
97
|
+
defaultNodeColor: isDark ? "#000" : "#fff",
|
|
98
|
+
defaultEdgeColor: isDark ? "#fff" : "#000",
|
|
99
|
+
labelColor: {
|
|
100
|
+
color: isDark ? "#fff" : "#000",
|
|
101
|
+
attribute: "labelColor"
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}, [isDark, sigma]);
|
|
105
|
+
return {
|
|
106
|
+
instance: sigma,
|
|
107
|
+
containerRef: setContainerRef,
|
|
108
|
+
componentsRef: setComponentsRef
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
exports.useSigma = useSigma;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Viewer = require('./components/Viewer.js');
|
|
4
|
+
var index = require('./graph/index.js');
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* React Fabric
|
|
8
|
+
* @version: 1.0.0
|
|
9
|
+
*
|
|
10
|
+
*
|
|
11
|
+
* The MIT License (MIT)
|
|
12
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
13
|
+
*
|
|
14
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
15
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
16
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
17
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
18
|
+
* subject to the following conditions:
|
|
19
|
+
*
|
|
20
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
21
|
+
* portions of the Software.
|
|
22
|
+
*
|
|
23
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
24
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
25
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
26
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
// @ts-expect-error ignore
|
|
30
|
+
window.__GRAPH_LAYOUT_DURATION_MULTIPLIER__ = 10;
|
|
31
|
+
|
|
32
|
+
exports.SigmaGraph = Viewer.SigmaGraph;
|
|
33
|
+
exports.Graph = index.Graph;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* istanbul ignore file */
|
|
4
|
+
|
|
5
|
+
// language=GLSL
|
|
6
|
+
var SHADER_SOURCE = /*glsl*/"\nprecision mediump float;\n\nvarying vec4 v_color;\nvarying float v_opacity;\n\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\n\nvoid main(void) {\n gl_FragColor = v_color;\n gl_FragColor = mix(transparent, gl_FragColor, v_opacity);\n}\n";
|
|
7
|
+
|
|
8
|
+
module.exports = SHADER_SOURCE;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
|
|
4
|
+
var _createClass = require('@babel/runtime/helpers/createClass');
|
|
5
|
+
var _possibleConstructorReturn = require('@babel/runtime/helpers/possibleConstructorReturn');
|
|
6
|
+
var _getPrototypeOf = require('@babel/runtime/helpers/getPrototypeOf');
|
|
7
|
+
var _inherits = require('@babel/runtime/helpers/inherits');
|
|
8
|
+
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
9
|
+
var rendering = require('sigma/rendering');
|
|
10
|
+
var utils = require('sigma/utils');
|
|
11
|
+
var frag_glsl = require('./frag.glsl.js');
|
|
12
|
+
var vert_glsl = require('./vert.glsl.js');
|
|
13
|
+
|
|
14
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
15
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
16
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
18
|
+
var _WebGLRenderingContex = WebGLRenderingContext,
|
|
19
|
+
UNSIGNED_BYTE = _WebGLRenderingContex.UNSIGNED_BYTE,
|
|
20
|
+
FLOAT = _WebGLRenderingContex.FLOAT;
|
|
21
|
+
var UNIFORMS = ["u_matrix", "u_sizeRatio", "u_correctionRatio", "u_minEdgeThickness", "u_lengthToThicknessRatio", "u_widenessToThicknessRatio"];
|
|
22
|
+
var DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS = {
|
|
23
|
+
extremity: "target",
|
|
24
|
+
lengthToThicknessRatio: 2.5,
|
|
25
|
+
widenessToThicknessRatio: 2
|
|
26
|
+
};
|
|
27
|
+
function createEdgeArrowHeadProgram(inputOptions) {
|
|
28
|
+
var options = _objectSpread(_objectSpread({}, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS), inputOptions || {});
|
|
29
|
+
return /*#__PURE__*/function (_EdgeProgram) {
|
|
30
|
+
function EdgeArrowHeadProgram() {
|
|
31
|
+
_classCallCheck(this, EdgeArrowHeadProgram);
|
|
32
|
+
return _callSuper(this, EdgeArrowHeadProgram, arguments);
|
|
33
|
+
}
|
|
34
|
+
_inherits(EdgeArrowHeadProgram, _EdgeProgram);
|
|
35
|
+
return _createClass(EdgeArrowHeadProgram, [{
|
|
36
|
+
key: "getDefinition",
|
|
37
|
+
value: function getDefinition() {
|
|
38
|
+
return {
|
|
39
|
+
VERTICES: 3,
|
|
40
|
+
VERTEX_SHADER_SOURCE: vert_glsl,
|
|
41
|
+
FRAGMENT_SHADER_SOURCE: frag_glsl,
|
|
42
|
+
METHOD: WebGLRenderingContext.TRIANGLES,
|
|
43
|
+
UNIFORMS: UNIFORMS,
|
|
44
|
+
ATTRIBUTES: [{
|
|
45
|
+
name: "a_position",
|
|
46
|
+
size: 2,
|
|
47
|
+
type: FLOAT
|
|
48
|
+
}, {
|
|
49
|
+
name: "a_normal",
|
|
50
|
+
size: 2,
|
|
51
|
+
type: FLOAT
|
|
52
|
+
}, {
|
|
53
|
+
name: "a_radius",
|
|
54
|
+
size: 1,
|
|
55
|
+
type: FLOAT
|
|
56
|
+
}, {
|
|
57
|
+
name: "a_color",
|
|
58
|
+
size: 4,
|
|
59
|
+
type: UNSIGNED_BYTE,
|
|
60
|
+
normalized: true
|
|
61
|
+
}, {
|
|
62
|
+
name: "a_opacity",
|
|
63
|
+
size: 1,
|
|
64
|
+
type: FLOAT
|
|
65
|
+
}, {
|
|
66
|
+
name: "a_id",
|
|
67
|
+
size: 4,
|
|
68
|
+
type: UNSIGNED_BYTE,
|
|
69
|
+
normalized: true
|
|
70
|
+
}],
|
|
71
|
+
CONSTANT_ATTRIBUTES: [{
|
|
72
|
+
name: "a_barycentric",
|
|
73
|
+
size: 3,
|
|
74
|
+
type: FLOAT
|
|
75
|
+
}],
|
|
76
|
+
CONSTANT_DATA: [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}, {
|
|
80
|
+
key: "processVisibleItem",
|
|
81
|
+
value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {
|
|
82
|
+
var _data$arrow, _data$opacity;
|
|
83
|
+
if (options.extremity === "source") {
|
|
84
|
+
var _ref = [targetData, sourceData];
|
|
85
|
+
sourceData = _ref[0];
|
|
86
|
+
targetData = _ref[1];
|
|
87
|
+
}
|
|
88
|
+
var thickness = Math.min(data.size || 1, 0.5) * 8;
|
|
89
|
+
var radius = targetData.size || 1;
|
|
90
|
+
var x1 = sourceData.x;
|
|
91
|
+
var y1 = sourceData.y;
|
|
92
|
+
var x2 = targetData.x;
|
|
93
|
+
var y2 = targetData.y;
|
|
94
|
+
var color = data.color;
|
|
95
|
+
if (data.selected) color = "#f00";
|
|
96
|
+
if (data.highlight) color = "#F54A4A";
|
|
97
|
+
|
|
98
|
+
// Computing normals
|
|
99
|
+
var dx = x2 - x1;
|
|
100
|
+
var dy = y2 - y1;
|
|
101
|
+
var len = dx * dx + dy * dy;
|
|
102
|
+
var n1 = 0;
|
|
103
|
+
var n2 = 0;
|
|
104
|
+
if (len) {
|
|
105
|
+
len = 1 / Math.sqrt(len);
|
|
106
|
+
n1 = -dy * len * thickness;
|
|
107
|
+
n2 = dx * len * thickness;
|
|
108
|
+
}
|
|
109
|
+
var array = this.array;
|
|
110
|
+
array[startIndex++] = x2;
|
|
111
|
+
array[startIndex++] = y2;
|
|
112
|
+
array[startIndex++] = -n1;
|
|
113
|
+
array[startIndex++] = -n2;
|
|
114
|
+
array[startIndex++] = radius;
|
|
115
|
+
array[startIndex++] = utils.floatColor(color);
|
|
116
|
+
array[startIndex++] = ["both", options.extremity].includes((_data$arrow = data.arrow) !== null && _data$arrow !== void 0 ? _data$arrow : "") ? (_data$opacity = data.opacity) !== null && _data$opacity !== void 0 ? _data$opacity : 1 : 0;
|
|
117
|
+
array[startIndex++] = edgeIndex;
|
|
118
|
+
}
|
|
119
|
+
}, {
|
|
120
|
+
key: "setUniforms",
|
|
121
|
+
value: function setUniforms(params, _ref2) {
|
|
122
|
+
var gl = _ref2.gl,
|
|
123
|
+
uniformLocations = _ref2.uniformLocations;
|
|
124
|
+
var u_matrix = uniformLocations.u_matrix,
|
|
125
|
+
u_sizeRatio = uniformLocations.u_sizeRatio,
|
|
126
|
+
u_correctionRatio = uniformLocations.u_correctionRatio,
|
|
127
|
+
u_minEdgeThickness = uniformLocations.u_minEdgeThickness,
|
|
128
|
+
u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio,
|
|
129
|
+
u_widenessToThicknessRatio = uniformLocations.u_widenessToThicknessRatio;
|
|
130
|
+
gl.uniformMatrix3fv(u_matrix, false, params.matrix);
|
|
131
|
+
gl.uniform1f(u_sizeRatio, params.sizeRatio);
|
|
132
|
+
gl.uniform1f(u_correctionRatio, params.correctionRatio);
|
|
133
|
+
gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);
|
|
134
|
+
gl.uniform1f(u_lengthToThicknessRatio, 2.5);
|
|
135
|
+
gl.uniform1f(u_widenessToThicknessRatio, 2);
|
|
136
|
+
}
|
|
137
|
+
}]);
|
|
138
|
+
}(rendering.EdgeProgram);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
exports.DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS = DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS;
|
|
142
|
+
exports.createEdgeArrowHeadProgram = createEdgeArrowHeadProgram;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* istanbul ignore file */
|
|
4
|
+
|
|
5
|
+
// language=GLSL
|
|
6
|
+
var SHADER_SOURCE = /*glsl*/"\nattribute vec2 a_position;\nattribute vec2 a_normal;\nattribute float a_radius;\nattribute vec3 a_barycentric;\nattribute float a_opacity;\n\n#ifdef PICKING_MODE\nattribute vec4 a_id;\n#else\nattribute vec4 a_color;\n#endif\n\nuniform mat3 u_matrix;\nuniform float u_sizeRatio;\nuniform float u_correctionRatio;\nuniform float u_minEdgeThickness;\nuniform float u_lengthToThicknessRatio;\nuniform float u_widenessToThicknessRatio;\n\nvarying vec4 v_color;\nvarying float v_opacity;\n\nconst float bias = 255.0 / 254.0;\n\nvoid main() {\n float minThickness = u_minEdgeThickness;\n\n float normalLength = length(a_normal);\n vec2 unitNormal = a_normal / normalLength;\n\n // These first computations are taken from edge.vert.glsl and\n // edge.clamped.vert.glsl. Please read it to get better comments on what's\n // happening:\n float pixelsThickness = max(normalLength / u_sizeRatio, minThickness);\n float webGLThickness = pixelsThickness * u_correctionRatio;\n float webGLNodeRadius = a_radius * 2.0 * u_correctionRatio / u_sizeRatio;\n float webGLArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\n float webGLArrowHeadThickness = webGLThickness * u_widenessToThicknessRatio;\n\n float da = a_barycentric.x;\n float db = a_barycentric.y;\n float dc = a_barycentric.z;\n\n vec2 delta = vec2(\n da * (webGLNodeRadius * unitNormal.y)\n + db * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y + webGLArrowHeadThickness * unitNormal.x)\n + dc * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y - webGLArrowHeadThickness * unitNormal.x),\n\n da * (-webGLNodeRadius * unitNormal.x)\n + db * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x + webGLArrowHeadThickness * unitNormal.y)\n + dc * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x - webGLArrowHeadThickness * unitNormal.y)\n );\n\n vec2 position = (u_matrix * vec3(a_position + delta, 1)).xy;\n\n gl_Position = vec4(position, 0, 1);\n\n #ifdef PICKING_MODE\n // For picking mode, we use the ID as the color:\n v_color = a_id;\n #else\n // For normal mode, we use the color:\n v_color = a_color;\n v_opacity = a_opacity;\n #endif\n\n v_color.a *= bias;\n}\n";
|
|
7
|
+
|
|
8
|
+
module.exports = SHADER_SOURCE;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* istanbul ignore file */
|
|
4
|
+
|
|
5
|
+
function getCurvePoint(t, p0, p1, p2) {
|
|
6
|
+
var x = Math.pow(1 - t, 2) * p0.x + 2 * (1 - t) * t * p1.x + Math.pow(t, 2) * p2.x;
|
|
7
|
+
var y = Math.pow(1 - t, 2) * p0.y + 2 * (1 - t) * t * p1.y + Math.pow(t, 2) * p2.y;
|
|
8
|
+
return {
|
|
9
|
+
x: x,
|
|
10
|
+
y: y
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function getCurveLength(p0, p1, p2) {
|
|
14
|
+
var steps = 20;
|
|
15
|
+
var length = 0;
|
|
16
|
+
var lastPoint = p0;
|
|
17
|
+
for (var i = 0; i < steps; i++) {
|
|
18
|
+
var point = getCurvePoint((i + 1) / steps, p0, p1, p2);
|
|
19
|
+
length += Math.sqrt(Math.pow(lastPoint.x - point.x, 2) + Math.pow(lastPoint.y - point.y, 2));
|
|
20
|
+
lastPoint = point;
|
|
21
|
+
}
|
|
22
|
+
return length;
|
|
23
|
+
}
|
|
24
|
+
function createDrawCurvedEdgeLabel(_ref) {
|
|
25
|
+
var curvatureAttribute = _ref.curvatureAttribute,
|
|
26
|
+
defaultCurvature = _ref.defaultCurvature,
|
|
27
|
+
_ref$keepLabelUpright = _ref.keepLabelUpright,
|
|
28
|
+
keepLabelUpright = _ref$keepLabelUpright === void 0 ? true : _ref$keepLabelUpright;
|
|
29
|
+
return function (context, edgeData, sourceData, targetData, settings) {
|
|
30
|
+
var _edgeData$color;
|
|
31
|
+
var size = settings.edgeLabelSize;
|
|
32
|
+
var curvature = edgeData[curvatureAttribute] || defaultCurvature;
|
|
33
|
+
var font = settings.edgeLabelFont;
|
|
34
|
+
var weight = settings.edgeLabelWeight;
|
|
35
|
+
var color = (_edgeData$color = edgeData.color) !== null && _edgeData$color !== void 0 ? _edgeData$color : settings.defaultEdgeColor;
|
|
36
|
+
if (edgeData.selected) color = "#f00";
|
|
37
|
+
if (edgeData.highlight) color = "#F54A4A";
|
|
38
|
+
var label = edgeData.label;
|
|
39
|
+
if (!label || edgeData.opacity < 1) return;
|
|
40
|
+
context.font = "".concat(weight, " ").concat(size, "px ").concat(font);
|
|
41
|
+
|
|
42
|
+
// Computing positions without considering nodes sizes:
|
|
43
|
+
var ltr = !keepLabelUpright || sourceData.x < targetData.x;
|
|
44
|
+
var sourceX = ltr ? sourceData.x : targetData.x;
|
|
45
|
+
var sourceY = ltr ? sourceData.y : targetData.y;
|
|
46
|
+
var targetX = ltr ? targetData.x : sourceData.x;
|
|
47
|
+
var targetY = ltr ? targetData.y : sourceData.y;
|
|
48
|
+
var centerX = (sourceX + targetX) / 2;
|
|
49
|
+
var centerY = (sourceY + targetY) / 2;
|
|
50
|
+
var diffX = targetX - sourceX;
|
|
51
|
+
var diffY = targetY - sourceY;
|
|
52
|
+
var diff = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2));
|
|
53
|
+
// Anchor point:
|
|
54
|
+
var orientation = ltr ? 1 : -1;
|
|
55
|
+
var anchorX = centerX + diffY * curvature * orientation;
|
|
56
|
+
var anchorY = centerY - diffX * curvature * orientation;
|
|
57
|
+
|
|
58
|
+
// Adapt curve points to edge thickness:
|
|
59
|
+
var offset = edgeData.size * 0.7 + 5;
|
|
60
|
+
var sourceOffsetVector = {
|
|
61
|
+
x: anchorY - sourceY,
|
|
62
|
+
y: -(anchorX - sourceX)
|
|
63
|
+
};
|
|
64
|
+
var sourceOffsetVectorLength = Math.sqrt(Math.pow(sourceOffsetVector.x, 2) + Math.pow(sourceOffsetVector.y, 2));
|
|
65
|
+
var targetOffsetVector = {
|
|
66
|
+
x: targetY - anchorY,
|
|
67
|
+
y: -(targetX - anchorX)
|
|
68
|
+
};
|
|
69
|
+
var targetOffsetVectorLength = Math.sqrt(Math.pow(targetOffsetVector.x, 2) + Math.pow(targetOffsetVector.y, 2));
|
|
70
|
+
sourceX += offset * sourceOffsetVector.x / sourceOffsetVectorLength;
|
|
71
|
+
sourceY += offset * sourceOffsetVector.y / sourceOffsetVectorLength;
|
|
72
|
+
targetX += offset * targetOffsetVector.x / targetOffsetVectorLength;
|
|
73
|
+
targetY += offset * targetOffsetVector.y / targetOffsetVectorLength;
|
|
74
|
+
// For anchor, the vector is simpler, so it is inlined:
|
|
75
|
+
anchorX += offset * diffY / diff;
|
|
76
|
+
anchorY -= offset * diffX / diff;
|
|
77
|
+
|
|
78
|
+
// Compute curve length:
|
|
79
|
+
var anchorPoint = {
|
|
80
|
+
x: anchorX,
|
|
81
|
+
y: anchorY
|
|
82
|
+
};
|
|
83
|
+
var sourcePoint = {
|
|
84
|
+
x: sourceX,
|
|
85
|
+
y: sourceY
|
|
86
|
+
};
|
|
87
|
+
var targetPoint = {
|
|
88
|
+
x: targetX,
|
|
89
|
+
y: targetY
|
|
90
|
+
};
|
|
91
|
+
var curveLength = getCurveLength(sourcePoint, anchorPoint, targetPoint);
|
|
92
|
+
if (curveLength < sourceData.size + targetData.size) return;
|
|
93
|
+
|
|
94
|
+
// Handling ellipsis
|
|
95
|
+
var textLength = context.measureText(label).width;
|
|
96
|
+
var availableTextLength = curveLength - sourceData.size - targetData.size;
|
|
97
|
+
if (textLength > availableTextLength) {
|
|
98
|
+
var ellipsis = "…";
|
|
99
|
+
label = label + ellipsis;
|
|
100
|
+
textLength = context.measureText(label).width;
|
|
101
|
+
while (textLength > availableTextLength && label.length > 1) {
|
|
102
|
+
label = label.slice(0, -2) + ellipsis;
|
|
103
|
+
textLength = context.measureText(label).width;
|
|
104
|
+
}
|
|
105
|
+
if (label.length < 4) return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Measure each character:
|
|
109
|
+
var charactersLengthCache = {};
|
|
110
|
+
for (var i = 0, length = label.length; i < length; i++) {
|
|
111
|
+
var character = label[i];
|
|
112
|
+
if (!charactersLengthCache[character]) {
|
|
113
|
+
charactersLengthCache[character] = context.measureText(character).width * (1 + curvature * 0.35);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Draw each character:
|
|
118
|
+
var t = 0.5 - textLength / curveLength / 2;
|
|
119
|
+
for (var _i = 0, _length = label.length; _i < _length; _i++) {
|
|
120
|
+
var _character = label[_i];
|
|
121
|
+
var point = getCurvePoint(t, sourcePoint, anchorPoint, targetPoint);
|
|
122
|
+
var tangentX = 2 * (1 - t) * (anchorX - sourceX) + 2 * t * (targetX - anchorX);
|
|
123
|
+
var tangentY = 2 * (1 - t) * (anchorY - sourceY) + 2 * t * (targetY - anchorY);
|
|
124
|
+
var angle = Math.atan2(tangentY, tangentX);
|
|
125
|
+
context.save();
|
|
126
|
+
context.translate(point.x, point.y);
|
|
127
|
+
context.rotate(angle);
|
|
128
|
+
context.fillStyle = color;
|
|
129
|
+
context.fillText(_character, 0, 0);
|
|
130
|
+
context.restore();
|
|
131
|
+
t += charactersLengthCache[_character] / curveLength;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
exports.createDrawCurvedEdgeLabel = createDrawCurvedEdgeLabel;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* istanbul ignore file */
|
|
4
|
+
|
|
5
|
+
// language=GLSL
|
|
6
|
+
var SHADER = /* glsl */"\nprecision highp float;\n\nvarying vec4 v_color;\nvarying float v_opacity;\nvarying float v_thickness;\nvarying float v_feather;\nvarying vec2 v_cpA;\nvarying vec2 v_cpB;\nvarying vec2 v_cpC;\nvarying float v_sourceSize;\nvarying vec2 v_sourcePoint;\nvarying float v_targetSize;\nvarying vec2 v_targetPoint;\n\nuniform float u_lengthToThicknessRatio;\nuniform float u_widenessToThicknessRatio;\n\nfloat det(vec2 a, vec2 b) {\n return a.x * b.y - b.x * a.y;\n}\n\nvec2 getDistanceVector(vec2 b0, vec2 b1, vec2 b2) {\n float a = det(b0, b2), b = 2.0 * det(b1, b0), d = 2.0 * det(b2, b1);\n float f = b * d - a * a;\n vec2 d21 = b2 - b1, d10 = b1 - b0, d20 = b2 - b0;\n vec2 gf = 2.0 * (b * d21 + d * d10 + a * d20);\n gf = vec2(gf.y, -gf.x);\n vec2 pp = -f * gf / dot(gf, gf);\n vec2 d0p = b0 - pp;\n float ap = det(d0p, d20), bp = 2.0 * det(d10, d0p);\n float t = clamp((ap + bp) / (2.0 * a + b + d), 0.0, 1.0);\n return mix(mix(b0, b1, t), mix(b1, b2, t), t);\n}\n\nfloat distToQuadraticBezierCurve(vec2 p, vec2 b0, vec2 b1, vec2 b2) {\n return length(getDistanceVector(b0 - p, b1 - p, b2 - p));\n}\n\nconst float epsilon = 0.7;\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\n\nvoid main(void) {\n float dist = distToQuadraticBezierCurve(gl_FragCoord.xy, v_cpA, v_cpB, v_cpC);\n float thickness = v_thickness;\n\n if(v_sourceSize > 0.0) {\n float distToSource = length(gl_FragCoord.xy - v_sourcePoint);\n float sourceArrowLength = v_sourceSize + (thickness) * u_lengthToThicknessRatio;\n if (distToSource < sourceArrowLength) {\n thickness = (distToSource - v_sourceSize) / (sourceArrowLength - v_sourceSize) * u_widenessToThicknessRatio * thickness;\n }\n }\n\n if(v_targetSize > 0.0) {\n float distToTarget = length(gl_FragCoord.xy - v_targetPoint);\n float targetArrowLength = v_targetSize + (thickness) * u_lengthToThicknessRatio;\n if (distToTarget < targetArrowLength) {\n thickness = (distToTarget - v_targetSize) / (targetArrowLength - v_targetSize) * u_widenessToThicknessRatio * thickness;\n }\n }\n\n float halfThickness = thickness / 2.0;\n if (dist < halfThickness) {\n #ifdef PICKING_MODE\n gl_FragColor = v_color;\n #else\n float t = smoothstep(\n halfThickness - v_feather,\n halfThickness,\n dist\n );\n\n gl_FragColor = mix(v_color, transparent, t);\n gl_FragColor = mix(transparent, gl_FragColor, v_opacity);\n #endif\n } else {\n gl_FragColor = transparent;\n }\n}\n";
|
|
7
|
+
|
|
8
|
+
module.exports = SHADER;
|