@deck.gl-community/editable-layers 9.0.0-alpha.1

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 (295) hide show
  1. package/README.md +82 -0
  2. package/dist/constants.d.ts +14 -0
  3. package/dist/constants.js +14 -0
  4. package/dist/curve-utils.d.ts +2 -0
  5. package/dist/curve-utils.js +61 -0
  6. package/dist/edit-modes/composite-mode.d.ts +14 -0
  7. package/dist/edit-modes/composite-mode.js +47 -0
  8. package/dist/edit-modes/draw-90degree-polygon-mode.d.ts +11 -0
  9. package/dist/edit-modes/draw-90degree-polygon-mode.js +179 -0
  10. package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts +24 -0
  11. package/dist/edit-modes/draw-circle-by-diameter-mode.js +78 -0
  12. package/dist/edit-modes/draw-circle-from-center-mode.d.ts +22 -0
  13. package/dist/edit-modes/draw-circle-from-center-mode.js +70 -0
  14. package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.d.ts +5 -0
  15. package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.js +20 -0
  16. package/dist/edit-modes/draw-ellipse-using-three-points-mode.d.ts +5 -0
  17. package/dist/edit-modes/draw-ellipse-using-three-points-mode.js +16 -0
  18. package/dist/edit-modes/draw-line-string-mode.d.ts +25 -0
  19. package/dist/edit-modes/draw-line-string-mode.js +170 -0
  20. package/dist/edit-modes/draw-point-mode.d.ts +8 -0
  21. package/dist/edit-modes/draw-point-mode.js +28 -0
  22. package/dist/edit-modes/draw-polygon-by-dragging-mode.d.ts +14 -0
  23. package/dist/edit-modes/draw-polygon-by-dragging-mode.js +87 -0
  24. package/dist/edit-modes/draw-polygon-mode.d.ts +10 -0
  25. package/dist/edit-modes/draw-polygon-mode.js +143 -0
  26. package/dist/edit-modes/draw-rectangle-from-center-mode.d.ts +5 -0
  27. package/dist/edit-modes/draw-rectangle-from-center-mode.js +17 -0
  28. package/dist/edit-modes/draw-rectangle-mode.d.ts +5 -0
  29. package/dist/edit-modes/draw-rectangle-mode.js +11 -0
  30. package/dist/edit-modes/draw-rectangle-using-three-points-mode.d.ts +5 -0
  31. package/dist/edit-modes/draw-rectangle-using-three-points-mode.js +28 -0
  32. package/dist/edit-modes/draw-square-from-center-mode.d.ts +5 -0
  33. package/dist/edit-modes/draw-square-from-center-mode.js +35 -0
  34. package/dist/edit-modes/draw-square-mode.d.ts +5 -0
  35. package/dist/edit-modes/draw-square-mode.js +28 -0
  36. package/dist/edit-modes/duplicate-mode.d.ts +7 -0
  37. package/dist/edit-modes/duplicate-mode.js +17 -0
  38. package/dist/edit-modes/edit-mode.d.ts +11 -0
  39. package/dist/edit-modes/edit-mode.js +2 -0
  40. package/dist/edit-modes/elevation-mode.d.ts +13 -0
  41. package/dist/edit-modes/elevation-mode.js +49 -0
  42. package/dist/edit-modes/extend-line-string-mode.d.ts +9 -0
  43. package/dist/edit-modes/extend-line-string-mode.js +72 -0
  44. package/dist/edit-modes/extrude-mode.d.ts +15 -0
  45. package/dist/edit-modes/extrude-mode.js +186 -0
  46. package/dist/edit-modes/geojson-edit-mode.d.ts +33 -0
  47. package/dist/edit-modes/geojson-edit-mode.js +208 -0
  48. package/dist/edit-modes/immutable-feature-collection.d.ts +43 -0
  49. package/dist/edit-modes/immutable-feature-collection.js +300 -0
  50. package/dist/edit-modes/measure-angle-mode.d.ts +11 -0
  51. package/dist/edit-modes/measure-angle-mode.js +99 -0
  52. package/dist/edit-modes/measure-area-mode.d.ts +8 -0
  53. package/dist/edit-modes/measure-area-mode.js +50 -0
  54. package/dist/edit-modes/measure-distance-mode.d.ts +19 -0
  55. package/dist/edit-modes/measure-distance-mode.js +171 -0
  56. package/dist/edit-modes/modify-mode.d.ts +15 -0
  57. package/dist/edit-modes/modify-mode.js +203 -0
  58. package/dist/edit-modes/resize-circle-mode.d.ts +16 -0
  59. package/dist/edit-modes/resize-circle-mode.js +142 -0
  60. package/dist/edit-modes/rotate-mode.d.ts +17 -0
  61. package/dist/edit-modes/rotate-mode.js +151 -0
  62. package/dist/edit-modes/scale-mode.d.ts +27 -0
  63. package/dist/edit-modes/scale-mode.js +173 -0
  64. package/dist/edit-modes/snappable-mode.d.ts +21 -0
  65. package/dist/edit-modes/snappable-mode.js +109 -0
  66. package/dist/edit-modes/split-polygon-mode.d.ts +10 -0
  67. package/dist/edit-modes/split-polygon-mode.js +164 -0
  68. package/dist/edit-modes/three-click-polygon-mode.d.ts +10 -0
  69. package/dist/edit-modes/three-click-polygon-mode.js +72 -0
  70. package/dist/edit-modes/transform-mode.d.ts +9 -0
  71. package/dist/edit-modes/transform-mode.js +63 -0
  72. package/dist/edit-modes/translate-mode.d.ts +13 -0
  73. package/dist/edit-modes/translate-mode.js +113 -0
  74. package/dist/edit-modes/two-click-polygon-mode.d.ts +13 -0
  75. package/dist/edit-modes/two-click-polygon-mode.js +93 -0
  76. package/dist/edit-modes/types.d.ts +86 -0
  77. package/dist/edit-modes/types.js +1 -0
  78. package/dist/edit-modes/utils.d.ts +36 -0
  79. package/dist/edit-modes/utils.js +381 -0
  80. package/dist/edit-modes/view-mode.d.ts +3 -0
  81. package/dist/edit-modes/view-mode.js +3 -0
  82. package/dist/editable-layers/editable-geojson-layer.d.ts +98 -0
  83. package/dist/editable-layers/editable-geojson-layer.js +450 -0
  84. package/dist/editable-layers/editable-h3-cluster-layer.d.ts +34 -0
  85. package/dist/editable-layers/editable-h3-cluster-layer.js +164 -0
  86. package/dist/editable-layers/editable-layer.d.ts +49 -0
  87. package/dist/editable-layers/editable-layer.js +195 -0
  88. package/dist/editable-layers/editable-path-layer.d.ts +9 -0
  89. package/dist/editable-layers/editable-path-layer.js +34 -0
  90. package/dist/editable-layers/elevated-edit-handle-layer.d.ts +7 -0
  91. package/dist/editable-layers/elevated-edit-handle-layer.js +24 -0
  92. package/dist/editable-layers/junction-scatterplot-layer.d.ts +14 -0
  93. package/dist/editable-layers/junction-scatterplot-layer.js +41 -0
  94. package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.d.ts +4 -0
  95. package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.js +55 -0
  96. package/dist/editable-layers/path-marker-layer/create-path-markers.d.ts +16 -0
  97. package/dist/editable-layers/path-marker-layer/create-path-markers.js +75 -0
  98. package/dist/editable-layers/path-marker-layer/path-marker-layer.d.ts +40 -0
  99. package/dist/editable-layers/path-marker-layer/path-marker-layer.js +121 -0
  100. package/dist/editable-layers/path-marker-layer/polyline.d.ts +18 -0
  101. package/dist/editable-layers/path-marker-layer/polyline.js +37 -0
  102. package/dist/editable-layers/path-outline-layer/path-outline-layer.d.ts +26 -0
  103. package/dist/editable-layers/path-outline-layer/path-outline-layer.js +106 -0
  104. package/dist/editable-layers/selection-layer.d.ts +26 -0
  105. package/dist/editable-layers/selection-layer.js +167 -0
  106. package/dist/geojson-types.d.ts +58 -0
  107. package/dist/geojson-types.js +2 -0
  108. package/dist/index.cjs +5825 -0
  109. package/dist/index.cjs.map +7 -0
  110. package/dist/index.d.ts +60 -0
  111. package/dist/index.js +62 -0
  112. package/dist/lib/constants.d.ts +6 -0
  113. package/dist/lib/constants.js +6 -0
  114. package/dist/lib/deck-renderer/deck-cache.d.ts +14 -0
  115. package/dist/lib/deck-renderer/deck-cache.js +51 -0
  116. package/dist/lib/deck-renderer/deck-drawer.d.ts +63 -0
  117. package/dist/lib/deck-renderer/deck-drawer.js +232 -0
  118. package/dist/lib/feature.d.ts +10 -0
  119. package/dist/lib/feature.js +16 -0
  120. package/dist/lib/layer-mouse-event.d.ts +11 -0
  121. package/dist/lib/layer-mouse-event.js +24 -0
  122. package/dist/lib/layers/junctions-layer.d.ts +8 -0
  123. package/dist/lib/layers/junctions-layer.js +33 -0
  124. package/dist/lib/layers/segments-layer.d.ts +18 -0
  125. package/dist/lib/layers/segments-layer.js +94 -0
  126. package/dist/lib/layers/texts-layer.d.ts +8 -0
  127. package/dist/lib/layers/texts-layer.js +32 -0
  128. package/dist/lib/math.d.ts +11 -0
  129. package/dist/lib/math.js +22 -0
  130. package/dist/lib/nebula-layer.d.ts +13 -0
  131. package/dist/lib/nebula-layer.js +26 -0
  132. package/dist/lib/nebula.d.ts +34 -0
  133. package/dist/lib/nebula.js +254 -0
  134. package/dist/lib/style.d.ts +19 -0
  135. package/dist/lib/style.js +20 -0
  136. package/dist/memoize.d.ts +6 -0
  137. package/dist/memoize.js +40 -0
  138. package/dist/mode-handlers/composite-mode-handler.d.ts +24 -0
  139. package/dist/mode-handlers/composite-mode-handler.js +55 -0
  140. package/dist/mode-handlers/draw-90degree-polygon-handler.d.ts +13 -0
  141. package/dist/mode-handlers/draw-90degree-polygon-handler.js +169 -0
  142. package/dist/mode-handlers/draw-circle-by-bounding-box-handler.d.ts +9 -0
  143. package/dist/mode-handlers/draw-circle-by-bounding-box-handler.js +29 -0
  144. package/dist/mode-handlers/draw-circle-from-center-handler.d.ts +9 -0
  145. package/dist/mode-handlers/draw-circle-from-center-handler.js +27 -0
  146. package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.d.ts +9 -0
  147. package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.js +30 -0
  148. package/dist/mode-handlers/draw-ellipse-using-three-points-handler.d.ts +9 -0
  149. package/dist/mode-handlers/draw-ellipse-using-three-points-handler.js +37 -0
  150. package/dist/mode-handlers/draw-line-string-handler.d.ts +9 -0
  151. package/dist/mode-handlers/draw-line-string-handler.js +83 -0
  152. package/dist/mode-handlers/draw-point-handler.d.ts +5 -0
  153. package/dist/mode-handlers/draw-point-handler.js +11 -0
  154. package/dist/mode-handlers/draw-polygon-handler.d.ts +11 -0
  155. package/dist/mode-handlers/draw-polygon-handler.js +92 -0
  156. package/dist/mode-handlers/draw-rectangle-handler.d.ts +9 -0
  157. package/dist/mode-handlers/draw-rectangle-handler.js +18 -0
  158. package/dist/mode-handlers/draw-rectangle-using-three-points-handler.d.ts +9 -0
  159. package/dist/mode-handlers/draw-rectangle-using-three-points-handler.js +49 -0
  160. package/dist/mode-handlers/duplicate-handler.d.ts +9 -0
  161. package/dist/mode-handlers/duplicate-handler.js +19 -0
  162. package/dist/mode-handlers/elevation-handler.d.ts +19 -0
  163. package/dist/mode-handlers/elevation-handler.js +48 -0
  164. package/dist/mode-handlers/extrude-handler.d.ts +18 -0
  165. package/dist/mode-handlers/extrude-handler.js +176 -0
  166. package/dist/mode-handlers/mode-handler.d.ts +61 -0
  167. package/dist/mode-handlers/mode-handler.js +286 -0
  168. package/dist/mode-handlers/modify-handler.d.ts +19 -0
  169. package/dist/mode-handlers/modify-handler.js +193 -0
  170. package/dist/mode-handlers/rotate-handler.d.ts +17 -0
  171. package/dist/mode-handlers/rotate-handler.js +74 -0
  172. package/dist/mode-handlers/scale-handler.d.ts +17 -0
  173. package/dist/mode-handlers/scale-handler.js +76 -0
  174. package/dist/mode-handlers/snappable-handler.d.ts +33 -0
  175. package/dist/mode-handlers/snappable-handler.js +133 -0
  176. package/dist/mode-handlers/split-polygon-handler.d.ts +11 -0
  177. package/dist/mode-handlers/split-polygon-handler.js +154 -0
  178. package/dist/mode-handlers/three-click-polygon-handler.d.ts +5 -0
  179. package/dist/mode-handlers/three-click-polygon-handler.js +18 -0
  180. package/dist/mode-handlers/translate-handler.d.ts +17 -0
  181. package/dist/mode-handlers/translate-handler.js +72 -0
  182. package/dist/mode-handlers/two-click-polygon-handler.d.ts +5 -0
  183. package/dist/mode-handlers/two-click-polygon-handler.js +18 -0
  184. package/dist/mode-handlers/view-handler.d.ts +8 -0
  185. package/dist/mode-handlers/view-handler.js +10 -0
  186. package/dist/shaderlib/color/color.d.ts +8 -0
  187. package/dist/shaderlib/color/color.js +51 -0
  188. package/dist/shaderlib/outline/outline.d.ts +8 -0
  189. package/dist/shaderlib/outline/outline.js +97 -0
  190. package/dist/shaderlib/utils/utils.d.ts +8 -0
  191. package/dist/shaderlib/utils/utils.js +28 -0
  192. package/dist/translateFromCenter.d.ts +4 -0
  193. package/dist/translateFromCenter.js +19 -0
  194. package/dist/types.d.ts +35 -0
  195. package/dist/types.js +1 -0
  196. package/dist/utils.d.ts +20 -0
  197. package/dist/utils.js +144 -0
  198. package/package.json +84 -0
  199. package/src/constants.ts +15 -0
  200. package/src/curve-utils.ts +77 -0
  201. package/src/edit-modes/composite-mode.ts +74 -0
  202. package/src/edit-modes/draw-90degree-polygon-mode.ts +220 -0
  203. package/src/edit-modes/draw-circle-by-diameter-mode.ts +88 -0
  204. package/src/edit-modes/draw-circle-from-center-mode.ts +79 -0
  205. package/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts +25 -0
  206. package/src/edit-modes/draw-ellipse-using-three-points-mode.ts +23 -0
  207. package/src/edit-modes/draw-line-string-mode.ts +200 -0
  208. package/src/edit-modes/draw-point-mode.ts +35 -0
  209. package/src/edit-modes/draw-polygon-by-dragging-mode.ts +106 -0
  210. package/src/edit-modes/draw-polygon-mode.ts +171 -0
  211. package/src/edit-modes/draw-rectangle-from-center-mode.ts +23 -0
  212. package/src/edit-modes/draw-rectangle-mode.ts +14 -0
  213. package/src/edit-modes/draw-rectangle-using-three-points-mode.ts +36 -0
  214. package/src/edit-modes/draw-square-from-center-mode.ts +46 -0
  215. package/src/edit-modes/draw-square-mode.ts +36 -0
  216. package/src/edit-modes/duplicate-mode.ts +21 -0
  217. package/src/edit-modes/edit-mode.ts +30 -0
  218. package/src/edit-modes/elevation-mode.ts +86 -0
  219. package/src/edit-modes/extend-line-string-mode.ts +87 -0
  220. package/src/edit-modes/extrude-mode.ts +254 -0
  221. package/src/edit-modes/geojson-edit-mode.ts +283 -0
  222. package/src/edit-modes/immutable-feature-collection.ts +417 -0
  223. package/src/edit-modes/measure-angle-mode.ts +127 -0
  224. package/src/edit-modes/measure-area-mode.ts +62 -0
  225. package/src/edit-modes/measure-distance-mode.ts +215 -0
  226. package/src/edit-modes/modify-mode.ts +293 -0
  227. package/src/edit-modes/resize-circle-mode.ts +202 -0
  228. package/src/edit-modes/rotate-mode.ts +208 -0
  229. package/src/edit-modes/scale-mode.ts +231 -0
  230. package/src/edit-modes/snappable-mode.ts +174 -0
  231. package/src/edit-modes/split-polygon-mode.ts +201 -0
  232. package/src/edit-modes/three-click-polygon-mode.ts +111 -0
  233. package/src/edit-modes/transform-mode.ts +75 -0
  234. package/src/edit-modes/translate-mode.ts +161 -0
  235. package/src/edit-modes/two-click-polygon-mode.ts +132 -0
  236. package/src/edit-modes/types.ts +135 -0
  237. package/src/edit-modes/utils.ts +513 -0
  238. package/src/edit-modes/view-mode.ts +3 -0
  239. package/src/editable-layers/editable-geojson-layer.ts +603 -0
  240. package/src/editable-layers/editable-h3-cluster-layer.ts +226 -0
  241. package/src/editable-layers/editable-layer.ts +252 -0
  242. package/src/editable-layers/editable-path-layer.ts +51 -0
  243. package/src/editable-layers/elevated-edit-handle-layer.ts +33 -0
  244. package/src/editable-layers/junction-scatterplot-layer.ts +53 -0
  245. package/src/editable-layers/path-marker-layer/arrow-2d-geometry.ts +61 -0
  246. package/src/editable-layers/path-marker-layer/create-path-markers.ts +107 -0
  247. package/src/editable-layers/path-marker-layer/path-marker-layer.ts +179 -0
  248. package/src/editable-layers/path-marker-layer/polyline.ts +40 -0
  249. package/src/editable-layers/path-outline-layer/path-outline-layer.ts +147 -0
  250. package/src/editable-layers/selection-layer.ts +209 -0
  251. package/src/geojson-types.ts +89 -0
  252. package/src/index.ts +125 -0
  253. package/src/lib/constants.ts +6 -0
  254. package/src/lib/deck-renderer/deck-cache.ts +61 -0
  255. package/src/lib/deck-renderer/deck-drawer.ts +263 -0
  256. package/src/lib/feature.ts +27 -0
  257. package/src/lib/layer-mouse-event.ts +32 -0
  258. package/src/lib/layers/junctions-layer.ts +40 -0
  259. package/src/lib/layers/segments-layer.ts +108 -0
  260. package/src/lib/layers/texts-layer.ts +43 -0
  261. package/src/lib/math.ts +26 -0
  262. package/src/lib/nebula-layer.ts +33 -0
  263. package/src/lib/nebula.ts +323 -0
  264. package/src/lib/style.ts +22 -0
  265. package/src/memoize.ts +43 -0
  266. package/src/mode-handlers/composite-mode-handler.ts +89 -0
  267. package/src/mode-handlers/draw-90degree-polygon-handler.ts +201 -0
  268. package/src/mode-handlers/draw-circle-by-bounding-box-handler.ts +39 -0
  269. package/src/mode-handlers/draw-circle-from-center-handler.ts +38 -0
  270. package/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts +41 -0
  271. package/src/mode-handlers/draw-ellipse-using-three-points-handler.ts +46 -0
  272. package/src/mode-handlers/draw-line-string-handler.ts +108 -0
  273. package/src/mode-handlers/draw-point-handler.ts +15 -0
  274. package/src/mode-handlers/draw-polygon-handler.ts +121 -0
  275. package/src/mode-handlers/draw-rectangle-handler.ts +28 -0
  276. package/src/mode-handlers/draw-rectangle-using-three-points-handler.ts +60 -0
  277. package/src/mode-handlers/duplicate-handler.ts +25 -0
  278. package/src/mode-handlers/elevation-handler.ts +88 -0
  279. package/src/mode-handlers/extrude-handler.ts +245 -0
  280. package/src/mode-handlers/mode-handler.ts +394 -0
  281. package/src/mode-handlers/modify-handler.ts +263 -0
  282. package/src/mode-handlers/rotate-handler.ts +107 -0
  283. package/src/mode-handlers/scale-handler.ts +105 -0
  284. package/src/mode-handlers/snappable-handler.ts +184 -0
  285. package/src/mode-handlers/split-polygon-handler.ts +177 -0
  286. package/src/mode-handlers/three-click-polygon-handler.ts +25 -0
  287. package/src/mode-handlers/translate-handler.ts +110 -0
  288. package/src/mode-handlers/two-click-polygon-handler.ts +25 -0
  289. package/src/mode-handlers/view-handler.ts +13 -0
  290. package/src/shaderlib/color/color.ts +56 -0
  291. package/src/shaderlib/outline/outline.ts +101 -0
  292. package/src/shaderlib/utils/utils.ts +33 -0
  293. package/src/translateFromCenter.ts +48 -0
  294. package/src/types.ts +39 -0
  295. package/src/utils.ts +185 -0
@@ -0,0 +1,94 @@
1
+ import { ArrowStyles, DEFAULT_STYLE, MAX_ARROWS } from '../style';
2
+ import NebulaLayer from '../nebula-layer';
3
+ import { toDeckColor } from '../../utils';
4
+ import DeckCache from '../deck-renderer/deck-cache';
5
+ import PathMarkerLayer from '../../editable-layers/path-marker-layer/path-marker-layer';
6
+ const NEBULA_TO_DECK_DIRECTIONS = {
7
+ [ArrowStyles.NONE]: { forward: false, backward: false },
8
+ [ArrowStyles.FORWARD]: { forward: true, backward: false },
9
+ [ArrowStyles.BACKWARD]: { forward: false, backward: true },
10
+ [ArrowStyles.BOTH]: { forward: true, backward: true },
11
+ };
12
+ export default class SegmentsLayer extends NebulaLayer {
13
+ deckCache;
14
+ noBlend;
15
+ highlightColor;
16
+ arrowSize;
17
+ jointRounded;
18
+ capRounded;
19
+ dashed;
20
+ markerLayerProps;
21
+ constructor(config) {
22
+ super(config);
23
+ this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data));
24
+ this.enableSelection = true;
25
+ this.enablePicking = config.enablePicking ?? true;
26
+ this.noBlend = config.noBlend ?? false;
27
+ this.jointRounded = config.jointRounded ?? true;
28
+ this.capRounded = config.capRounded ?? true;
29
+ this.dashed = config.dashed ?? false;
30
+ this.markerLayerProps = config.markerLayerProps ?? null;
31
+ this.highlightColor = [1, 1, 1, 1];
32
+ this.arrowSize = 1;
33
+ }
34
+ getMouseOverSegment() {
35
+ // TODO: remove references
36
+ return null;
37
+ }
38
+ _calcMarkerPercentages(nf) {
39
+ const { arrowPercentages } = nf.style;
40
+ if (arrowPercentages) {
41
+ return arrowPercentages;
42
+ }
43
+ const arrowStyle = nf.style.arrowStyle || DEFAULT_STYLE.arrowStyle;
44
+ if (arrowStyle === ArrowStyles.NONE)
45
+ return [];
46
+ const arrowCount = Math.min(nf.style.arrowCount || DEFAULT_STYLE.arrowCount, MAX_ARROWS);
47
+ return [[0.5], [0.33, 0.66], [0.25, 0.5, 0.75]][arrowCount - 1];
48
+ }
49
+ _getHighlightedObjectIndex({ nebula }) {
50
+ const { deckglMouseOverInfo } = nebula;
51
+ if (deckglMouseOverInfo) {
52
+ const { originalLayer, index } = deckglMouseOverInfo;
53
+ if (originalLayer === this) {
54
+ return index;
55
+ }
56
+ }
57
+ // no object
58
+ return -1;
59
+ }
60
+ render({ nebula }) {
61
+ const defaultColor = [0x0, 0x0, 0x0, 0xff];
62
+ const { objects, updateTrigger } = this.deckCache;
63
+ return new PathMarkerLayer({
64
+ id: `segments-${this.id}`,
65
+ data: objects,
66
+ opacity: 1,
67
+ fp64: false,
68
+ jointRounded: this.jointRounded,
69
+ capRounded: this.capRounded,
70
+ pickable: true,
71
+ sizeScale: this.arrowSize || 6,
72
+ parameters: {
73
+ depthCompare: 'always',
74
+ blendColorOperation: this.noBlend ? undefined : 'max',
75
+ },
76
+ getPath: (nf) => nf.geoJson.geometry.coordinates,
77
+ getColor: (nf) => toDeckColor(nf.style.lineColor, defaultColor),
78
+ getWidth: (nf) => nf.style.lineWidthMeters || 1,
79
+ getZLevel: (nf) => nf.style.zLevel * 255,
80
+ getDirection: (nf) => NEBULA_TO_DECK_DIRECTIONS[nf.style.arrowStyle],
81
+ getMarkerColor: (nf) => toDeckColor(nf.style.arrowColor, defaultColor),
82
+ // eslint-disable-next-line @typescript-eslint/unbound-method
83
+ getMarkerPercentages: this._calcMarkerPercentages,
84
+ updateTriggers: { all: updateTrigger },
85
+ highlightedObjectIndex: this._getHighlightedObjectIndex({ nebula }),
86
+ highlightColor: toDeckColor(this.highlightColor),
87
+ dashJustified: this.dashed,
88
+ getDashArray: this.dashed ? (nf) => nf.style.dashArray : undefined,
89
+ markerLayerProps: this.markerLayerProps ||
90
+ PathMarkerLayer.defaultProps.markerLayerProps,
91
+ nebulaLayer: this,
92
+ });
93
+ }
94
+ }
@@ -0,0 +1,8 @@
1
+ import { TextLayer } from '@deck.gl/layers';
2
+ import NebulaLayer from '../nebula-layer';
3
+ import DeckCache from '../deck-renderer/deck-cache';
4
+ export default class TextsLayer extends NebulaLayer {
5
+ deckCache: DeckCache<any, any>;
6
+ constructor(config: Record<string, any>);
7
+ render({ nebula }: Record<string, any>): TextLayer;
8
+ }
@@ -0,0 +1,32 @@
1
+ import { TextLayer } from '@deck.gl/layers';
2
+ import NebulaLayer from '../nebula-layer';
3
+ import { toDeckColor } from '../../utils';
4
+ import { PROJECTED_PIXEL_SIZE_MULTIPLIER } from '../constants';
5
+ import DeckCache from '../deck-renderer/deck-cache';
6
+ export default class TextsLayer extends NebulaLayer {
7
+ deckCache;
8
+ constructor(config) {
9
+ super(config);
10
+ this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data));
11
+ }
12
+ render({ nebula }) {
13
+ const defaultColor = [0x0, 0x0, 0x0, 0xff];
14
+ const { objects, updateTrigger } = this.deckCache;
15
+ const { zoom } = nebula.props.viewport;
16
+ return new TextLayer({
17
+ id: `texts-${this.id}`,
18
+ data: objects,
19
+ opacity: 1,
20
+ fp64: false,
21
+ pickable: false,
22
+ getText: (nf) => nf.style.text,
23
+ getPosition: (nf) => nf.geoJson.geometry.coordinates,
24
+ getColor: (nf) => toDeckColor(nf.style.fillColor) || defaultColor,
25
+ // TODO: layer should offer option to scale with zoom
26
+ sizeScale: 1 / Math.pow(2, 20 - zoom),
27
+ getSize: PROJECTED_PIXEL_SIZE_MULTIPLIER,
28
+ updateTriggers: { all: updateTrigger },
29
+ nebulaLayer: this,
30
+ });
31
+ }
32
+ }
@@ -0,0 +1,11 @@
1
+ import { Position } from '../geojson-types';
2
+ export declare function toDegree(radian: number): number;
3
+ export declare function toRadian(angle: number): number;
4
+ /**
5
+ * Converts an array of latitudes, longitudes in E7 format to a list of points in degrees.
6
+ *
7
+ * @param {[]} array: An E7 array [lat_e7, lng_e7, lat_e7, lng_e7, ...]
8
+ * @return {[]} An array of points in degrees
9
+ * [ [lng_degrees, lat_degrees], [lng_degrees, lat_degrees], ...]
10
+ */
11
+ export declare function convertE7Array(array: number[]): Position[];
@@ -0,0 +1,22 @@
1
+ export function toDegree(radian) {
2
+ return (radian * 180) / Math.PI;
3
+ }
4
+ export function toRadian(angle) {
5
+ return (angle * Math.PI) / 180;
6
+ }
7
+ /**
8
+ * Converts an array of latitudes, longitudes in E7 format to a list of points in degrees.
9
+ *
10
+ * @param {[]} array: An E7 array [lat_e7, lng_e7, lat_e7, lng_e7, ...]
11
+ * @return {[]} An array of points in degrees
12
+ * [ [lng_degrees, lat_degrees], [lng_degrees, lat_degrees], ...]
13
+ */
14
+ export function convertE7Array(array) {
15
+ const points = [];
16
+ for (let i = 0; i < array.length; i += 2) {
17
+ const lat = array[i] * 1e-7;
18
+ const lng = array[i + 1] * 1e-7;
19
+ points.push([lng, lat]);
20
+ }
21
+ return points;
22
+ }
@@ -0,0 +1,13 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import Feature from './feature';
3
+ export default class NebulaLayer extends EventEmitter {
4
+ getData: () => Record<string, any>[];
5
+ toNebulaFeature: (data: Record<string, any>) => Feature;
6
+ id: string;
7
+ helperLayers: Record<string, any>[];
8
+ usesMapEvents: boolean;
9
+ enablePicking: boolean;
10
+ enableSelection: boolean;
11
+ constructor({ getData, on, toNebulaFeature }: Record<string, any>);
12
+ render(config: Record<string, any>): unknown;
13
+ }
@@ -0,0 +1,26 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { v4 } from 'uuid';
3
+ export default class NebulaLayer extends EventEmitter {
4
+ getData;
5
+ toNebulaFeature;
6
+ id;
7
+ helperLayers;
8
+ // flags
9
+ usesMapEvents = false;
10
+ enablePicking = false;
11
+ enableSelection = false;
12
+ //
13
+ constructor({ getData, on, toNebulaFeature }) {
14
+ super();
15
+ this.id = v4();
16
+ this.getData = getData;
17
+ this.toNebulaFeature = toNebulaFeature;
18
+ this.helperLayers = [];
19
+ if (on) {
20
+ Object.keys(on).forEach((key) => this.on(key, on[key]));
21
+ }
22
+ }
23
+ render(config) {
24
+ return null;
25
+ }
26
+ }
@@ -0,0 +1,34 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { WebMercatorViewport } from '@deck.gl/core';
3
+ import DeckDrawer from './deck-renderer/deck-drawer';
4
+ export default class Nebula {
5
+ init(props: Record<string, any>): void;
6
+ detach(): void;
7
+ updateProps(newProps: Record<string, any>): void;
8
+ props: Record<string, any>;
9
+ deckgl: Record<string, any> | null;
10
+ mainContainer: Record<string, any> | null;
11
+ deckglMouseOverInfo: Record<string, any> | null | undefined;
12
+ _deckDrawer: DeckDrawer;
13
+ _mouseWasDown: boolean;
14
+ wmViewport: WebMercatorViewport;
15
+ queryObjectEvents: EventEmitter<string | symbol, any>;
16
+ forceUpdate: () => any;
17
+ inited: boolean;
18
+ log(message: string): void;
19
+ updateAllDeckObjects(): void;
20
+ updateDeckObjectsByIds(ids: string[]): void;
21
+ rerenderLayers(): void;
22
+ _isNebulaEvent({ buttons, target, type }: Record<string, any>): boolean;
23
+ _onMouseEvent: (event: MouseEvent) => void;
24
+ getMouseGroundPosition(event: Record<string, any>): [number, number];
25
+ unprojectMousePosition(mousePosition: [number, number]): [number, number];
26
+ _handleDeckGLEvent(event: Record<string, any>): void;
27
+ getExtraDeckLayers(): Record<string, any>[];
28
+ renderDeckLayers(): unknown[];
29
+ getAllLayers(): Record<string, any>[];
30
+ getRenderedLayers(): unknown[];
31
+ updateAndGetRenderedLayers(layers: Record<string, any>[], viewport: WebMercatorViewport, container: Record<string, any>): unknown[];
32
+ setDeck(deckgl: Record<string, any> | null): void;
33
+ setMainContainer(mainContainer: Record<string, any> | null): void;
34
+ }
@@ -0,0 +1,254 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { WebMercatorViewport } from '@deck.gl/core';
3
+ import DeckDrawer from './deck-renderer/deck-drawer';
4
+ import LayerMouseEvent from './layer-mouse-event';
5
+ import NebulaLayer from './nebula-layer';
6
+ const LOGGER_PREFIX = 'Nebula: ';
7
+ export default class Nebula {
8
+ init(props) {
9
+ this.props = props;
10
+ this.wmViewport = new WebMercatorViewport(this.props.viewport);
11
+ // TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown']
12
+ ['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) => document.addEventListener(name, this._onMouseEvent, true));
13
+ }
14
+ detach() {
15
+ // TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown']
16
+ ['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) => document.removeEventListener(name, this._onMouseEvent, true));
17
+ }
18
+ updateProps(newProps) {
19
+ this.props = newProps;
20
+ const { viewport } = this.props;
21
+ this.wmViewport = new WebMercatorViewport(viewport);
22
+ }
23
+ props = null;
24
+ deckgl = null;
25
+ mainContainer = null;
26
+ deckglMouseOverInfo = null;
27
+ _deckDrawer = null;
28
+ _mouseWasDown = null;
29
+ wmViewport = null;
30
+ queryObjectEvents = new EventEmitter();
31
+ forceUpdate = null;
32
+ inited = null;
33
+ log(message) {
34
+ const { logger } = this.props;
35
+ if (logger && logger.info) {
36
+ logger.info(LOGGER_PREFIX + message);
37
+ }
38
+ }
39
+ updateAllDeckObjects() {
40
+ this.getAllLayers().forEach((layer) => {
41
+ if (layer && layer.deckCache) {
42
+ layer.deckCache.updateAllDeckObjects();
43
+ }
44
+ });
45
+ this.forceUpdate();
46
+ }
47
+ updateDeckObjectsByIds(ids) {
48
+ this.getAllLayers().forEach((layer) => {
49
+ if (layer && layer.deckCache) {
50
+ layer.deckCache.updateDeckObjectsByIds(ids);
51
+ }
52
+ });
53
+ this.forceUpdate();
54
+ }
55
+ rerenderLayers() {
56
+ this.updateAllDeckObjects();
57
+ }
58
+ _isNebulaEvent({ buttons, target, type }) {
59
+ const { viewport } = this.props;
60
+ // allow mouseup event aggressively to cancel drag properly
61
+ // TODO: use pointer capture setPointerCapture() to capture mouseup properly after deckgl
62
+ if (this._mouseWasDown && type === 'mouseup') {
63
+ this._mouseWasDown = false;
64
+ return true;
65
+ }
66
+ // allow mousemove event while dragging
67
+ if (type === 'mousemove' && buttons > 0) {
68
+ return true;
69
+ }
70
+ if (!target.getBoundingClientRect) {
71
+ return false;
72
+ }
73
+ const rect = target.getBoundingClientRect();
74
+ // Only listen to events coming from the basemap
75
+ // identified by the canvas of the same size as viewport.
76
+ // Need to round the rect dimension as some monitors
77
+ // have some sub-pixel difference with viewport.
78
+ return (Math.round(rect.width) === Math.round(viewport.width) &&
79
+ Math.round(rect.height) === Math.round(viewport.height));
80
+ }
81
+ _onMouseEvent = (event) => {
82
+ if (!this._isNebulaEvent(event)) {
83
+ return;
84
+ }
85
+ if (event.type === 'mousedown') {
86
+ this._mouseWasDown = true;
87
+ }
88
+ // offsetX/Y of the MouseEvent provides the offset in the X/Y coordinate
89
+ // of the mouse pointer between that event and the padding edge of the target node.
90
+ // We set our listener to document so we need to adjust offsetX/Y
91
+ // in case the target is not be our WebGL canvas.
92
+ const { top = 0, left = 0 } = this.mainContainer
93
+ ? this.mainContainer.getBoundingClientRect()
94
+ : {};
95
+ const proxyEvent = new Proxy(event, {
96
+ get: (original, propertyName) => {
97
+ if (propertyName === 'offsetX') {
98
+ return original.pageX - left;
99
+ }
100
+ if (propertyName === 'offsetY') {
101
+ return original.pageY - top;
102
+ }
103
+ // TODO: Properly use pointer events
104
+ if (propertyName === 'type') {
105
+ return original.type.replace('pointer', 'mouse');
106
+ }
107
+ const result = original[propertyName];
108
+ if (typeof result === 'function') {
109
+ return result.bind(original);
110
+ }
111
+ return result;
112
+ }
113
+ });
114
+ this._handleDeckGLEvent(proxyEvent);
115
+ };
116
+ getMouseGroundPosition(event) {
117
+ return this.wmViewport.unproject([event.offsetX, event.offsetY]);
118
+ }
119
+ unprojectMousePosition(mousePosition) {
120
+ return this.wmViewport.unproject(mousePosition);
121
+ }
122
+ // eslint-disable-next-line max-statements, complexity
123
+ _handleDeckGLEvent(event) {
124
+ const { deckgl, props: { onMapMouseEvent, selectionType, eventFilter } } = this;
125
+ let sendMapEvent = true;
126
+ let cursor = 'auto';
127
+ if (event && deckgl && selectionType) {
128
+ if (!this._deckDrawer)
129
+ this._deckDrawer = new DeckDrawer(this);
130
+ const lngLat = this.getMouseGroundPosition(event);
131
+ if (eventFilter && !eventFilter(lngLat, event))
132
+ return;
133
+ const drawerResult = this._deckDrawer.handleEvent(event, lngLat, selectionType);
134
+ if (drawerResult.redraw)
135
+ this.forceUpdate();
136
+ return;
137
+ }
138
+ if (event && deckgl && (!event.buttons || event.type !== 'mousemove')) {
139
+ // TODO: sort by mouse priority
140
+ const layerIds = deckgl.props.layers
141
+ .filter((l) => l && l.props && l.props.nebulaLayer && l.props.nebulaLayer.enablePicking)
142
+ .map((l) => l.id);
143
+ const pickingInfo = deckgl.pickObject({
144
+ x: event.offsetX,
145
+ y: event.offsetY,
146
+ radius: 5,
147
+ layerIds
148
+ });
149
+ this.queryObjectEvents.emit('pick', { event, pickingInfo });
150
+ if (pickingInfo) {
151
+ sendMapEvent = false;
152
+ const { index, lngLat } = pickingInfo;
153
+ if (eventFilter && !eventFilter(lngLat, event))
154
+ return;
155
+ const { layer: deckLayer, object } = pickingInfo;
156
+ if (deckLayer &&
157
+ deckLayer.props &&
158
+ deckLayer.props.nebulaLayer &&
159
+ deckLayer.props.nebulaLayer.eventHandler) {
160
+ deckLayer.props.nebulaLayer.eventHandler(event, pickingInfo);
161
+ }
162
+ const original = object.original ||
163
+ (deckLayer.props.nebulaLayer &&
164
+ deckLayer.props.nebulaLayer.deckCache &&
165
+ deckLayer.props.nebulaLayer.deckCache.originals[index]);
166
+ if (original) {
167
+ this.deckglMouseOverInfo = { originalLayer: deckLayer.props.nebulaLayer, index };
168
+ // @ts-expect-error narrow event type
169
+ const nebulaMouseEvent = new LayerMouseEvent(event, {
170
+ data: original,
171
+ metadata: object.metadata,
172
+ groundPoint: lngLat,
173
+ nebula: this
174
+ });
175
+ deckLayer.props.nebulaLayer.emit(event.type, nebulaMouseEvent);
176
+ this.forceUpdate();
177
+ }
178
+ cursor = 'pointer';
179
+ }
180
+ }
181
+ if (document.documentElement) {
182
+ document.documentElement.style.cursor = cursor;
183
+ }
184
+ if (sendMapEvent) {
185
+ this.deckglMouseOverInfo = null;
186
+ const lngLat = this.getMouseGroundPosition(event);
187
+ if (eventFilter && !eventFilter(lngLat, event))
188
+ return;
189
+ // send to layers first
190
+ // @ts-expect-error narrow event type
191
+ const nebulaMouseEvent = new LayerMouseEvent(event, {
192
+ groundPoint: lngLat,
193
+ nebula: this
194
+ });
195
+ this.getAllLayers()
196
+ .filter((layer) => layer && layer.usesMapEvents)
197
+ .forEach((layer) => layer.emit('mapMouseEvent', nebulaMouseEvent));
198
+ this.getAllLayers()
199
+ .filter((layer) => layer && layer.props && layer.props.nebulaLayer && layer.props.nebulaLayer.mapMouseEvent)
200
+ .forEach((layer) => layer.props.nebulaLayer.mapMouseEvent(nebulaMouseEvent, layer));
201
+ if (onMapMouseEvent) {
202
+ onMapMouseEvent(event, lngLat);
203
+ }
204
+ }
205
+ }
206
+ getExtraDeckLayers() {
207
+ const result = [];
208
+ if (this._deckDrawer)
209
+ result.push(...this._deckDrawer.render());
210
+ return result;
211
+ }
212
+ renderDeckLayers() {
213
+ return this.getAllLayers()
214
+ .map((layer) => (layer instanceof NebulaLayer ? layer.render({ nebula: this }) : layer))
215
+ .filter(Boolean);
216
+ }
217
+ getAllLayers() {
218
+ const result = [];
219
+ this.props.layers.filter(Boolean).forEach((layer) => {
220
+ result.push(layer);
221
+ // Only NebulaLayers have helpers, Deck GL layers don't.
222
+ if (layer instanceof NebulaLayer) {
223
+ result.push(...layer.helperLayers);
224
+ }
225
+ });
226
+ return result.filter(Boolean);
227
+ }
228
+ getRenderedLayers() {
229
+ return [...this.renderDeckLayers(), ...this.getExtraDeckLayers()];
230
+ }
231
+ updateAndGetRenderedLayers(layers, viewport, container) {
232
+ if (this.inited) {
233
+ this.updateProps({ layers, viewport });
234
+ this.forceUpdate = () => container.forceUpdate();
235
+ }
236
+ else {
237
+ this.inited = true;
238
+ this.init({ layers, viewport });
239
+ this.forceUpdate = () => container.forceUpdate();
240
+ this.updateAllDeckObjects();
241
+ }
242
+ return this.getRenderedLayers();
243
+ }
244
+ setDeck(deckgl) {
245
+ if (deckgl) {
246
+ this.deckgl = deckgl;
247
+ }
248
+ }
249
+ setMainContainer(mainContainer) {
250
+ if (mainContainer) {
251
+ this.mainContainer = mainContainer;
252
+ }
253
+ }
254
+ }
@@ -0,0 +1,19 @@
1
+ export declare const ArrowStyles: {
2
+ NONE: number;
3
+ FORWARD: number;
4
+ BACKWARD: number;
5
+ BOTH: number;
6
+ };
7
+ export declare const DEFAULT_ARROWS = 1;
8
+ export declare const MAX_ARROWS = 3;
9
+ export declare const DEFAULT_STYLE: {
10
+ arrowColor: number[];
11
+ arrowCount: number;
12
+ arrowStyle: number;
13
+ fillColor: number[];
14
+ lineColor: number[];
15
+ lineWidthMeters: number;
16
+ outlineRadiusMeters: number;
17
+ opacity: number;
18
+ zLevel: number;
19
+ };
@@ -0,0 +1,20 @@
1
+ // Describes the arrow style of polylines
2
+ export const ArrowStyles = {
3
+ NONE: 0,
4
+ FORWARD: 1,
5
+ BACKWARD: 2,
6
+ BOTH: 3,
7
+ };
8
+ export const DEFAULT_ARROWS = 1;
9
+ export const MAX_ARROWS = 3;
10
+ export const DEFAULT_STYLE = {
11
+ arrowColor: [0, 0, 0, 1],
12
+ arrowCount: DEFAULT_ARROWS,
13
+ arrowStyle: ArrowStyles.NONE,
14
+ fillColor: [0, 0, 0, 1],
15
+ lineColor: [0, 0, 0, 1],
16
+ lineWidthMeters: 5,
17
+ outlineRadiusMeters: 0,
18
+ opacity: 1,
19
+ zLevel: 0,
20
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Speed up consecutive function calls by caching the result of calls with identical input
3
+ * https://en.wikipedia.org/wiki/Memoization
4
+ * @param {function} compute - the function to be memoized
5
+ */
6
+ export default function memoize(compute: Function): (args: any) => any;
@@ -0,0 +1,40 @@
1
+ // port from @deck.gl/core
2
+ function isEqual(a, b) {
3
+ if (a === b) {
4
+ return true;
5
+ }
6
+ if (Array.isArray(a)) {
7
+ // Special treatment for arrays: compare 1-level deep
8
+ // This is to support equality of matrix/coordinate props
9
+ const len = a.length;
10
+ if (!b || b.length !== len) {
11
+ return false;
12
+ }
13
+ for (let i = 0; i < len; i++) {
14
+ if (a[i] !== b[i]) {
15
+ return false;
16
+ }
17
+ }
18
+ return true;
19
+ }
20
+ return false;
21
+ }
22
+ /**
23
+ * Speed up consecutive function calls by caching the result of calls with identical input
24
+ * https://en.wikipedia.org/wiki/Memoization
25
+ * @param {function} compute - the function to be memoized
26
+ */
27
+ export default function memoize(compute) {
28
+ let cachedArgs = {};
29
+ let cachedResult;
30
+ return (args) => {
31
+ for (const key in args) {
32
+ if (!isEqual(args[key], cachedArgs[key])) {
33
+ cachedResult = compute(args);
34
+ cachedArgs = args;
35
+ break;
36
+ }
37
+ }
38
+ return cachedResult;
39
+ };
40
+ }
@@ -0,0 +1,24 @@
1
+ import { FeatureCollection, Feature, Position } from '../geojson-types';
2
+ import { ClickEvent, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { ModeHandler, EditAction, EditHandle } from './mode-handler';
4
+ export declare class CompositeModeHandler extends ModeHandler {
5
+ handlers: Array<ModeHandler>;
6
+ options: Record<string, any>;
7
+ constructor(handlers: Array<ModeHandler>, options?: Record<string, any>);
8
+ _coalesce<T>(callback: (arg0: ModeHandler) => T, resultEval?: ((arg0: T) => boolean | null | undefined) | null): T | undefined;
9
+ setFeatureCollection(featureCollection: FeatureCollection): void;
10
+ setModeConfig(modeConfig: any): void;
11
+ setSelectedFeatureIndexes(indexes: number[]): void;
12
+ handleClick(event: ClickEvent): EditAction | null | undefined;
13
+ handlePointerMove(event: PointerMoveEvent): {
14
+ editAction: EditAction | null | undefined;
15
+ cancelMapPan: boolean;
16
+ };
17
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
18
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
19
+ getTentativeFeature(): Feature | null | undefined;
20
+ getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): EditHandle[];
21
+ getCursor({ isDragging }: {
22
+ isDragging: boolean;
23
+ }): string;
24
+ }
@@ -0,0 +1,55 @@
1
+ import { ModeHandler } from './mode-handler';
2
+ // TODO edit-modes: delete handlers once EditMode fully implemented
3
+ export class CompositeModeHandler extends ModeHandler {
4
+ handlers;
5
+ options;
6
+ constructor(handlers, options = {}) {
7
+ super();
8
+ this.handlers = handlers;
9
+ this.options = options;
10
+ }
11
+ _coalesce(callback, resultEval = null) {
12
+ let result;
13
+ for (let i = 0; i < this.handlers.length; i++) {
14
+ // eslint-disable-next-line callback-return
15
+ result = callback(this.handlers[i]);
16
+ if (resultEval ? resultEval(result) : result) {
17
+ break;
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ setFeatureCollection(featureCollection) {
23
+ this.handlers.forEach((handler) => handler.setFeatureCollection(featureCollection));
24
+ }
25
+ setModeConfig(modeConfig) {
26
+ this.handlers.forEach((handler) => handler.setModeConfig(modeConfig));
27
+ }
28
+ setSelectedFeatureIndexes(indexes) {
29
+ this.handlers.forEach((handler) => handler.setSelectedFeatureIndexes(indexes));
30
+ }
31
+ handleClick(event) {
32
+ return this._coalesce((handler) => handler.handleClick(event));
33
+ }
34
+ handlePointerMove(event) {
35
+ return this._coalesce((handler) => handler.handlePointerMove(event), (result) => result && Boolean(result.editAction)); // TODO
36
+ }
37
+ handleStartDragging(event) {
38
+ return this._coalesce((handler) => handler.handleStartDragging(event));
39
+ }
40
+ handleStopDragging(event) {
41
+ return this._coalesce((handler) => handler.handleStopDragging(event));
42
+ }
43
+ getTentativeFeature() {
44
+ return this._coalesce((handler) => handler.getTentativeFeature());
45
+ }
46
+ getEditHandles(picks, mapCoords) {
47
+ // TODO: Combine the handles *BUT* make sure if none of the results have
48
+ // changed to return the same object so that "editHandles !== this.state.editHandles"
49
+ // in editable-geojson-layer works.
50
+ return this._coalesce((handler) => handler.getEditHandles(picks, mapCoords), (handles) => Array.isArray(handles) && handles.length > 0); // TODO
51
+ }
52
+ getCursor({ isDragging }) {
53
+ return this._coalesce((handler) => handler.getCursor({ isDragging })); // TODO
54
+ }
55
+ }