@deck.gl-community/graph-layers 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/dist/core/base-layout.d.ts +71 -0
  4. package/dist/core/base-layout.js +133 -0
  5. package/dist/core/cache.d.ts +14 -0
  6. package/dist/core/cache.js +26 -0
  7. package/dist/core/constants.d.ts +101 -0
  8. package/dist/core/constants.js +48 -0
  9. package/dist/core/edge.d.ts +86 -0
  10. package/dist/core/edge.js +121 -0
  11. package/dist/core/graph-engine.d.ts +54 -0
  12. package/dist/core/graph-engine.js +128 -0
  13. package/dist/core/graph.d.ts +155 -0
  14. package/dist/core/graph.js +301 -0
  15. package/dist/core/interaction-manager.d.ts +40 -0
  16. package/dist/core/interaction-manager.js +169 -0
  17. package/dist/core/node.d.ts +103 -0
  18. package/dist/core/node.js +177 -0
  19. package/dist/index.cjs +3540 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.js +28 -0
  23. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  24. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
  25. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  26. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
  27. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
  31. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
  32. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
  33. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
  34. package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
  35. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
  36. package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
  37. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
  38. package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
  39. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
  40. package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
  41. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
  42. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
  43. package/dist/layers/edge-layer.d.ts +25 -0
  44. package/dist/layers/edge-layer.js +75 -0
  45. package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
  46. package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
  47. package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
  48. package/dist/layers/edge-layers/edge-label-layer.js +42 -0
  49. package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
  50. package/dist/layers/edge-layers/flow-layer.js +28 -0
  51. package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
  52. package/dist/layers/edge-layers/path-edge-layer.js +27 -0
  53. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
  54. package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
  55. package/dist/layers/graph-layer.d.ts +32 -0
  56. package/dist/layers/graph-layer.js +193 -0
  57. package/dist/layers/node-layers/circle-layer.d.ts +6 -0
  58. package/dist/layers/node-layers/circle-layer.js +23 -0
  59. package/dist/layers/node-layers/image-layer.d.ts +6 -0
  60. package/dist/layers/node-layers/image-layer.js +23 -0
  61. package/dist/layers/node-layers/label-layer.d.ts +6 -0
  62. package/dist/layers/node-layers/label-layer.js +23 -0
  63. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
  64. package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
  65. package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
  66. package/dist/layers/node-layers/rectangle-layer.js +49 -0
  67. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  68. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
  69. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
  70. package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
  71. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
  72. package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
  73. package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
  74. package/dist/layouts/d3-force/d3-force-layout.js +116 -0
  75. package/dist/layouts/d3-force/worker.d.ts +0 -0
  76. package/dist/layouts/d3-force/worker.js +46 -0
  77. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
  78. package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
  79. package/dist/layouts/gpu-force/worker.d.ts +0 -0
  80. package/dist/layouts/gpu-force/worker.js +116 -0
  81. package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
  82. package/dist/layouts/simple-layout/simple-layout.js +64 -0
  83. package/dist/loaders/edge-parsers.d.ts +6 -0
  84. package/dist/loaders/edge-parsers.js +17 -0
  85. package/dist/loaders/json-loader.d.ts +7 -0
  86. package/dist/loaders/json-loader.js +16 -0
  87. package/dist/loaders/node-parsers.d.ts +3 -0
  88. package/dist/loaders/node-parsers.js +11 -0
  89. package/dist/style/style-property.d.ts +14 -0
  90. package/dist/style/style-property.js +195 -0
  91. package/dist/style/style-sheet.d.ts +10 -0
  92. package/dist/style/style-sheet.js +252 -0
  93. package/dist/utils/create-graph.d.ts +8 -0
  94. package/dist/utils/create-graph.js +33 -0
  95. package/dist/utils/layer-utils.d.ts +1 -0
  96. package/dist/utils/layer-utils.js +20 -0
  97. package/dist/utils/log.d.ts +2 -0
  98. package/dist/utils/log.js +6 -0
  99. package/dist/utils/polygon-calculations.d.ts +1 -0
  100. package/dist/utils/polygon-calculations.js +102 -0
  101. package/package.json +55 -0
  102. package/src/core/base-layout.ts +154 -0
  103. package/src/core/cache.ts +31 -0
  104. package/src/core/constants.ts +58 -0
  105. package/src/core/edge.ts +145 -0
  106. package/src/core/graph-engine.ts +170 -0
  107. package/src/core/graph.ts +342 -0
  108. package/src/core/interaction-manager.ts +225 -0
  109. package/src/core/node.ts +205 -0
  110. package/src/index.ts +42 -0
  111. package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
  112. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
  113. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
  114. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
  115. package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
  116. package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
  117. package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
  118. package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
  119. package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
  120. package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
  121. package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
  122. package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
  123. package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
  124. package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
  125. package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
  126. package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
  127. package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
  128. package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
  129. package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
  130. package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
  131. package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
  132. package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
  133. package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
  134. package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
  135. package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
  136. package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
  137. package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
  138. package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
  139. package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
  140. package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
  141. package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
  142. package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
  143. package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
  144. package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
  145. package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
  146. package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
  147. package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
  148. package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
  149. package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
  150. package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
  151. package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
  152. package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
  153. package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
  154. package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
  155. package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
  156. package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
  157. package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
  158. package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
  159. package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
  160. package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
  161. package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
  162. package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
  163. package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
  164. package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
  165. package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
  166. package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
  167. package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
  168. package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
  169. package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
  170. package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
  171. package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
  172. package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
  173. package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
  174. package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
  175. package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
  176. package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
  177. package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
  178. package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
  179. package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
  180. package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
  181. package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
  182. package/src/layers/edge-layer.ts +88 -0
  183. package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
  184. package/src/layers/edge-layers/edge-label-layer.ts +48 -0
  185. package/src/layers/edge-layers/flow-layer.ts +34 -0
  186. package/src/layers/edge-layers/path-edge-layer.ts +39 -0
  187. package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
  188. package/src/layers/graph-layer.ts +225 -0
  189. package/src/layers/node-layers/circle-layer.ts +29 -0
  190. package/src/layers/node-layers/image-layer.ts +29 -0
  191. package/src/layers/node-layers/label-layer.ts +29 -0
  192. package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
  193. package/src/layers/node-layers/rectangle-layer.ts +58 -0
  194. package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
  195. package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
  196. package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
  197. package/src/layouts/d3-force/d3-force-layout.ts +145 -0
  198. package/src/layouts/d3-force/worker.ts +61 -0
  199. package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
  200. package/src/layouts/gpu-force/worker.ts +137 -0
  201. package/src/layouts/simple-layout/simple-layout.ts +87 -0
  202. package/src/loaders/edge-parsers.ts +21 -0
  203. package/src/loaders/json-loader.ts +19 -0
  204. package/src/loaders/node-parsers.ts +13 -0
  205. package/src/style/style-property.ts +229 -0
  206. package/src/style/style-sheet.ts +277 -0
  207. package/src/utils/create-graph.ts +38 -0
  208. package/src/utils/layer-utils.ts +23 -0
  209. package/src/utils/log.ts +9 -0
  210. package/src/utils/polygon-calculations.ts +154 -0
@@ -0,0 +1,69 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { ScatterplotLayer, LineLayer } from '@deck.gl/layers';
6
+ import { SplineLayer } from '../common-layers/spline-layer/spline-layer';
7
+ const DEBUG = false;
8
+ export class CurvedEdgeLayer extends CompositeLayer {
9
+ static layerName = 'CurvedEdgeLayer';
10
+ // @ts-expect-error TODO
11
+ renderLayers() {
12
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
13
+ return [
14
+ DEBUG &&
15
+ new ScatterplotLayer(this.getSubLayerProps({
16
+ id: '__control-points',
17
+ data,
18
+ getPosition: (e) => getLayoutInfo(e).controlPoints[0],
19
+ getColor: (d) => [190, 190, 190, 150],
20
+ getRadius: (d) => 5,
21
+ updateTriggers: {
22
+ getPosition: positionUpdateTrigger
23
+ },
24
+ ...otherProps
25
+ })),
26
+ DEBUG &&
27
+ new LineLayer(this.getSubLayerProps({
28
+ id: '__first_segment',
29
+ data,
30
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
31
+ getTargetPosition: (e) => getLayoutInfo(e).controlPoints[0],
32
+ getColor: (e) => [210, 210, 210, 150],
33
+ updateTriggers: {
34
+ getSourcePosition: positionUpdateTrigger,
35
+ getTargetPosition: positionUpdateTrigger
36
+ },
37
+ ...otherProps
38
+ })),
39
+ DEBUG &&
40
+ new LineLayer(this.getSubLayerProps({
41
+ id: '__last_segment',
42
+ data,
43
+ getSourcePosition: (e) => getLayoutInfo(e).controlPoints[0],
44
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
45
+ getColor: (e) => [210, 210, 210, 150],
46
+ updateTriggers: {
47
+ getSourcePosition: positionUpdateTrigger,
48
+ getTargetPosition: positionUpdateTrigger
49
+ },
50
+ ...otherProps
51
+ })),
52
+ new SplineLayer(this.getSubLayerProps({
53
+ id: '__spline_layer',
54
+ data,
55
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
56
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
57
+ getControlPoints: (e) => getLayoutInfo(e).controlPoints,
58
+ updateTriggers: {
59
+ getSourcePosition: positionUpdateTrigger,
60
+ getTargetPosition: positionUpdateTrigger,
61
+ getControlPoints: positionUpdateTrigger,
62
+ getColor: colorUpdateTrigger,
63
+ getWidth: widthUpdateTrigger
64
+ },
65
+ ...otherProps
66
+ }))
67
+ ];
68
+ }
69
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';
3
+ export declare class EdgeLabelLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): ZoomableTextLayer[];
6
+ }
@@ -0,0 +1,42 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';
6
+ export class EdgeLabelLayer extends CompositeLayer {
7
+ static layerName = 'EdgeLabelLayer';
8
+ renderLayers() {
9
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
10
+ return [
11
+ new ZoomableTextLayer(this.getSubLayerProps({
12
+ id: 'edge-label-layer',
13
+ data,
14
+ getPosition: (e) => {
15
+ const { sourcePosition, targetPosition, controlPoints = [] } = getLayoutInfo(e);
16
+ // consider all the points on this edge
17
+ const allPoints = [sourcePosition, targetPosition, ...controlPoints];
18
+ const sumX = allPoints.reduce((res, p) => res + p[0], 0);
19
+ const sumY = allPoints.reduce((res, p) => res + p[1], 0);
20
+ // find the centroid of those points
21
+ return [sumX / allPoints.length, sumY / allPoints.length];
22
+ },
23
+ getAngle: (e) => {
24
+ const { sourcePosition, targetPosition } = getLayoutInfo(e);
25
+ // sort the nodes from left to right
26
+ const [newSourcePosition, newTargetPosition] = sourcePosition[0] < targetPosition[0]
27
+ ? [sourcePosition, targetPosition]
28
+ : [targetPosition, sourcePosition];
29
+ // angle in degrees
30
+ const deltaX = newTargetPosition[0] - newSourcePosition[0];
31
+ const deltaY = newTargetPosition[1] - newSourcePosition[1];
32
+ return (Math.atan2(deltaY, deltaX) * -180) / Math.PI;
33
+ },
34
+ ...stylesheet.getDeckGLAccessors(),
35
+ updateTriggers: {
36
+ ...stylesheet.getDeckGLUpdateTriggers(),
37
+ getPosition: positionUpdateTrigger
38
+ }
39
+ }))
40
+ ];
41
+ }
42
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { FlowPathLayer } from '../common-layers/flow-path-layer/flow-path-layer';
3
+ export declare class FlowLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): FlowPathLayer[];
6
+ }
@@ -0,0 +1,28 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { FlowPathLayer } from '../common-layers/flow-path-layer/flow-path-layer';
6
+ export class FlowLayer extends CompositeLayer {
7
+ static layerName = 'FlowLayer';
8
+ renderLayers() {
9
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
10
+ return [
11
+ new FlowPathLayer(this.getSubLayerProps({
12
+ id: '__flow-layer',
13
+ data,
14
+ ...stylesheet.getDeckGLAccessors(),
15
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
16
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
17
+ parameters: {
18
+ depthTest: false
19
+ },
20
+ updateTriggers: {
21
+ ...stylesheet.getDeckGLUpdateTriggers(),
22
+ getSourcePosition: positionUpdateTrigger,
23
+ getTargetPosition: positionUpdateTrigger
24
+ }
25
+ }))
26
+ ];
27
+ }
28
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { PathLayer } from '@deck.gl/layers';
3
+ export declare class PathEdgeLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): PathLayer<any, {}>[];
6
+ }
@@ -0,0 +1,27 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { PathLayer } from '@deck.gl/layers';
6
+ export class PathEdgeLayer extends CompositeLayer {
7
+ static layerName = 'PathEdgeLayer';
8
+ renderLayers() {
9
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
10
+ return [
11
+ new PathLayer(this.getSubLayerProps({
12
+ id: '__line-layer',
13
+ data,
14
+ getPath: (e) => {
15
+ const { sourcePosition, targetPosition, controlPoints } = getLayoutInfo(e);
16
+ return [sourcePosition, ...controlPoints, targetPosition];
17
+ },
18
+ updateTriggers: {
19
+ getColor: colorUpdateTrigger,
20
+ getPath: positionUpdateTrigger,
21
+ getWidth: widthUpdateTrigger
22
+ },
23
+ ...otherProps
24
+ }))
25
+ ];
26
+ }
27
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { LineLayer } from '@deck.gl/layers';
3
+ export declare class StraightLineEdgeLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): LineLayer<any, {}>[];
6
+ }
@@ -0,0 +1,26 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { LineLayer } from '@deck.gl/layers';
6
+ export class StraightLineEdgeLayer extends CompositeLayer {
7
+ static layerName = 'StraightLineEdgeLayer';
8
+ renderLayers() {
9
+ const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
10
+ return [
11
+ new LineLayer(this.getSubLayerProps({
12
+ id: '__line-layer',
13
+ data,
14
+ getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
15
+ getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
16
+ updateTriggers: {
17
+ getColor: colorUpdateTrigger,
18
+ getSourcePosition: positionUpdateTrigger,
19
+ getTargetPosition: positionUpdateTrigger,
20
+ getWidth: widthUpdateTrigger
21
+ },
22
+ ...otherProps
23
+ }))
24
+ ];
25
+ }
26
+ }
@@ -0,0 +1,32 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { CircleLayer } from './node-layers/circle-layer';
3
+ import { ImageLayer } from './node-layers/image-layer';
4
+ import { LabelLayer } from './node-layers/label-layer';
5
+ import { RectangleLayer } from './node-layers/rectangle-layer';
6
+ import { ZoomableMarkerLayer } from './node-layers/zoomable-marker-layer';
7
+ import { EdgeLayer } from './edge-layer';
8
+ import { EdgeLabelLayer } from './edge-layers/edge-label-layer';
9
+ import { FlowLayer } from './edge-layers/flow-layer';
10
+ export declare class GraphLayer extends CompositeLayer {
11
+ static defaultProps: {
12
+ pickable: boolean;
13
+ };
14
+ forceUpdate: () => void;
15
+ constructor(props: any);
16
+ initializeState(): void;
17
+ shouldUpdateState({ changeFlags }: {
18
+ changeFlags: any;
19
+ }): any;
20
+ updateState({ props }: {
21
+ props: any;
22
+ }): void;
23
+ finalize(): void;
24
+ createNodeLayers(): (CircleLayer | ImageLayer | LabelLayer | RectangleLayer | ZoomableMarkerLayer)[];
25
+ createEdgeLayers(): (EdgeLayer | (EdgeLabelLayer | FlowLayer)[])[];
26
+ onClick(info: any, event: any): boolean;
27
+ onHover(info: any, event: any): boolean;
28
+ onDragStart(info: any, event: any): void;
29
+ onDrag(info: any, event: any): void;
30
+ onDragEnd(info: any, event: any): void;
31
+ renderLayers(): ((EdgeLayer | (EdgeLabelLayer | FlowLayer)[])[] | (CircleLayer | ImageLayer | LabelLayer | RectangleLayer | ZoomableMarkerLayer)[])[];
32
+ }
@@ -0,0 +1,193 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { COORDINATE_SYSTEM, CompositeLayer } from '@deck.gl/core';
5
+ import { Stylesheet } from '../style/style-sheet';
6
+ import { NODE_TYPE, EDGE_DECORATOR_TYPE } from '../core/constants';
7
+ import { mixedGetPosition } from '../utils/layer-utils';
8
+ import { InteractionManager } from '../core/interaction-manager';
9
+ import { log } from '../utils/log';
10
+ // node layers
11
+ import { CircleLayer } from './node-layers/circle-layer';
12
+ import { ImageLayer } from './node-layers/image-layer';
13
+ import { LabelLayer } from './node-layers/label-layer';
14
+ import { RectangleLayer } from './node-layers/rectangle-layer';
15
+ import { RoundedRectangleLayer } from './node-layers/rounded-rectangle-layer';
16
+ import { PathBasedRoundedRectangleLayer } from './node-layers/path-rounded-rectange-layer';
17
+ import { ZoomableMarkerLayer } from './node-layers/zoomable-marker-layer';
18
+ // edge layers
19
+ import { EdgeLayer } from './edge-layer';
20
+ import { EdgeLabelLayer } from './edge-layers/edge-label-layer';
21
+ import { FlowLayer } from './edge-layers/flow-layer';
22
+ const NODE_LAYER_MAP = {
23
+ [NODE_TYPE.RECTANGLE]: RectangleLayer,
24
+ [NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,
25
+ [NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,
26
+ [NODE_TYPE.ICON]: ImageLayer,
27
+ [NODE_TYPE.CIRCLE]: CircleLayer,
28
+ [NODE_TYPE.LABEL]: LabelLayer,
29
+ [NODE_TYPE.MARKER]: ZoomableMarkerLayer
30
+ };
31
+ const EDGE_DECORATOR_LAYER_MAP = {
32
+ [EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,
33
+ [EDGE_DECORATOR_TYPE.FLOW]: FlowLayer
34
+ };
35
+ const SHARED_LAYER_PROPS = {
36
+ coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
37
+ parameters: {
38
+ depthTest: false
39
+ }
40
+ };
41
+ const defaultProps = {
42
+ // an array of styles for layers
43
+ nodeStyle: [],
44
+ nodeEvents: {
45
+ onMouseLeave: () => { },
46
+ onHover: () => { },
47
+ onMouseEnter: () => { },
48
+ onClick: () => { },
49
+ onDrag: () => { }
50
+ },
51
+ edgeStyle: {
52
+ color: 'black',
53
+ strokeWidth: 1,
54
+ // an array of styles for layers
55
+ decorators: []
56
+ },
57
+ edgeEvents: {
58
+ onClick: () => { },
59
+ onHover: () => { }
60
+ },
61
+ enableDragging: false
62
+ };
63
+ export class GraphLayer extends CompositeLayer {
64
+ static defaultProps = {
65
+ pickable: true
66
+ };
67
+ forceUpdate = () => {
68
+ if (this.context && this.context.layerManager) {
69
+ this.setNeedsUpdate();
70
+ this.setChangeFlags({ dataChanged: true }); // TODO
71
+ }
72
+ };
73
+ constructor(props) {
74
+ super(props);
75
+ // added or removed a node, or in general something layout related changed
76
+ props.engine.addEventListener('onLayoutChange', this.forceUpdate);
77
+ }
78
+ initializeState() {
79
+ const interactionManager = new InteractionManager(this.props, () => this.forceUpdate());
80
+ this.state = { interactionManager };
81
+ }
82
+ shouldUpdateState({ changeFlags }) {
83
+ return changeFlags.dataChanged || changeFlags.propsChanged;
84
+ }
85
+ updateState({ props }) {
86
+ this.state.interactionManager.updateProps(props);
87
+ }
88
+ finalize() {
89
+ this.props.engine.removeEventListener('onLayoutChange', this.forceUpdate);
90
+ }
91
+ createNodeLayers() {
92
+ const { engine, nodeStyle } = this.props;
93
+ if (!nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {
94
+ return [];
95
+ }
96
+ return nodeStyle.filter(Boolean).map((style, idx) => {
97
+ const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;
98
+ const LayerType = NODE_LAYER_MAP[style.type];
99
+ if (!LayerType) {
100
+ log.error(`Invalid node type: ${style.type}`)();
101
+ throw new Error(`Invalid node type: ${style.type}`);
102
+ }
103
+ const stylesheet = new Stylesheet(restStyle, {
104
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
105
+ });
106
+ const getOffset = stylesheet.getDeckGLAccessor('getOffset');
107
+ return new LayerType({
108
+ ...SHARED_LAYER_PROPS,
109
+ id: `node-rule-${idx}`,
110
+ data: data(engine.getNodes()),
111
+ getPosition: mixedGetPosition(engine.getNodePosition, getOffset),
112
+ pickable,
113
+ positionUpdateTrigger: [
114
+ engine.getLayoutLastUpdate(),
115
+ engine.getLayoutState(),
116
+ stylesheet.getDeckGLAccessorUpdateTrigger('getOffset')
117
+ ].join(),
118
+ stylesheet,
119
+ visible
120
+ });
121
+ });
122
+ }
123
+ createEdgeLayers() {
124
+ const { edgeStyle, engine } = this.props;
125
+ if (!edgeStyle) {
126
+ return [];
127
+ }
128
+ return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle])
129
+ .filter(Boolean)
130
+ .flatMap((style, idx) => {
131
+ const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;
132
+ const stylesheet = new Stylesheet({
133
+ type: 'Edge',
134
+ ...restEdgeStyle
135
+ }, {
136
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
137
+ });
138
+ const edgeLayer = new EdgeLayer({
139
+ ...SHARED_LAYER_PROPS,
140
+ id: `edge-layer-${idx}`,
141
+ data: data(engine.getEdges()),
142
+ getLayoutInfo: engine.getEdgePosition,
143
+ pickable: true,
144
+ positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
145
+ stylesheet,
146
+ visible
147
+ });
148
+ if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {
149
+ return edgeLayer;
150
+ }
151
+ const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {
152
+ const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
153
+ if (!DecoratorLayer) {
154
+ log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();
155
+ throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);
156
+ }
157
+ const decoratorStylesheet = new Stylesheet(decoratorStyle, {
158
+ stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
159
+ });
160
+ return new DecoratorLayer({
161
+ ...SHARED_LAYER_PROPS,
162
+ id: `edge-decorator-${idx2}`,
163
+ data: data(engine.getEdges()),
164
+ getLayoutInfo: engine.getEdgePosition,
165
+ pickable: true,
166
+ positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
167
+ stylesheet: decoratorStylesheet
168
+ });
169
+ });
170
+ return [edgeLayer, decoratorLayers];
171
+ });
172
+ }
173
+ onClick(info, event) {
174
+ return this.state.interactionManager.onClick(info, event) || false;
175
+ }
176
+ onHover(info, event) {
177
+ return this.state.interactionManager.onHover(info, event) || false;
178
+ }
179
+ onDragStart(info, event) {
180
+ this.state.interactionManager.onDragStart(info, event);
181
+ }
182
+ onDrag(info, event) {
183
+ this.state.interactionManager.onDrag(info, event);
184
+ }
185
+ onDragEnd(info, event) {
186
+ this.state.interactionManager.onDragEnd(info, event);
187
+ }
188
+ renderLayers() {
189
+ return [this.createEdgeLayers(), this.createNodeLayers()];
190
+ }
191
+ }
192
+ GraphLayer.layerName = 'GraphLayer';
193
+ GraphLayer.defaultProps = defaultProps;
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { ScatterplotLayer } from '@deck.gl/layers';
3
+ export declare class CircleLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): ScatterplotLayer<any, {}>[];
6
+ }
@@ -0,0 +1,23 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { ScatterplotLayer } from '@deck.gl/layers';
6
+ export class CircleLayer extends CompositeLayer {
7
+ static layerName = 'CircleLayer';
8
+ renderLayers() {
9
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
10
+ return [
11
+ new ScatterplotLayer(this.getSubLayerProps({
12
+ id: '__scatterplot-layer',
13
+ data,
14
+ getPosition,
15
+ ...stylesheet.getDeckGLAccessors(),
16
+ updateTriggers: {
17
+ getPosition: positionUpdateTrigger,
18
+ ...stylesheet.getDeckGLUpdateTriggers()
19
+ }
20
+ }))
21
+ ];
22
+ }
23
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { IconLayer } from '@deck.gl/layers';
3
+ export declare class ImageLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): IconLayer<any, {}>[];
6
+ }
@@ -0,0 +1,23 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { IconLayer } from '@deck.gl/layers';
6
+ export class ImageLayer extends CompositeLayer {
7
+ static layerName = 'ImageLayer';
8
+ renderLayers() {
9
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
10
+ return [
11
+ new IconLayer(this.getSubLayerProps({
12
+ id: '__icon-layer',
13
+ data,
14
+ getPosition,
15
+ ...stylesheet.getDeckGLAccessors(),
16
+ updateTriggers: {
17
+ getPosition: positionUpdateTrigger,
18
+ ...stylesheet.getDeckGLUpdateTriggers()
19
+ }
20
+ }))
21
+ ];
22
+ }
23
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';
3
+ export declare class LabelLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): ZoomableTextLayer[];
6
+ }
@@ -0,0 +1,23 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { ZoomableTextLayer } from '../common-layers/zoomable-text-layer/zoomable-text-layer';
6
+ export class LabelLayer extends CompositeLayer {
7
+ static layerName = 'LabelLayer';
8
+ renderLayers() {
9
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
10
+ return [
11
+ new ZoomableTextLayer(this.getSubLayerProps({
12
+ id: '__text-layer',
13
+ data,
14
+ getPosition,
15
+ ...stylesheet.getDeckGLAccessors(),
16
+ updateTriggers: {
17
+ ...stylesheet.getDeckGLUpdateTriggers(),
18
+ getPosition: positionUpdateTrigger
19
+ }
20
+ }))
21
+ ];
22
+ }
23
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { PolygonLayer } from '@deck.gl/layers';
3
+ export declare class PathBasedRoundedRectangleLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): PolygonLayer<any, {}>[];
6
+ }
@@ -0,0 +1,46 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { PolygonLayer } from '@deck.gl/layers';
6
+ import { generateRoundedCorners } from '../../utils/polygon-calculations';
7
+ const generateRoundedRectangle = (node, { getWidth, getHeight, getPosition, getCornerRadius }) => {
8
+ const pos = getPosition(node);
9
+ const width = typeof getWidth === 'function' ? getWidth(node) : getWidth;
10
+ const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;
11
+ const cornerRadius = typeof getCornerRadius === 'function' ? getCornerRadius(node) : getCornerRadius;
12
+ const factor = 20;
13
+ return generateRoundedCorners(pos, width, height, cornerRadius, factor);
14
+ };
15
+ export class PathBasedRoundedRectangleLayer extends CompositeLayer {
16
+ static layerName = 'PathBasedRoundedRectangleLayer';
17
+ renderLayers() {
18
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
19
+ const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');
20
+ const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');
21
+ return [
22
+ new PolygonLayer(this.getSubLayerProps({
23
+ id: '__polygon-layer',
24
+ data,
25
+ getPolygon: (node) => generateRoundedRectangle(node, {
26
+ getPosition,
27
+ getWidth: stylesheet.getDeckGLAccessor('getWidth'),
28
+ getHeight: stylesheet.getDeckGLAccessor('getHeight'),
29
+ getCornerRadius: stylesheet.getDeckGLAccessor('getCornerRadius')
30
+ }),
31
+ filled: Boolean(getFillColor),
32
+ stroked: Boolean(getLineWidth),
33
+ ...stylesheet.getDeckGLAccessors(),
34
+ updateTriggers: {
35
+ getPolygon: [
36
+ positionUpdateTrigger,
37
+ stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),
38
+ stylesheet.getDeckGLAccessorUpdateTrigger('getHeight'),
39
+ stylesheet.getDeckGLAccessorUpdateTrigger('getCornerRadius')
40
+ ],
41
+ ...stylesheet.getDeckGLUpdateTriggers()
42
+ }
43
+ }))
44
+ ];
45
+ }
46
+ }
@@ -0,0 +1,6 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { PolygonLayer } from '@deck.gl/layers';
3
+ export declare class RectangleLayer extends CompositeLayer {
4
+ static layerName: string;
5
+ renderLayers(): PolygonLayer<any, {}>[];
6
+ }
@@ -0,0 +1,49 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { PolygonLayer } from '@deck.gl/layers';
6
+ const generateRectangle = (node, { getWidth, getHeight, getPosition }) => {
7
+ const pos = getPosition(node);
8
+ const width = typeof getWidth === 'function' ? getWidth(node._data.label.length * 12) : getWidth;
9
+ const height = typeof getWidth === 'function' ? getHeight(node) : getHeight;
10
+ const halfWidth = width / 2;
11
+ const halfHeight = height / 2;
12
+ return [
13
+ [pos[0] - halfWidth, pos[1] - halfHeight],
14
+ [pos[0] - halfWidth, pos[1] + halfHeight],
15
+ [pos[0] + halfWidth, pos[1] + halfHeight],
16
+ [pos[0] + halfWidth, pos[1] - halfHeight]
17
+ ];
18
+ };
19
+ export class RectangleLayer extends CompositeLayer {
20
+ static layerName = 'RectangleLayer';
21
+ renderLayers() {
22
+ const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
23
+ const getFillColor = stylesheet.getDeckGLAccessor('getFillColor');
24
+ const getLineWidth = stylesheet.getDeckGLAccessor('getLineWidth');
25
+ return [
26
+ new PolygonLayer(this.getSubLayerProps({
27
+ id: '__polygon-layer',
28
+ data,
29
+ getPolygon: (node) => generateRectangle(node, {
30
+ getPosition,
31
+ getWidth: stylesheet.getDeckGLAccessor('getWidth'),
32
+ getHeight: stylesheet.getDeckGLAccessor('getHeight')
33
+ }),
34
+ filled: Boolean(getFillColor),
35
+ jointRounded: true,
36
+ stroked: Boolean(getLineWidth),
37
+ ...stylesheet.getDeckGLAccessors(),
38
+ updateTriggers: {
39
+ getPolygon: [
40
+ positionUpdateTrigger,
41
+ stylesheet.getDeckGLAccessorUpdateTrigger('getWidth'),
42
+ stylesheet.getDeckGLAccessorUpdateTrigger('getHeight')
43
+ ],
44
+ ...stylesheet.getDeckGLUpdateTriggers()
45
+ }
46
+ }))
47
+ ];
48
+ }
49
+ }