plotboilerplate 1.23.3 → 1.25.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 (230) hide show
  1. package/README.md +19 -1
  2. package/dist/index.esm.js +1684 -394
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.esm.min.js +1 -1
  5. package/dist/index.esm.min.js.map +1 -1
  6. package/dist/plotboilerplate.browser.min.js +1 -1
  7. package/dist/plotboilerplate.browser.min.js.map +1 -1
  8. package/dist/plotboilerplate.js +12450 -11120
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +9 -5
  11. package/src/cjs/BezierPath.d.ts +41 -5
  12. package/src/cjs/BezierPath.js +52 -2
  13. package/src/cjs/BezierPath.js.map +1 -1
  14. package/src/cjs/Bounds.d.ts +67 -3
  15. package/src/cjs/Bounds.js +101 -3
  16. package/src/cjs/Bounds.js.map +1 -1
  17. package/src/cjs/Circle.d.ts +46 -4
  18. package/src/cjs/Circle.js +82 -3
  19. package/src/cjs/Circle.js.map +1 -1
  20. package/src/cjs/CircleSector.d.ts +51 -2
  21. package/src/cjs/CircleSector.js +112 -3
  22. package/src/cjs/CircleSector.js.map +1 -1
  23. package/src/cjs/CubicBezierCurve.d.ts +113 -7
  24. package/src/cjs/CubicBezierCurve.js +281 -33
  25. package/src/cjs/CubicBezierCurve.js.map +1 -1
  26. package/src/cjs/Line.d.ts +38 -3
  27. package/src/cjs/Line.js +64 -1
  28. package/src/cjs/Line.js.map +1 -1
  29. package/src/cjs/PlotBoilerplate.d.ts +37 -6
  30. package/src/cjs/PlotBoilerplate.js +224 -125
  31. package/src/cjs/PlotBoilerplate.js.map +1 -1
  32. package/src/cjs/Polygon.d.ts +68 -5
  33. package/src/cjs/Polygon.js +143 -22
  34. package/src/cjs/Polygon.js.map +1 -1
  35. package/src/cjs/Triangle.d.ts +52 -3
  36. package/src/cjs/Triangle.js +80 -1
  37. package/src/cjs/Triangle.js.map +1 -1
  38. package/src/cjs/VEllipse.d.ts +62 -3
  39. package/src/cjs/VEllipse.js +181 -17
  40. package/src/cjs/VEllipse.js.map +1 -1
  41. package/src/cjs/VEllipseSector.d.ts +86 -2
  42. package/src/cjs/VEllipseSector.js +148 -4
  43. package/src/cjs/VEllipseSector.js.map +1 -1
  44. package/src/cjs/Vector.d.ts +12 -2
  45. package/src/cjs/Vector.js +15 -2
  46. package/src/cjs/Vector.js.map +1 -1
  47. package/src/cjs/VertTuple.d.ts +28 -4
  48. package/src/cjs/VertTuple.js +36 -3
  49. package/src/cjs/VertTuple.js.map +1 -1
  50. package/src/cjs/Vertex.d.ts +31 -4
  51. package/src/cjs/Vertex.js +35 -1
  52. package/src/cjs/Vertex.js.map +1 -1
  53. package/src/cjs/interfaces/core.d.ts +67 -0
  54. package/src/cjs/interfaces/core.js +4 -0
  55. package/src/cjs/interfaces/core.js.map +1 -1
  56. package/src/cjs/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  57. package/src/cjs/utils/algorithms/convexPolygonIncircle.js +14 -6
  58. package/src/cjs/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  59. package/src/cjs/utils/createRandomizedPolygon.d.ts +14 -0
  60. package/src/cjs/utils/createRandomizedPolygon.js +32 -0
  61. package/src/cjs/utils/createRandomizedPolygon.js.map +1 -0
  62. package/src/cjs/utils/datastructures/Color.d.ts +147 -1
  63. package/src/cjs/utils/datastructures/Color.js +385 -41
  64. package/src/cjs/utils/datastructures/Color.js.map +1 -1
  65. package/src/cjs/utils/datastructures/ColorGradient.d.ts +79 -0
  66. package/src/cjs/utils/datastructures/ColorGradient.js +171 -0
  67. package/src/cjs/utils/datastructures/ColorGradient.js.map +1 -0
  68. package/src/cjs/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  69. package/src/cjs/utils/dom/components/ColorGradientPicker.js +667 -0
  70. package/src/cjs/utils/dom/components/ColorGradientPicker.js.map +1 -0
  71. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  72. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js +520 -0
  73. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  74. package/src/cjs/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  75. package/src/cjs/utils/dom/components/ColorGradientSelector.js +325 -0
  76. package/src/cjs/utils/dom/components/ColorGradientSelector.js.map +1 -0
  77. package/src/cjs/utils/dom/components/Test.d.ts +7 -0
  78. package/src/cjs/utils/dom/components/Test.js +30 -0
  79. package/src/cjs/utils/dom/components/Test.js.map +1 -0
  80. package/src/cjs/utils/dom/guiSizeToggler.js +1 -1
  81. package/src/cjs/utils/dom/guiSizeToggler.js.map +1 -1
  82. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +16 -8
  83. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +49 -28
  84. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  85. package/src/cjs/utils/helpers/CircleHelper.d.ts +10 -1
  86. package/src/cjs/utils/helpers/CircleHelper.js +13 -2
  87. package/src/cjs/utils/helpers/CircleHelper.js.map +1 -1
  88. package/src/cjs/utils/helpers/CircleSectorHelper.d.ts +11 -2
  89. package/src/cjs/utils/helpers/CircleSectorHelper.js +20 -20
  90. package/src/cjs/utils/helpers/CircleSectorHelper.js.map +1 -1
  91. package/src/cjs/utils/helpers/TriangleHelper.d.ts +57 -0
  92. package/src/cjs/utils/helpers/TriangleHelper.js +83 -0
  93. package/src/cjs/utils/helpers/TriangleHelper.js.map +1 -0
  94. package/src/cjs/utils/helpers/VEllipseHelper.d.ts +32 -0
  95. package/src/cjs/utils/helpers/VEllipseHelper.js +88 -0
  96. package/src/cjs/utils/helpers/VEllipseHelper.js.map +1 -0
  97. package/src/cjs/utils/helpers/VEllipseSectorHelper.d.ts +44 -4
  98. package/src/cjs/utils/helpers/VEllipseSectorHelper.js +108 -25
  99. package/src/cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  100. package/src/cjs/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  101. package/src/cjs/utils/parsers/LinearColorGradientParser.js +224 -0
  102. package/src/cjs/utils/parsers/LinearColorGradientParser.js.map +1 -0
  103. package/src/createDemoDrawables.js +4 -1
  104. package/src/esm/BezierPath.d.ts +41 -5
  105. package/src/esm/BezierPath.js +50 -2
  106. package/src/esm/BezierPath.js.map +1 -1
  107. package/src/esm/Bounds.d.ts +67 -3
  108. package/src/esm/Bounds.js +101 -3
  109. package/src/esm/Bounds.js.map +1 -1
  110. package/src/esm/Circle.d.ts +46 -4
  111. package/src/esm/Circle.js +79 -3
  112. package/src/esm/Circle.js.map +1 -1
  113. package/src/esm/CircleSector.d.ts +51 -2
  114. package/src/esm/CircleSector.js +108 -3
  115. package/src/esm/CircleSector.js.map +1 -1
  116. package/src/esm/CubicBezierCurve.d.ts +113 -7
  117. package/src/esm/CubicBezierCurve.js +277 -33
  118. package/src/esm/CubicBezierCurve.js.map +1 -1
  119. package/src/esm/Line.d.ts +38 -3
  120. package/src/esm/Line.js +62 -1
  121. package/src/esm/Line.js.map +1 -1
  122. package/src/esm/PlotBoilerplate.d.ts +37 -6
  123. package/src/esm/PlotBoilerplate.js +224 -125
  124. package/src/esm/PlotBoilerplate.js.map +1 -1
  125. package/src/esm/Polygon.d.ts +68 -5
  126. package/src/esm/Polygon.js +138 -22
  127. package/src/esm/Polygon.js.map +1 -1
  128. package/src/esm/Triangle.d.ts +52 -3
  129. package/src/esm/Triangle.js +77 -1
  130. package/src/esm/Triangle.js.map +1 -1
  131. package/src/esm/VEllipse.d.ts +62 -3
  132. package/src/esm/VEllipse.js +178 -17
  133. package/src/esm/VEllipse.js.map +1 -1
  134. package/src/esm/VEllipseSector.d.ts +86 -2
  135. package/src/esm/VEllipseSector.js +146 -7
  136. package/src/esm/VEllipseSector.js.map +1 -1
  137. package/src/esm/Vector.d.ts +12 -2
  138. package/src/esm/Vector.js +15 -2
  139. package/src/esm/Vector.js.map +1 -1
  140. package/src/esm/VertTuple.d.ts +28 -4
  141. package/src/esm/VertTuple.js +36 -3
  142. package/src/esm/VertTuple.js.map +1 -1
  143. package/src/esm/Vertex.d.ts +31 -4
  144. package/src/esm/Vertex.js +35 -1
  145. package/src/esm/Vertex.js.map +1 -1
  146. package/src/esm/interfaces/core.d.ts +67 -0
  147. package/src/esm/interfaces/core.js +4 -0
  148. package/src/esm/interfaces/core.js.map +1 -1
  149. package/src/esm/utils/algorithms/convexPolygonIncircle.d.ts +2 -1
  150. package/src/esm/utils/algorithms/convexPolygonIncircle.js +15 -7
  151. package/src/esm/utils/algorithms/convexPolygonIncircle.js.map +1 -1
  152. package/src/esm/utils/algorithms/createRandomizedPolygon.d.ts +14 -0
  153. package/src/esm/utils/algorithms/createRandomizedPolygon.js +28 -0
  154. package/src/esm/utils/algorithms/createRandomizedPolygon.js.map +1 -0
  155. package/src/esm/utils/createRandomizedPolygon.d.ts +14 -0
  156. package/src/esm/utils/createRandomizedPolygon.js +28 -0
  157. package/src/esm/utils/createRandomizedPolygon.js.map +1 -0
  158. package/src/esm/utils/datastructures/Color.d.ts +147 -1
  159. package/src/esm/utils/datastructures/Color.js +386 -42
  160. package/src/esm/utils/datastructures/Color.js.map +1 -1
  161. package/src/esm/utils/datastructures/ColorGradient.d.ts +79 -0
  162. package/src/esm/utils/datastructures/ColorGradient.js +166 -0
  163. package/src/esm/utils/datastructures/ColorGradient.js.map +1 -0
  164. package/src/esm/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  165. package/src/esm/utils/dom/components/ColorGradientPicker.js +732 -0
  166. package/src/esm/utils/dom/components/ColorGradientPicker.js.map +1 -0
  167. package/src/esm/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  168. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js +582 -0
  169. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  170. package/src/esm/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  171. package/src/esm/utils/dom/components/ColorGradientSelector.js +332 -0
  172. package/src/esm/utils/dom/components/ColorGradientSelector.js.map +1 -0
  173. package/src/esm/utils/dom/components/Test.d.ts +7 -0
  174. package/src/esm/utils/dom/components/Test.js +26 -0
  175. package/src/esm/utils/dom/components/Test.js.map +1 -0
  176. package/src/esm/utils/dom/guiSizeToggler.js +1 -1
  177. package/src/esm/utils/dom/guiSizeToggler.js.map +1 -1
  178. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +16 -8
  179. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +47 -27
  180. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  181. package/src/esm/utils/helpers/CircleHelper.d.ts +10 -1
  182. package/src/esm/utils/helpers/CircleHelper.js +13 -2
  183. package/src/esm/utils/helpers/CircleHelper.js.map +1 -1
  184. package/src/esm/utils/helpers/CircleSectorHelper.d.ts +11 -2
  185. package/src/esm/utils/helpers/CircleSectorHelper.js +20 -20
  186. package/src/esm/utils/helpers/CircleSectorHelper.js.map +1 -1
  187. package/src/esm/utils/helpers/TriangleHelper.d.ts +57 -0
  188. package/src/esm/utils/helpers/TriangleHelper.js +78 -0
  189. package/src/esm/utils/helpers/TriangleHelper.js.map +1 -0
  190. package/src/esm/utils/helpers/VEllipseHelper.d.ts +32 -0
  191. package/src/esm/utils/helpers/VEllipseHelper.js +83 -0
  192. package/src/esm/utils/helpers/VEllipseHelper.js.map +1 -0
  193. package/src/esm/utils/helpers/VEllipseSectorHelper.d.ts +44 -4
  194. package/src/esm/utils/helpers/VEllipseSectorHelper.js +107 -24
  195. package/src/esm/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  196. package/src/esm/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  197. package/src/esm/utils/parsers/LinearColorGradientParser.js +217 -0
  198. package/src/esm/utils/parsers/LinearColorGradientParser.js.map +1 -0
  199. package/src/external.d.ts +9 -0
  200. package/src/ts/BezierPath.ts +58 -5
  201. package/src/ts/Bounds.ts +110 -6
  202. package/src/ts/Circle.ts +87 -5
  203. package/src/ts/CircleSector.ts +115 -5
  204. package/src/ts/CubicBezierCurve.ts +332 -42
  205. package/src/ts/Line.ts +66 -3
  206. package/src/ts/PlotBoilerplate.ts +236 -114
  207. package/src/ts/Polygon.ts +164 -29
  208. package/src/ts/Triangle.ts +85 -3
  209. package/src/ts/VEllipse.ts +214 -19
  210. package/src/ts/VEllipseSector.ts +154 -8
  211. package/src/ts/Vector.ts +16 -2
  212. package/src/ts/VertTuple.ts +39 -4
  213. package/src/ts/Vertex.ts +40 -4
  214. package/src/ts/interfaces/core.ts +73 -0
  215. package/src/ts/utils/algorithms/convexPolygonIncircle.ts +82 -78
  216. package/src/ts/utils/createRandomizedPolygon.ts +31 -0
  217. package/src/ts/utils/datastructures/Color.ts +423 -44
  218. package/src/ts/utils/datastructures/ColorGradient.ts +196 -0
  219. package/src/ts/utils/dom/components/ColorGradientPicker.tsx +877 -0
  220. package/src/ts/utils/dom/components/ColorGradientSelector.tsx +445 -0
  221. package/src/ts/utils/dom/components/Test.tsx +44 -0
  222. package/src/ts/utils/dom/components/_ColorGradientPicker_raw.ts_ +392 -0
  223. package/src/ts/utils/dom/guiSizeToggler.ts +1 -1
  224. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +61 -35
  225. package/src/ts/utils/helpers/CircleHelper.ts +17 -3
  226. package/src/ts/utils/helpers/CircleSectorHelper.ts +118 -126
  227. package/src/ts/utils/helpers/TriangleHelper.ts +102 -0
  228. package/src/ts/utils/helpers/VEllipseHelper.ts +115 -0
  229. package/src/ts/utils/helpers/VEllipseSectorHelper.ts +144 -26
  230. package/src/ts/utils/parsers/LinearColorGradientParser.ts +297 -0
@@ -86,8 +86,13 @@
86
86
  * @modified 2024-07-08 Adding `PlotBoilerplate.getGUI()` to retrieve the GUI instance.
87
87
  * @modified 2024-08-25 Extending main class `PlotBoilerplate` optional param `isBackdropFiltersEnabled`.
88
88
  * @modified 2024-12-02 Adding the `triggerRedraw` to the `removeAll` method.
89
+ * @modified 2025-05-07 Changing the return type of `removeVertex` from `void` to `boolean`.
90
+ * @modified 2025-05-07 Handling content changes now with `contentChangeListeners`.
91
+ * @modified 2025-05-07 Added `PlogBoilerplate.addContentChangeListener` and `.removeContentChangeListener`.
92
+ * @modified 2025-05-07 Moving full vectors now by default when vector point a is moved.
93
+ * @modified 2025-05-20 Applying `lineWith` parameter in the draw routine for vectors (had been missing).
89
94
  *
90
- * @version 1.20.0
95
+ * @version 1.21.1
91
96
  *
92
97
  * @file PlotBoilerplate
93
98
  * @fileoverview The main class.
@@ -211,6 +216,10 @@ export class PlotBoilerplate {
211
216
  */
212
217
  constructor(config, drawConfig) {
213
218
  var _b, _c;
219
+ /**
220
+ * A list of content change listeners.
221
+ */
222
+ this.contentChangeListeners = [];
214
223
  /**
215
224
  * A discrete timestamp to identify single render cycles.
216
225
  * Note that using system time milliseconds is not a safe way to identify render frames, as on modern powerful machines
@@ -598,6 +607,52 @@ export class PlotBoilerplate {
598
607
  PlotBoilerplate.utils.setCSSscale(this.canvas, (_d = this.config.cssScaleX) !== null && _d !== void 0 ? _d : 1.0, (_e = this.config.cssScaleY) !== null && _e !== void 0 ? _e : 1.0);
599
608
  }
600
609
  }
610
+ /**
611
+ * Adds a new content change listener to this instance. Adding duplicates is not possible.
612
+ *
613
+ * @param {PBContentChangeListener} listener - The listenre to add.
614
+ * @method addContentChangeListener
615
+ * @instance
616
+ * @memberof PlotBoilerplate
617
+ * @returns {void}
618
+ */
619
+ addContentChangeListener(listener) {
620
+ for (var i in this.contentChangeListeners) {
621
+ if (this.contentChangeListeners[i] === listener) {
622
+ return;
623
+ }
624
+ }
625
+ this.contentChangeListeners.push(listener);
626
+ }
627
+ /**
628
+ * Removes an existing content change listener from this instance.
629
+ *
630
+ * @param {PBContentChangeListener} listener - The listenre to add.
631
+ * @method removeContentChangeListener
632
+ * @instance
633
+ * @memberof PlotBoilerplate
634
+ * @returns {void}
635
+ */
636
+ removeContentChangeListener(listener) {
637
+ for (var i = 0; i < this.contentChangeListeners.length; i++) {
638
+ if (this.contentChangeListeners[i] === listener) {
639
+ this.contentChangeListeners.splice(i, 1);
640
+ return;
641
+ }
642
+ }
643
+ }
644
+ _fireContentChanged(addedDrawables, removedDrawables) {
645
+ for (var i in this.contentChangeListeners) {
646
+ const listener = this.contentChangeListeners[i];
647
+ if (listener && typeof listener === "function") {
648
+ listener({
649
+ type: addedDrawables.length > 0 ? "DRAWABLES_ADDED" : "DRAWABLES_REMOVED",
650
+ addedDrawables: addedDrawables,
651
+ removedDrawables: removedDrawables
652
+ });
653
+ }
654
+ }
655
+ }
601
656
  /**
602
657
  * Add a drawable object.<br>
603
658
  * <br>
@@ -622,100 +677,121 @@ export class PlotBoilerplate {
622
677
  * @memberof PlotBoilerplate
623
678
  * @return {void}
624
679
  **/
625
- add(drawable, redraw) {
680
+ add(drawable, redraw, doNotFireEvent) {
626
681
  if (Array.isArray(drawable)) {
627
682
  const arr = drawable;
628
683
  for (var i = 0; i < arr.length; i++) {
629
- this.add(arr[i], false);
684
+ this.add(arr[i], false, doNotFireEvent);
630
685
  }
686
+ // !doNotFireEvent && this._fireContentChanged(arr, []);
631
687
  }
632
- else if (drawable instanceof Vertex) {
633
- this.drawables.push(drawable);
634
- this.vertices.push(drawable);
635
- }
636
- else if (drawable instanceof Line) {
637
- // Add some lines
638
- this.drawables.push(drawable);
639
- this.vertices.push(drawable.a);
640
- this.vertices.push(drawable.b);
641
- }
642
- else if (drawable instanceof Vector) {
643
- this.drawables.push(drawable);
644
- this.vertices.push(drawable.a);
645
- this.vertices.push(drawable.b);
646
- }
647
- else if (drawable instanceof VEllipse) {
648
- this.vertices.push(drawable.center);
649
- this.vertices.push(drawable.axis);
650
- this.drawables.push(drawable);
651
- drawable.center.listeners.addDragListener((event) => {
652
- drawable.axis.add(event.params.dragAmount);
653
- });
654
- }
655
- else if (drawable instanceof VEllipseSector) {
656
- this.vertices.push(drawable.ellipse.center);
657
- this.vertices.push(drawable.ellipse.axis);
658
- this.drawables.push(drawable);
659
- drawable.ellipse.center.listeners.addDragListener((event) => {
660
- drawable.ellipse.axis.add(event.params.dragAmount);
661
- });
662
- }
663
- else if (drawable instanceof Circle) {
664
- this.vertices.push(drawable.center);
665
- this.drawables.push(drawable);
666
- }
667
- else if (drawable instanceof CircleSector) {
668
- this.vertices.push(drawable.circle.center);
669
- this.drawables.push(drawable);
670
- }
671
- else if (drawable instanceof Polygon) {
672
- this.drawables.push(drawable);
673
- for (var i = 0; i < drawable.vertices.length; i++) {
674
- this.vertices.push(drawable.vertices[i]);
688
+ else {
689
+ const addedDrawables = [drawable];
690
+ if (drawable instanceof Vertex) {
691
+ this.drawables.push(drawable);
692
+ this.vertices.push(drawable);
675
693
  }
676
- }
677
- else if (drawable instanceof Triangle) {
678
- this.drawables.push(drawable);
679
- this.vertices.push(drawable.a);
680
- this.vertices.push(drawable.b);
681
- this.vertices.push(drawable.c);
682
- }
683
- else if (drawable instanceof BezierPath) {
684
- this.drawables.push(drawable);
685
- const bezierPath = drawable;
686
- for (var i = 0; i < bezierPath.bezierCurves.length; i++) {
687
- if (!drawable.adjustCircular && i == 0) {
688
- this.vertices.push(bezierPath.bezierCurves[i].startPoint);
694
+ else if (drawable instanceof Line) {
695
+ // Add some lines
696
+ this.drawables.push(drawable);
697
+ this.vertices.push(drawable.a);
698
+ this.vertices.push(drawable.b);
699
+ addedDrawables.push(drawable.a, drawable.b);
700
+ }
701
+ else if (drawable instanceof Vector) {
702
+ this.drawables.push(drawable);
703
+ this.vertices.push(drawable.a);
704
+ this.vertices.push(drawable.b);
705
+ addedDrawables.push(drawable.a, drawable.b);
706
+ drawable.a.listeners.addDragListener((event) => {
707
+ drawable.b.add(event.params.dragAmount);
708
+ });
709
+ }
710
+ else if (drawable instanceof VEllipse) {
711
+ this.vertices.push(drawable.center);
712
+ this.vertices.push(drawable.axis);
713
+ addedDrawables.push(drawable.center, drawable.axis);
714
+ this.drawables.push(drawable);
715
+ drawable.center.listeners.addDragListener((event) => {
716
+ drawable.axis.add(event.params.dragAmount);
717
+ });
718
+ }
719
+ else if (drawable instanceof VEllipseSector) {
720
+ this.vertices.push(drawable.ellipse.center);
721
+ this.vertices.push(drawable.ellipse.axis);
722
+ addedDrawables.push(drawable.ellipse.center, drawable.ellipse.axis);
723
+ this.drawables.push(drawable);
724
+ drawable.ellipse.center.listeners.addDragListener((event) => {
725
+ drawable.ellipse.axis.add(event.params.dragAmount);
726
+ });
727
+ }
728
+ else if (drawable instanceof Circle) {
729
+ this.vertices.push(drawable.center);
730
+ addedDrawables.push(drawable.center);
731
+ this.drawables.push(drawable);
732
+ }
733
+ else if (drawable instanceof CircleSector) {
734
+ this.vertices.push(drawable.circle.center);
735
+ addedDrawables.push(drawable.circle.center);
736
+ this.drawables.push(drawable);
737
+ }
738
+ else if (drawable instanceof Polygon) {
739
+ this.drawables.push(drawable);
740
+ for (var i = 0; i < drawable.vertices.length; i++) {
741
+ this.vertices.push(drawable.vertices[i]);
742
+ addedDrawables.push(drawable.vertices[i]);
689
743
  }
690
- this.vertices.push(bezierPath.bezierCurves[i].endPoint);
691
- this.vertices.push(bezierPath.bezierCurves[i].startControlPoint);
692
- this.vertices.push(bezierPath.bezierCurves[i].endControlPoint);
693
- bezierPath.bezierCurves[i].startControlPoint.attr.selectable = false;
694
- bezierPath.bezierCurves[i].endControlPoint.attr.selectable = false;
695
744
  }
696
- PlotBoilerplate.utils.enableBezierPathAutoAdjust(drawable);
697
- }
698
- else if (drawable instanceof PBImage) {
699
- this.vertices.push(drawable.upperLeft);
700
- this.vertices.push(drawable.lowerRight);
701
- this.drawables.push(drawable);
702
- // Todo: think about a IDragEvent interface
703
- drawable.upperLeft.listeners.addDragListener((e) => {
704
- drawable.lowerRight.add(e.params.dragAmount);
705
- });
706
- drawable.lowerRight.attr.selectable = false;
707
- }
708
- else if (drawable instanceof PBText) {
709
- this.vertices.push(drawable.anchor);
710
- this.drawables.push(drawable);
711
- drawable.anchor.attr.selectable = false;
712
- }
713
- else {
714
- throw "Cannot add drawable of unrecognized type: " + typeof drawable + ".";
745
+ else if (drawable instanceof Triangle) {
746
+ this.drawables.push(drawable);
747
+ this.vertices.push(drawable.a);
748
+ this.vertices.push(drawable.b);
749
+ this.vertices.push(drawable.c);
750
+ addedDrawables.push(drawable.a, drawable.b, drawable.c);
751
+ }
752
+ else if (drawable instanceof BezierPath) {
753
+ this.drawables.push(drawable);
754
+ const bezierPath = drawable;
755
+ for (var i = 0; i < bezierPath.bezierCurves.length; i++) {
756
+ if (!drawable.adjustCircular && i == 0) {
757
+ this.vertices.push(bezierPath.bezierCurves[i].startPoint);
758
+ addedDrawables.push(bezierPath.bezierCurves[i].startPoint);
759
+ }
760
+ this.vertices.push(bezierPath.bezierCurves[i].endPoint);
761
+ this.vertices.push(bezierPath.bezierCurves[i].startControlPoint);
762
+ this.vertices.push(bezierPath.bezierCurves[i].endControlPoint);
763
+ addedDrawables.push(bezierPath.bezierCurves[i].endPoint, bezierPath.bezierCurves[i].startControlPoint, bezierPath.bezierCurves[i].endControlPoint);
764
+ bezierPath.bezierCurves[i].startControlPoint.attr.selectable = false;
765
+ bezierPath.bezierCurves[i].endControlPoint.attr.selectable = false;
766
+ }
767
+ PlotBoilerplate.utils.enableBezierPathAutoAdjust(drawable);
768
+ }
769
+ else if (drawable instanceof PBImage) {
770
+ this.vertices.push(drawable.upperLeft);
771
+ this.vertices.push(drawable.lowerRight);
772
+ addedDrawables.push(drawable.upperLeft, drawable.lowerRight);
773
+ this.drawables.push(drawable);
774
+ // Todo: think about a IDragEvent interface
775
+ drawable.upperLeft.listeners.addDragListener((e) => {
776
+ drawable.lowerRight.add(e.params.dragAmount);
777
+ });
778
+ drawable.lowerRight.attr.selectable = false;
779
+ }
780
+ else if (drawable instanceof PBText) {
781
+ this.vertices.push(drawable.anchor);
782
+ addedDrawables.push(drawable.anchor);
783
+ this.drawables.push(drawable);
784
+ drawable.anchor.attr.selectable = false;
785
+ }
786
+ else {
787
+ throw "Cannot add drawable of unrecognized type: " + typeof drawable + ".";
788
+ }
789
+ !doNotFireEvent && this._fireContentChanged(addedDrawables, []);
715
790
  }
716
791
  // This is a workaround for backwards compatibility when the 'redraw' param was not yet present.
717
- if (redraw || typeof redraw == "undefined")
792
+ if (redraw || typeof redraw == "undefined") {
718
793
  this.redraw();
794
+ }
719
795
  }
720
796
  /**
721
797
  * Remove a drawable object.<br>
@@ -735,88 +811,113 @@ export class PlotBoilerplate {
735
811
  *
736
812
  * @param {Drawable|Array<Drawable>} drawable - The drawable (of one of the allowed class instance) to remove.
737
813
  * @param {boolean} [redraw=false]
814
+ * @param {removeWidth}
738
815
  * @method remove
739
816
  * @instance
740
817
  * @memberof PlotBoilerplate
741
818
  * @return {void}
742
819
  **/
743
- remove(drawable, redraw, removeWithVertices) {
820
+ remove(drawable, redraw, removeWithVertices, doNotFireEvent) {
744
821
  if (Array.isArray(drawable)) {
822
+ const removedDrawables = [];
745
823
  for (var i = 0; i < drawable.length; i++) {
746
- this.remove(drawable[i], false, removeWithVertices);
824
+ if (this.remove(drawable[i], false, removeWithVertices, true)) {
825
+ removedDrawables.push(drawable[i]);
826
+ }
747
827
  }
748
828
  if (redraw) {
749
829
  this.redraw();
750
830
  }
751
- return;
831
+ !doNotFireEvent && this._fireContentChanged([], removedDrawables);
832
+ return removedDrawables.length > 0;
752
833
  }
753
834
  if (drawable instanceof Vertex) {
754
- this.removeVertex(drawable, false);
835
+ const wasRemoved = this.removeVertex(drawable, false, false);
755
836
  if (redraw) {
756
837
  this.redraw();
757
838
  }
839
+ !doNotFireEvent && this._fireContentChanged([], [drawable]);
840
+ return wasRemoved;
758
841
  }
842
+ let wasRemoved = false;
843
+ const removedDrawables = [];
759
844
  for (var i = 0; i < this.drawables.length; i++) {
760
845
  if (this.drawables[i] === drawable || this.drawables[i].uid === drawable.uid) {
761
846
  this.drawables.splice(i, 1);
847
+ removedDrawables.push(drawable);
762
848
  if (removeWithVertices) {
763
849
  // Check if some listeners need to be removed
764
850
  if (drawable instanceof Line) {
765
851
  // Add some lines
766
- this.removeVertex(drawable.a, false);
767
- this.removeVertex(drawable.b, false);
852
+ this.removeVertex(drawable.a, false, true);
853
+ this.removeVertex(drawable.b, false, true);
854
+ removedDrawables.push(drawable.a, drawable.b);
768
855
  }
769
856
  else if (drawable instanceof Vector) {
770
- this.removeVertex(drawable.a, false);
771
- this.removeVertex(drawable.b, false);
857
+ this.removeVertex(drawable.a, false, true);
858
+ this.removeVertex(drawable.b, false, true);
859
+ removedDrawables.push(drawable.a, drawable.b);
772
860
  }
773
861
  else if (drawable instanceof VEllipse) {
774
- this.removeVertex(drawable.center, false);
775
- this.removeVertex(drawable.axis, false);
862
+ this.removeVertex(drawable.center, false, true);
863
+ this.removeVertex(drawable.axis, false, true);
864
+ removedDrawables.push(drawable.center, drawable.axis);
776
865
  }
777
866
  else if (drawable instanceof VEllipseSector) {
778
- this.removeVertex(drawable.ellipse.center);
779
- this.removeVertex(drawable.ellipse.axis);
867
+ this.removeVertex(drawable.ellipse.center, false, true);
868
+ this.removeVertex(drawable.ellipse.axis, false, true);
869
+ removedDrawables.push(drawable.ellipse.center, drawable.ellipse.axis);
780
870
  }
781
871
  else if (drawable instanceof Circle) {
782
- this.removeVertex(drawable.center, false);
872
+ this.removeVertex(drawable.center, false, true);
783
873
  }
784
874
  else if (drawable instanceof CircleSector) {
785
- this.removeVertex(drawable.circle.center, false);
875
+ this.removeVertex(drawable.circle.center, false, true);
876
+ removedDrawables.push(drawable.circle.center);
786
877
  }
787
878
  else if (drawable instanceof Polygon) {
788
879
  // for( var i in drawable.vertices )
789
- for (var i = 0; i < drawable.vertices.length; i++)
790
- this.removeVertex(drawable.vertices[i], false);
880
+ for (var i = 0; i < drawable.vertices.length; i++) {
881
+ this.removeVertex(drawable.vertices[i], false, true);
882
+ removedDrawables.push(drawable.vertices[i]);
883
+ }
791
884
  }
792
885
  else if (drawable instanceof Triangle) {
793
- this.removeVertex(drawable.a, false);
794
- this.removeVertex(drawable.b, false);
795
- this.removeVertex(drawable.c, false);
886
+ this.removeVertex(drawable.a, false, true);
887
+ this.removeVertex(drawable.b, false, true);
888
+ this.removeVertex(drawable.c, false, true);
889
+ removedDrawables.push(drawable.a, drawable.b, drawable.c);
796
890
  }
797
891
  else if (drawable instanceof BezierPath) {
798
892
  for (var i = 0; i < drawable.bezierCurves.length; i++) {
799
- this.removeVertex(drawable.bezierCurves[i].startPoint, false);
800
- this.removeVertex(drawable.bezierCurves[i].startControlPoint, false);
801
- this.removeVertex(drawable.bezierCurves[i].endControlPoint, false);
893
+ this.removeVertex(drawable.bezierCurves[i].startPoint, false, true);
894
+ this.removeVertex(drawable.bezierCurves[i].startControlPoint, false, true);
895
+ this.removeVertex(drawable.bezierCurves[i].endControlPoint, false, true);
896
+ removedDrawables.push(drawable.bezierCurves[i].startPoint, drawable.bezierCurves[i].startControlPoint, drawable.bezierCurves[i].endControlPoint);
802
897
  if (i + 1 == drawable.bezierCurves.length) {
803
- this.removeVertex(drawable.bezierCurves[i].endPoint, false);
898
+ this.removeVertex(drawable.bezierCurves[i].endPoint, false, true);
899
+ removedDrawables.push(drawable.bezierCurves[i].endPoint);
804
900
  }
805
901
  }
806
902
  }
807
903
  else if (drawable instanceof PBImage) {
808
- this.removeVertex(drawable.upperLeft, false);
809
- this.removeVertex(drawable.lowerRight, false);
904
+ this.removeVertex(drawable.upperLeft, false, true);
905
+ this.removeVertex(drawable.lowerRight, false, true);
906
+ removedDrawables.push(drawable.upperLeft, drawable.lowerRight);
810
907
  }
811
908
  else if (drawable instanceof PBText) {
812
- this.removeVertex(drawable.anchor, false);
909
+ this.removeVertex(drawable.anchor, false, true);
910
+ removedDrawables.push(drawable.anchor);
813
911
  }
814
912
  } // END removeWithVertices
815
913
  if (redraw) {
816
914
  this.redraw();
817
915
  }
818
- }
819
- }
916
+ !doNotFireEvent && this._fireContentChanged([], removedDrawables);
917
+ wasRemoved = true;
918
+ } // END if
919
+ } // END for
920
+ return wasRemoved;
820
921
  }
821
922
  /**
822
923
  * Remove a vertex from the vertex list.<br>
@@ -826,18 +927,20 @@ export class PlotBoilerplate {
826
927
  * @method removeVertex
827
928
  * @instance
828
929
  * @memberof PlotBoilerplate
829
- * @return {void}
930
+ * @return {boolean}
830
931
  **/
831
- removeVertex(vert, redraw) {
932
+ removeVertex(vert, redraw, doNotFireEvent) {
832
933
  for (var i = 0; i < this.vertices.length; i++) {
833
934
  if (this.vertices[i] === vert) {
834
935
  this.vertices.splice(i, 1);
835
936
  if (redraw) {
836
937
  this.redraw();
837
938
  }
838
- return;
939
+ !doNotFireEvent && this._fireContentChanged([], [vert]);
940
+ return true;
839
941
  }
840
942
  }
943
+ return false;
841
944
  }
842
945
  /**
843
946
  * Remove all elements.
@@ -852,13 +955,16 @@ export class PlotBoilerplate {
852
955
  * @return {void}
853
956
  */
854
957
  removeAll(keepVertices, triggerRedraw) {
958
+ let removedDrawables = this.drawables;
855
959
  this.drawables = [];
856
960
  if (!Boolean(keepVertices)) {
961
+ removedDrawables = removedDrawables.concat(this.vertices);
857
962
  this.vertices = [];
858
963
  }
859
964
  if (triggerRedraw || typeof triggerRedraw === "undefined") {
860
965
  this.redraw();
861
966
  }
967
+ removedDrawables.length > 0 && this._fireContentChanged([], removedDrawables);
862
968
  }
863
969
  /**
864
970
  * Find the vertex near the given position.
@@ -1063,18 +1169,17 @@ export class PlotBoilerplate {
1063
1169
  }
1064
1170
  else if (d instanceof Triangle) {
1065
1171
  draw.polyline([d.a, d.b, d.c], false, this.drawConfig.triangle.color, this.drawConfig.triangle.lineWidth);
1066
- if (!this.drawConfig.drawHandlePoints)
1172
+ if (!this.drawConfig.drawHandlePoints) {
1067
1173
  d.a.attr.renderTime = d.b.attr.renderTime = d.c.attr.renderTime = renderTime;
1174
+ }
1068
1175
  }
1069
1176
  else if (d instanceof VEllipse) {
1070
1177
  if (this.drawConfig.drawHandleLines) {
1071
1178
  draw.setCurrentId(`${d.uid}_e0`);
1072
1179
  draw.setCurrentClassName(`${d.className}-v-line`);
1073
- // draw.line( d.center.clone().add(0,d.axis.y-d.center.y), d.axis, '#c8c8c8' );
1074
1180
  draw.handleLine(d.center.clone().add(0, d.signedRadiusV()).rotate(d.rotation, d.center), d.axis); // , "#c8c8c8");
1075
1181
  draw.setCurrentId(`${d.uid}_e1`);
1076
1182
  draw.setCurrentClassName(`${d.className}-h-line`);
1077
- // draw.line( d.center.clone().add(d.axis.x-d.center.x,0), d.axis, '#c8c8c8' );
1078
1183
  draw.handleLine(d.center.clone().add(d.signedRadiusH(), 0).rotate(d.rotation, d.center), d.axis); // , "#c8c8c8");
1079
1184
  }
1080
1185
  draw.setCurrentId(d.uid);
@@ -1090,12 +1195,6 @@ export class PlotBoilerplate {
1090
1195
  else if (d instanceof VEllipseSector) {
1091
1196
  draw.setCurrentId(d.uid);
1092
1197
  draw.setCurrentClassName(`${d.className}`);
1093
- /* draw.ellipse( d.center,
1094
- // Math.abs(d.axis.x-d.center.x), Math.abs(d.axis.y-d.center.y),
1095
- d.radiusH(), d.radiusV(),
1096
- this.drawConfig.ellipse.color,
1097
- this.drawConfig.ellipse.lineWidth,
1098
- d.rotation ); */
1099
1198
  const data = VEllipseSector.ellipseSectorUtils.describeSVGArc(d.ellipse.center.x, d.ellipse.center.y, d.ellipse.radiusH(), d.ellipse.radiusV(), d.startAngle, d.endAngle, d.ellipse.rotation, { moveToStart: true });
1100
1199
  draw.path(data, this.drawConfig.ellipseSector.color, this.drawConfig.ellipseSector.lineWidth);
1101
1200
  }
@@ -1120,7 +1219,7 @@ export class PlotBoilerplate {
1120
1219
  d.b.attr.renderTime = renderTime;
1121
1220
  }
1122
1221
  else if (d instanceof Vector) {
1123
- draw.arrow(d.a, d.b, this.drawConfig.vector.color);
1222
+ draw.arrow(d.a, d.b, this.drawConfig.vector.color, this.drawConfig.vector.lineWidth);
1124
1223
  if (this.drawConfig.drawHandlePoints && d.b.attr.selectable && d.b.attr.visible) {
1125
1224
  draw.setCurrentId(`${d.uid}_h0`);
1126
1225
  draw.setCurrentClassName(`${d.className}-handle`);