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.
@@ -131,7 +136,8 @@ import {
131
136
  XYCoords,
132
137
  XYDimension,
133
138
  DatGuiProps, // DEPRECATED. Please do not use any more.
134
- LilGuiProps
139
+ LilGuiProps,
140
+ PBContentChangeListener
135
141
  } from "./interfaces";
136
142
  import { PBText } from "./PBText";
137
143
  import { AlloyFingerOptions } from "alloyfinger-typescript/src/cjs/alloy_finger";
@@ -313,6 +319,11 @@ export class PlotBoilerplate {
313
319
  */
314
320
  hooks: IHooks;
315
321
 
322
+ /**
323
+ * A list of content change listeners.
324
+ */
325
+ contentChangeListeners: Array<PBContentChangeListener> = [];
326
+
316
327
  /**
317
328
  * @member {KeyHandler|undefined}
318
329
  * @memberof PlotBoilerplate
@@ -804,6 +815,55 @@ export class PlotBoilerplate {
804
815
  }
805
816
  }
806
817
 
818
+ /**
819
+ * Adds a new content change listener to this instance. Adding duplicates is not possible.
820
+ *
821
+ * @param {PBContentChangeListener} listener - The listenre to add.
822
+ * @method addContentChangeListener
823
+ * @instance
824
+ * @memberof PlotBoilerplate
825
+ * @returns {void}
826
+ */
827
+ addContentChangeListener(listener: PBContentChangeListener) {
828
+ for (var i in this.contentChangeListeners) {
829
+ if (this.contentChangeListeners[i] === listener) {
830
+ return;
831
+ }
832
+ }
833
+ this.contentChangeListeners.push(listener);
834
+ }
835
+
836
+ /**
837
+ * Removes an existing content change listener from this instance.
838
+ *
839
+ * @param {PBContentChangeListener} listener - The listenre to add.
840
+ * @method removeContentChangeListener
841
+ * @instance
842
+ * @memberof PlotBoilerplate
843
+ * @returns {void}
844
+ */
845
+ removeContentChangeListener(listener: PBContentChangeListener) {
846
+ for (var i = 0; i < this.contentChangeListeners.length; i++) {
847
+ if (this.contentChangeListeners[i] === listener) {
848
+ this.contentChangeListeners.splice(i, 1);
849
+ return;
850
+ }
851
+ }
852
+ }
853
+
854
+ private _fireContentChanged(addedDrawables: Drawable[], removedDrawables: Drawable[]): void {
855
+ for (var i in this.contentChangeListeners) {
856
+ const listener = this.contentChangeListeners[i];
857
+ if (listener && typeof listener === "function") {
858
+ listener({
859
+ type: addedDrawables.length > 0 ? "DRAWABLES_ADDED" : "DRAWABLES_REMOVED",
860
+ addedDrawables: addedDrawables,
861
+ removedDrawables: removedDrawables
862
+ });
863
+ }
864
+ }
865
+ }
866
+
807
867
  /**
808
868
  * Add a drawable object.<br>
809
869
  * <br>
@@ -828,87 +888,115 @@ export class PlotBoilerplate {
828
888
  * @memberof PlotBoilerplate
829
889
  * @return {void}
830
890
  **/
831
- add(drawable: Drawable | Array<Drawable>, redraw?: boolean) {
891
+ add(drawable: Drawable | Array<Drawable>, redraw?: boolean, doNotFireEvent?: boolean) {
832
892
  if (Array.isArray(drawable)) {
833
893
  const arr: Array<Drawable> = drawable as Array<Drawable>;
834
894
  for (var i = 0; i < arr.length; i++) {
835
- this.add(arr[i], false);
895
+ this.add(arr[i], false, doNotFireEvent);
836
896
  }
837
- } else if (drawable instanceof Vertex) {
838
- this.drawables.push(drawable);
839
- this.vertices.push(drawable);
840
- } else if (drawable instanceof Line) {
841
- // Add some lines
842
- this.drawables.push(drawable);
843
- this.vertices.push(drawable.a);
844
- this.vertices.push(drawable.b);
845
- } else if (drawable instanceof Vector) {
846
- this.drawables.push(drawable);
847
- this.vertices.push(drawable.a);
848
- this.vertices.push(drawable.b);
849
- } else if (drawable instanceof VEllipse) {
850
- this.vertices.push(drawable.center);
851
- this.vertices.push(drawable.axis);
852
- this.drawables.push(drawable);
853
- drawable.center.listeners.addDragListener((event: VertEvent) => {
854
- drawable.axis.add(event.params.dragAmount);
855
- });
856
- } else if (drawable instanceof VEllipseSector) {
857
- this.vertices.push(drawable.ellipse.center);
858
- this.vertices.push(drawable.ellipse.axis);
859
- this.drawables.push(drawable);
860
- drawable.ellipse.center.listeners.addDragListener((event: VertEvent) => {
861
- drawable.ellipse.axis.add(event.params.dragAmount);
862
- });
863
- } else if (drawable instanceof Circle) {
864
- this.vertices.push(drawable.center);
865
- this.drawables.push(drawable);
866
- } else if (drawable instanceof CircleSector) {
867
- this.vertices.push(drawable.circle.center);
868
- this.drawables.push(drawable);
869
- } else if (drawable instanceof Polygon) {
870
- this.drawables.push(drawable);
871
- for (var i = 0; i < drawable.vertices.length; i++) {
872
- this.vertices.push(drawable.vertices[i]);
873
- }
874
- } else if (drawable instanceof Triangle) {
875
- this.drawables.push(drawable);
876
- this.vertices.push(drawable.a);
877
- this.vertices.push(drawable.b);
878
- this.vertices.push(drawable.c);
879
- } else if (drawable instanceof BezierPath) {
880
- this.drawables.push(drawable);
881
- const bezierPath: BezierPath = drawable as BezierPath;
882
- for (var i = 0; i < bezierPath.bezierCurves.length; i++) {
883
- if (!drawable.adjustCircular && i == 0) {
884
- this.vertices.push(bezierPath.bezierCurves[i].startPoint);
897
+ // !doNotFireEvent && this._fireContentChanged(arr, []);
898
+ } else {
899
+ const addedDrawables: Array<Drawable> = [drawable];
900
+ if (drawable instanceof Vertex) {
901
+ this.drawables.push(drawable);
902
+ this.vertices.push(drawable);
903
+ } else if (drawable instanceof Line) {
904
+ // Add some lines
905
+ this.drawables.push(drawable);
906
+ this.vertices.push(drawable.a);
907
+ this.vertices.push(drawable.b);
908
+ addedDrawables.push(drawable.a, drawable.b);
909
+ } else if (drawable instanceof Vector) {
910
+ this.drawables.push(drawable);
911
+ this.vertices.push(drawable.a);
912
+ this.vertices.push(drawable.b);
913
+ addedDrawables.push(drawable.a, drawable.b);
914
+ drawable.a.listeners.addDragListener((event: VertEvent) => {
915
+ drawable.b.add(event.params.dragAmount);
916
+ });
917
+ } else if (drawable instanceof VEllipse) {
918
+ this.vertices.push(drawable.center);
919
+ this.vertices.push(drawable.axis);
920
+ addedDrawables.push(drawable.center, drawable.axis);
921
+ this.drawables.push(drawable);
922
+ drawable.center.listeners.addDragListener((event: VertEvent) => {
923
+ drawable.axis.add(event.params.dragAmount);
924
+ });
925
+ } else if (drawable instanceof VEllipseSector) {
926
+ this.vertices.push(drawable.ellipse.center);
927
+ this.vertices.push(drawable.ellipse.axis);
928
+ addedDrawables.push(drawable.ellipse.center, drawable.ellipse.axis);
929
+
930
+ this.drawables.push(drawable);
931
+ drawable.ellipse.center.listeners.addDragListener((event: VertEvent) => {
932
+ drawable.ellipse.axis.add(event.params.dragAmount);
933
+ });
934
+ } else if (drawable instanceof Circle) {
935
+ this.vertices.push(drawable.center);
936
+ addedDrawables.push(drawable.center);
937
+ this.drawables.push(drawable);
938
+ } else if (drawable instanceof CircleSector) {
939
+ this.vertices.push(drawable.circle.center);
940
+ addedDrawables.push(drawable.circle.center);
941
+ this.drawables.push(drawable);
942
+ } else if (drawable instanceof Polygon) {
943
+ this.drawables.push(drawable);
944
+ for (var i = 0; i < drawable.vertices.length; i++) {
945
+ this.vertices.push(drawable.vertices[i]);
946
+ addedDrawables.push(drawable.vertices[i]);
947
+ }
948
+ } else if (drawable instanceof Triangle) {
949
+ this.drawables.push(drawable);
950
+ this.vertices.push(drawable.a);
951
+ this.vertices.push(drawable.b);
952
+ this.vertices.push(drawable.c);
953
+ addedDrawables.push(drawable.a, drawable.b, drawable.c);
954
+ } else if (drawable instanceof BezierPath) {
955
+ this.drawables.push(drawable);
956
+ const bezierPath: BezierPath = drawable as BezierPath;
957
+ for (var i = 0; i < bezierPath.bezierCurves.length; i++) {
958
+ if (!drawable.adjustCircular && i == 0) {
959
+ this.vertices.push(bezierPath.bezierCurves[i].startPoint);
960
+ addedDrawables.push(bezierPath.bezierCurves[i].startPoint);
961
+ }
962
+ this.vertices.push(bezierPath.bezierCurves[i].endPoint);
963
+ this.vertices.push(bezierPath.bezierCurves[i].startControlPoint);
964
+ this.vertices.push(bezierPath.bezierCurves[i].endControlPoint);
965
+ addedDrawables.push(
966
+ bezierPath.bezierCurves[i].endPoint,
967
+ bezierPath.bezierCurves[i].startControlPoint,
968
+ bezierPath.bezierCurves[i].endControlPoint
969
+ );
970
+ bezierPath.bezierCurves[i].startControlPoint.attr.selectable = false;
971
+ bezierPath.bezierCurves[i].endControlPoint.attr.selectable = false;
885
972
  }
886
- this.vertices.push(bezierPath.bezierCurves[i].endPoint);
887
- this.vertices.push(bezierPath.bezierCurves[i].startControlPoint);
888
- this.vertices.push(bezierPath.bezierCurves[i].endControlPoint);
889
- bezierPath.bezierCurves[i].startControlPoint.attr.selectable = false;
890
- bezierPath.bezierCurves[i].endControlPoint.attr.selectable = false;
973
+ PlotBoilerplate.utils.enableBezierPathAutoAdjust(drawable);
974
+ } else if (drawable instanceof PBImage) {
975
+ this.vertices.push(drawable.upperLeft);
976
+ this.vertices.push(drawable.lowerRight);
977
+ addedDrawables.push(drawable.upperLeft, drawable.lowerRight);
978
+ this.drawables.push(drawable);
979
+ // Todo: think about a IDragEvent interface
980
+ drawable.upperLeft.listeners.addDragListener((e: VertEvent) => {
981
+ drawable.lowerRight.add(e.params.dragAmount);
982
+ });
983
+ drawable.lowerRight.attr.selectable = false;
984
+ } else if (drawable instanceof PBText) {
985
+ this.vertices.push(drawable.anchor);
986
+ addedDrawables.push(drawable.anchor);
987
+ this.drawables.push(drawable);
988
+ drawable.anchor.attr.selectable = false;
989
+ } else {
990
+ throw "Cannot add drawable of unrecognized type: " + typeof drawable + ".";
891
991
  }
892
- PlotBoilerplate.utils.enableBezierPathAutoAdjust(drawable);
893
- } else if (drawable instanceof PBImage) {
894
- this.vertices.push(drawable.upperLeft);
895
- this.vertices.push(drawable.lowerRight);
896
- this.drawables.push(drawable);
897
- // Todo: think about a IDragEvent interface
898
- drawable.upperLeft.listeners.addDragListener((e: VertEvent) => {
899
- drawable.lowerRight.add(e.params.dragAmount);
900
- });
901
- drawable.lowerRight.attr.selectable = false;
902
- } else if (drawable instanceof PBText) {
903
- this.vertices.push(drawable.anchor);
904
- this.drawables.push(drawable);
905
- drawable.anchor.attr.selectable = false;
906
- } else {
907
- throw "Cannot add drawable of unrecognized type: " + typeof drawable + ".";
992
+
993
+ !doNotFireEvent && this._fireContentChanged(addedDrawables, []);
908
994
  }
909
995
 
910
996
  // This is a workaround for backwards compatibility when the 'redraw' param was not yet present.
911
- if (redraw || typeof redraw == "undefined") this.redraw();
997
+ if (redraw || typeof redraw == "undefined") {
998
+ this.redraw();
999
+ }
912
1000
  }
913
1001
 
914
1002
  /**
@@ -929,79 +1017,114 @@ export class PlotBoilerplate {
929
1017
  *
930
1018
  * @param {Drawable|Array<Drawable>} drawable - The drawable (of one of the allowed class instance) to remove.
931
1019
  * @param {boolean} [redraw=false]
1020
+ * @param {removeWidth}
932
1021
  * @method remove
933
1022
  * @instance
934
1023
  * @memberof PlotBoilerplate
935
1024
  * @return {void}
936
1025
  **/
937
- remove(drawable: Drawable | Array<Drawable>, redraw?: boolean, removeWithVertices?: boolean): void {
1026
+ remove(
1027
+ drawable: Drawable | Array<Drawable>,
1028
+ redraw?: boolean,
1029
+ removeWithVertices?: boolean,
1030
+ doNotFireEvent?: boolean
1031
+ ): boolean {
938
1032
  if (Array.isArray(drawable)) {
1033
+ const removedDrawables: Array<Drawable> = [];
939
1034
  for (var i = 0; i < drawable.length; i++) {
940
- this.remove(drawable[i], false, removeWithVertices);
1035
+ if (this.remove(drawable[i], false, removeWithVertices, true)) {
1036
+ removedDrawables.push(drawable[i]);
1037
+ }
941
1038
  }
942
1039
  if (redraw) {
943
1040
  this.redraw();
944
1041
  }
945
- return;
1042
+ !doNotFireEvent && this._fireContentChanged([], removedDrawables);
1043
+ return removedDrawables.length > 0;
946
1044
  }
947
1045
  if (drawable instanceof Vertex) {
948
- this.removeVertex(drawable, false);
1046
+ const wasRemoved: boolean = this.removeVertex(drawable, false, false);
949
1047
  if (redraw) {
950
1048
  this.redraw();
951
1049
  }
1050
+ !doNotFireEvent && this._fireContentChanged([], [drawable]);
1051
+ return wasRemoved;
952
1052
  }
1053
+ let wasRemoved: boolean = false;
1054
+ const removedDrawables: Array<Drawable> = [];
953
1055
  for (var i = 0; i < this.drawables.length; i++) {
954
1056
  if (this.drawables[i] === drawable || this.drawables[i].uid === drawable.uid) {
955
1057
  this.drawables.splice(i, 1);
1058
+ removedDrawables.push(drawable);
956
1059
 
957
1060
  if (removeWithVertices) {
958
1061
  // Check if some listeners need to be removed
959
1062
  if (drawable instanceof Line) {
960
1063
  // Add some lines
961
- this.removeVertex(drawable.a, false);
962
- this.removeVertex(drawable.b, false);
1064
+ this.removeVertex(drawable.a, false, true);
1065
+ this.removeVertex(drawable.b, false, true);
1066
+ removedDrawables.push(drawable.a, drawable.b);
963
1067
  } else if (drawable instanceof Vector) {
964
- this.removeVertex(drawable.a, false);
965
- this.removeVertex(drawable.b, false);
1068
+ this.removeVertex(drawable.a, false, true);
1069
+ this.removeVertex(drawable.b, false, true);
1070
+ removedDrawables.push(drawable.a, drawable.b);
966
1071
  } else if (drawable instanceof VEllipse) {
967
- this.removeVertex(drawable.center, false);
968
- this.removeVertex(drawable.axis, false);
1072
+ this.removeVertex(drawable.center, false, true);
1073
+ this.removeVertex(drawable.axis, false, true);
1074
+ removedDrawables.push(drawable.center, drawable.axis);
969
1075
  } else if (drawable instanceof VEllipseSector) {
970
- this.removeVertex(drawable.ellipse.center);
971
- this.removeVertex(drawable.ellipse.axis);
1076
+ this.removeVertex(drawable.ellipse.center, false, true);
1077
+ this.removeVertex(drawable.ellipse.axis, false, true);
1078
+ removedDrawables.push(drawable.ellipse.center, drawable.ellipse.axis);
972
1079
  } else if (drawable instanceof Circle) {
973
- this.removeVertex(drawable.center, false);
1080
+ this.removeVertex(drawable.center, false, true);
974
1081
  } else if (drawable instanceof CircleSector) {
975
- this.removeVertex(drawable.circle.center, false);
1082
+ this.removeVertex(drawable.circle.center, false, true);
1083
+ removedDrawables.push(drawable.circle.center);
976
1084
  } else if (drawable instanceof Polygon) {
977
1085
  // for( var i in drawable.vertices )
978
- for (var i = 0; i < drawable.vertices.length; i++) this.removeVertex(drawable.vertices[i], false);
1086
+ for (var i = 0; i < drawable.vertices.length; i++) {
1087
+ this.removeVertex(drawable.vertices[i], false, true);
1088
+ removedDrawables.push(drawable.vertices[i]);
1089
+ }
979
1090
  } else if (drawable instanceof Triangle) {
980
- this.removeVertex(drawable.a, false);
981
- this.removeVertex(drawable.b, false);
982
- this.removeVertex(drawable.c, false);
1091
+ this.removeVertex(drawable.a, false, true);
1092
+ this.removeVertex(drawable.b, false, true);
1093
+ this.removeVertex(drawable.c, false, true);
1094
+ removedDrawables.push(drawable.a, drawable.b, drawable.c);
983
1095
  } else if (drawable instanceof BezierPath) {
984
1096
  for (var i = 0; i < drawable.bezierCurves.length; i++) {
985
- this.removeVertex(drawable.bezierCurves[i].startPoint, false);
986
- this.removeVertex(drawable.bezierCurves[i].startControlPoint, false);
987
- this.removeVertex(drawable.bezierCurves[i].endControlPoint, false);
1097
+ this.removeVertex(drawable.bezierCurves[i].startPoint, false, true);
1098
+ this.removeVertex(drawable.bezierCurves[i].startControlPoint, false, true);
1099
+ this.removeVertex(drawable.bezierCurves[i].endControlPoint, false, true);
1100
+ removedDrawables.push(
1101
+ drawable.bezierCurves[i].startPoint,
1102
+ drawable.bezierCurves[i].startControlPoint,
1103
+ drawable.bezierCurves[i].endControlPoint
1104
+ );
988
1105
  if (i + 1 == drawable.bezierCurves.length) {
989
- this.removeVertex(drawable.bezierCurves[i].endPoint, false);
1106
+ this.removeVertex(drawable.bezierCurves[i].endPoint, false, true);
1107
+ removedDrawables.push(drawable.bezierCurves[i].endPoint);
990
1108
  }
991
1109
  }
992
1110
  } else if (drawable instanceof PBImage) {
993
- this.removeVertex(drawable.upperLeft, false);
994
- this.removeVertex(drawable.lowerRight, false);
1111
+ this.removeVertex(drawable.upperLeft, false, true);
1112
+ this.removeVertex(drawable.lowerRight, false, true);
1113
+ removedDrawables.push(drawable.upperLeft, drawable.lowerRight);
995
1114
  } else if (drawable instanceof PBText) {
996
- this.removeVertex(drawable.anchor, false);
1115
+ this.removeVertex(drawable.anchor, false, true);
1116
+ removedDrawables.push(drawable.anchor);
997
1117
  }
998
1118
  } // END removeWithVertices
999
1119
 
1000
1120
  if (redraw) {
1001
1121
  this.redraw();
1002
1122
  }
1003
- }
1004
- }
1123
+ !doNotFireEvent && this._fireContentChanged([], removedDrawables);
1124
+ wasRemoved = true;
1125
+ } // END if
1126
+ } // END for
1127
+ return wasRemoved;
1005
1128
  }
1006
1129
 
1007
1130
  /**
@@ -1012,18 +1135,20 @@ export class PlotBoilerplate {
1012
1135
  * @method removeVertex
1013
1136
  * @instance
1014
1137
  * @memberof PlotBoilerplate
1015
- * @return {void}
1138
+ * @return {boolean}
1016
1139
  **/
1017
- removeVertex(vert: Vertex, redraw?: boolean): void {
1140
+ removeVertex(vert: Vertex, redraw?: boolean, doNotFireEvent?: boolean): boolean {
1018
1141
  for (var i = 0; i < this.vertices.length; i++) {
1019
1142
  if (this.vertices[i] === vert) {
1020
1143
  this.vertices.splice(i, 1);
1021
1144
  if (redraw) {
1022
1145
  this.redraw();
1023
1146
  }
1024
- return;
1147
+ !doNotFireEvent && this._fireContentChanged([], [vert]);
1148
+ return true;
1025
1149
  }
1026
1150
  }
1151
+ return false;
1027
1152
  }
1028
1153
 
1029
1154
  /**
@@ -1039,13 +1164,16 @@ export class PlotBoilerplate {
1039
1164
  * @return {void}
1040
1165
  */
1041
1166
  removeAll(keepVertices?: boolean, triggerRedraw?: boolean) {
1167
+ let removedDrawables: Array<Drawable> = this.drawables;
1042
1168
  this.drawables = [];
1043
1169
  if (!Boolean(keepVertices)) {
1170
+ removedDrawables = removedDrawables.concat(this.vertices);
1044
1171
  this.vertices = [];
1045
1172
  }
1046
1173
  if (triggerRedraw || typeof triggerRedraw === "undefined") {
1047
1174
  this.redraw();
1048
1175
  }
1176
+ removedDrawables.length > 0 && this._fireContentChanged([], removedDrawables);
1049
1177
  }
1050
1178
 
1051
1179
  /**
@@ -1302,16 +1430,16 @@ export class PlotBoilerplate {
1302
1430
  }
1303
1431
  } else if (d instanceof Triangle) {
1304
1432
  draw.polyline([d.a, d.b, d.c], false, this.drawConfig.triangle.color, this.drawConfig.triangle.lineWidth);
1305
- if (!this.drawConfig.drawHandlePoints) d.a.attr.renderTime = d.b.attr.renderTime = d.c.attr.renderTime = renderTime;
1433
+ if (!this.drawConfig.drawHandlePoints) {
1434
+ d.a.attr.renderTime = d.b.attr.renderTime = d.c.attr.renderTime = renderTime;
1435
+ }
1306
1436
  } else if (d instanceof VEllipse) {
1307
1437
  if (this.drawConfig.drawHandleLines) {
1308
1438
  draw.setCurrentId(`${d.uid}_e0`);
1309
1439
  draw.setCurrentClassName(`${d.className}-v-line`);
1310
- // draw.line( d.center.clone().add(0,d.axis.y-d.center.y), d.axis, '#c8c8c8' );
1311
1440
  draw.handleLine(d.center.clone().add(0, d.signedRadiusV()).rotate(d.rotation, d.center), d.axis); // , "#c8c8c8");
1312
1441
  draw.setCurrentId(`${d.uid}_e1`);
1313
1442
  draw.setCurrentClassName(`${d.className}-h-line`);
1314
- // draw.line( d.center.clone().add(d.axis.x-d.center.x,0), d.axis, '#c8c8c8' );
1315
1443
  draw.handleLine(d.center.clone().add(d.signedRadiusH(), 0).rotate(d.rotation, d.center), d.axis); // , "#c8c8c8");
1316
1444
  }
1317
1445
  draw.setCurrentId(d.uid);
@@ -1332,12 +1460,6 @@ export class PlotBoilerplate {
1332
1460
  } else if (d instanceof VEllipseSector) {
1333
1461
  draw.setCurrentId(d.uid);
1334
1462
  draw.setCurrentClassName(`${d.className}`);
1335
- /* draw.ellipse( d.center,
1336
- // Math.abs(d.axis.x-d.center.x), Math.abs(d.axis.y-d.center.y),
1337
- d.radiusH(), d.radiusV(),
1338
- this.drawConfig.ellipse.color,
1339
- this.drawConfig.ellipse.lineWidth,
1340
- d.rotation ); */
1341
1463
  const data: SVGPathParams = VEllipseSector.ellipseSectorUtils.describeSVGArc(
1342
1464
  d.ellipse.center.x,
1343
1465
  d.ellipse.center.y,
@@ -1371,7 +1493,7 @@ export class PlotBoilerplate {
1371
1493
  if (!this.drawConfig.drawHandlePoints || !d.a.attr.selectable) d.a.attr.renderTime = renderTime;
1372
1494
  if (!this.drawConfig.drawHandlePoints || !d.b.attr.selectable) d.b.attr.renderTime = renderTime;
1373
1495
  } else if (d instanceof Vector) {
1374
- draw.arrow(d.a, d.b, this.drawConfig.vector.color);
1496
+ draw.arrow(d.a, d.b, this.drawConfig.vector.color, this.drawConfig.vector.lineWidth);
1375
1497
  if (this.drawConfig.drawHandlePoints && d.b.attr.selectable && d.b.attr.visible) {
1376
1498
  draw.setCurrentId(`${d.uid}_h0`);
1377
1499
  draw.setCurrentClassName(`${d.className}-handle`);