plotboilerplate 1.15.0 → 1.16.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 (153) hide show
  1. package/changelog.md +24 -0
  2. package/dist/index.esm.js +574 -428
  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 +574 -428
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +1 -1
  11. package/src/cjs/BezierPath.d.ts +33 -1
  12. package/src/cjs/BezierPath.js +80 -13
  13. package/src/cjs/BezierPath.js.map +1 -1
  14. package/src/cjs/Circle.d.ts +25 -10
  15. package/src/cjs/Circle.js +38 -33
  16. package/src/cjs/Circle.js.map +1 -1
  17. package/src/cjs/CircleSector.d.ts +27 -13
  18. package/src/cjs/CircleSector.js +38 -23
  19. package/src/cjs/CircleSector.js.map +1 -1
  20. package/src/cjs/CubicBezierCurve.d.ts +17 -1
  21. package/src/cjs/CubicBezierCurve.js +78 -79
  22. package/src/cjs/CubicBezierCurve.js.map +1 -1
  23. package/src/cjs/KeyHandler.d.ts +10 -3
  24. package/src/cjs/KeyHandler.js +28 -23
  25. package/src/cjs/KeyHandler.js.map +1 -1
  26. package/src/cjs/Line.d.ts +2 -1
  27. package/src/cjs/Line.js +19 -18
  28. package/src/cjs/Line.js.map +1 -1
  29. package/src/cjs/MouseHandler.js +43 -53
  30. package/src/cjs/MouseHandler.js.map +1 -1
  31. package/src/cjs/PBImage.d.ts +16 -1
  32. package/src/cjs/PBImage.js +13 -3
  33. package/src/cjs/PBImage.js.map +1 -1
  34. package/src/cjs/PBText.d.ts +15 -1
  35. package/src/cjs/PBText.js +11 -1
  36. package/src/cjs/PBText.js.map +1 -1
  37. package/src/cjs/PlotBoilerplate.js +1 -1
  38. package/src/cjs/PlotBoilerplate.js.map +1 -1
  39. package/src/cjs/Polygon.d.ts +16 -1
  40. package/src/cjs/Polygon.js +37 -23
  41. package/src/cjs/Polygon.js.map +1 -1
  42. package/src/cjs/Triangle.d.ts +16 -1
  43. package/src/cjs/Triangle.js +50 -54
  44. package/src/cjs/Triangle.js.map +1 -1
  45. package/src/cjs/VEllipse.d.ts +16 -1
  46. package/src/cjs/VEllipse.js +25 -12
  47. package/src/cjs/VEllipse.js.map +1 -1
  48. package/src/cjs/VEllipseSector.d.ts +15 -1
  49. package/src/cjs/VEllipseSector.js +11 -1
  50. package/src/cjs/VEllipseSector.js.map +1 -1
  51. package/src/cjs/Vector.d.ts +3 -1
  52. package/src/cjs/Vector.js +32 -36
  53. package/src/cjs/Vector.js.map +1 -1
  54. package/src/cjs/VertTuple.d.ts +15 -1
  55. package/src/cjs/VertTuple.js +14 -19
  56. package/src/cjs/VertTuple.js.map +1 -1
  57. package/src/cjs/Vertex.d.ts +25 -1
  58. package/src/cjs/Vertex.js +38 -11
  59. package/src/cjs/Vertex.js.map +1 -1
  60. package/src/cjs/VertexListeners.d.ts +12 -8
  61. package/src/cjs/VertexListeners.js +18 -25
  62. package/src/cjs/VertexListeners.js.map +1 -1
  63. package/src/cjs/utils/creategui.js +1 -1
  64. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +15 -0
  65. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +55 -28
  66. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  67. package/src/cjs/utils/io/DndFileHandler.d.ts +63 -0
  68. package/src/cjs/utils/io/DndFileHandler.js +112 -0
  69. package/src/cjs/utils/io/DndFileHandler.js.map +1 -0
  70. package/src/cjs/utils/io/FileDrop.d.ts +98 -0
  71. package/src/cjs/utils/io/FileDrop.js +142 -0
  72. package/src/cjs/utils/io/FileDrop.js.map +1 -0
  73. package/src/esm/BezierPath.d.ts +33 -1
  74. package/src/esm/BezierPath.js +80 -13
  75. package/src/esm/BezierPath.js.map +1 -1
  76. package/src/esm/Circle.d.ts +25 -10
  77. package/src/esm/Circle.js +38 -33
  78. package/src/esm/Circle.js.map +1 -1
  79. package/src/esm/CircleSector.d.ts +27 -13
  80. package/src/esm/CircleSector.js +38 -23
  81. package/src/esm/CircleSector.js.map +1 -1
  82. package/src/esm/CubicBezierCurve.d.ts +17 -1
  83. package/src/esm/CubicBezierCurve.js +78 -79
  84. package/src/esm/CubicBezierCurve.js.map +1 -1
  85. package/src/esm/KeyHandler.d.ts +10 -3
  86. package/src/esm/KeyHandler.js +28 -23
  87. package/src/esm/KeyHandler.js.map +1 -1
  88. package/src/esm/Line.d.ts +2 -1
  89. package/src/esm/Line.js +19 -18
  90. package/src/esm/Line.js.map +1 -1
  91. package/src/esm/MouseHandler.js +43 -53
  92. package/src/esm/MouseHandler.js.map +1 -1
  93. package/src/esm/PBImage.d.ts +16 -1
  94. package/src/esm/PBImage.js +13 -3
  95. package/src/esm/PBImage.js.map +1 -1
  96. package/src/esm/PBText.d.ts +15 -1
  97. package/src/esm/PBText.js +11 -1
  98. package/src/esm/PBText.js.map +1 -1
  99. package/src/esm/PlotBoilerplate.js +1 -1
  100. package/src/esm/PlotBoilerplate.js.map +1 -1
  101. package/src/esm/Polygon.d.ts +16 -1
  102. package/src/esm/Polygon.js +37 -23
  103. package/src/esm/Polygon.js.map +1 -1
  104. package/src/esm/Triangle.d.ts +16 -1
  105. package/src/esm/Triangle.js +50 -54
  106. package/src/esm/Triangle.js.map +1 -1
  107. package/src/esm/VEllipse.d.ts +16 -1
  108. package/src/esm/VEllipse.js +25 -12
  109. package/src/esm/VEllipse.js.map +1 -1
  110. package/src/esm/VEllipseSector.d.ts +15 -1
  111. package/src/esm/VEllipseSector.js +11 -1
  112. package/src/esm/VEllipseSector.js.map +1 -1
  113. package/src/esm/Vector.d.ts +3 -1
  114. package/src/esm/Vector.js +32 -36
  115. package/src/esm/Vector.js.map +1 -1
  116. package/src/esm/VertTuple.d.ts +15 -1
  117. package/src/esm/VertTuple.js +14 -19
  118. package/src/esm/VertTuple.js.map +1 -1
  119. package/src/esm/Vertex.d.ts +25 -1
  120. package/src/esm/Vertex.js +38 -11
  121. package/src/esm/Vertex.js.map +1 -1
  122. package/src/esm/VertexListeners.d.ts +12 -8
  123. package/src/esm/VertexListeners.js +18 -25
  124. package/src/esm/VertexListeners.js.map +1 -1
  125. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +15 -0
  126. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +54 -28
  127. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  128. package/src/esm/utils/io/DndFileHandler.d.ts +63 -0
  129. package/src/esm/utils/io/DndFileHandler.js +106 -0
  130. package/src/esm/utils/io/DndFileHandler.js.map +1 -0
  131. package/src/esm/utils/io/FileDrop.d.ts +98 -0
  132. package/src/esm/utils/io/FileDrop.js +136 -0
  133. package/src/esm/utils/io/FileDrop.js.map +1 -0
  134. package/src/ts/BezierPath.ts +96 -11
  135. package/src/ts/Circle.ts +213 -200
  136. package/src/ts/CircleSector.ts +171 -141
  137. package/src/ts/CubicBezierCurve.ts +777 -810
  138. package/src/ts/KeyHandler.ts +221 -212
  139. package/src/ts/Line.ts +77 -80
  140. package/src/ts/MouseHandler.ts +356 -368
  141. package/src/ts/PBImage.ts +81 -68
  142. package/src/ts/PBText.ts +20 -1
  143. package/src/ts/PlotBoilerplate.ts +1 -1
  144. package/src/ts/Polygon.ts +48 -22
  145. package/src/ts/Triangle.ts +484 -489
  146. package/src/ts/VEllipse.ts +36 -11
  147. package/src/ts/VEllipseSector.ts +20 -1
  148. package/src/ts/Vector.ts +164 -160
  149. package/src/ts/VertTuple.ts +333 -338
  150. package/src/ts/Vertex.ts +52 -10
  151. package/src/ts/VertexListeners.ts +248 -266
  152. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +61 -30
  153. package/src/ts/utils/io/FileDrop.ts +178 -0
@@ -118,7 +118,11 @@ export class BezierPathInteractionHelper {
118
118
  private currentA: Vertex; // Position on the curve
119
119
  private currentB: Vertex; // mouse/touch position
120
120
 
121
+ private _mouseHandler: MouseHandler;
122
+ private _touchHandler: AlloyFinger;
121
123
  private _keyHandler: KeyHandler;
124
+ private _mouseEnterListener: () => void;
125
+ private _mouseLeaveListener: () => void;
122
126
 
123
127
  /**
124
128
  * Pre: all paths must have been added to the PlotBoilerplate's drawable buffer (use the add(Drawable) function).
@@ -173,8 +177,16 @@ export class BezierPathInteractionHelper {
173
177
  this.addPath(paths[i]);
174
178
  }
175
179
 
176
- this._installMouseListener();
177
- this._installTouchListener();
180
+ this._mouseEnterListener = () => {
181
+ this.mouseIsOver = true;
182
+ };
183
+ this._mouseLeaveListener = () => {
184
+ this.mouseIsOver = false;
185
+ this._clearMoveEvent();
186
+ };
187
+
188
+ this._mouseHandler = this._installMouseListener();
189
+ this._touchHandler = this._installTouchListener();
178
190
  this._keyHandler = this._installKeyListener();
179
191
 
180
192
  // Paths might have changed by auto-adjustment.
@@ -249,6 +261,28 @@ export class BezierPathInteractionHelper {
249
261
  this._handleMoveEvent(this.currentB.x, this.currentB.y);
250
262
  }
251
263
 
264
+ /**
265
+ * This function should invalidate any installed listeners and invalidate this object.
266
+ * After calling this function the object might not hold valid data any more and
267
+ * should not be used any more.
268
+ *
269
+ * @method destroy
270
+ * @instance
271
+ * @memberof BezierPathInteractionHelper
272
+ * @return {void}
273
+ **/
274
+ destroy(): void {
275
+ for (var i = 0; i < this.paths.length; i++) {
276
+ this._removeDefaultPathListeners(this.paths[i]);
277
+ // removePathVertexDragStartListeners(this.paths[i], listener);
278
+ }
279
+ this.paths = [];
280
+ this.pb.canvas.removeEventListener("mouseenter", this._mouseEnterListener);
281
+ this.pb.canvas.removeEventListener("mouseleave", this._mouseLeaveListener);
282
+ this._mouseHandler.destroy();
283
+ this._keyHandler.destroy();
284
+ }
285
+
252
286
  // +---------------------------------------------------------------------------------
253
287
  // | A helper function to locate a given path instance inside the array.
254
288
  // |
@@ -335,6 +369,7 @@ export class BezierPathInteractionHelper {
335
369
  curStartControl = path.bezierCurves[i + 1].startControlPoint;
336
370
  }
337
371
  } else {
372
+ // TODO: remove drag listener from removed vertex!
338
373
  deletedVertIndices.push(i);
339
374
  }
340
375
  }
@@ -361,6 +396,7 @@ export class BezierPathInteractionHelper {
361
396
  private _replacePathAt(pathIndex: number, newPath: BezierPath): void {
362
397
  const oldPath: BezierPath = this.paths[pathIndex];
363
398
  this.pb.remove(oldPath, false, true); // Remove with vertices
399
+ oldPath.destroy();
364
400
  this._removeDefaultPathListeners(oldPath);
365
401
  BezierPathInteractionHelper.setPathAutoAdjust(newPath);
366
402
  this.paths[pathIndex] = newPath;
@@ -396,36 +432,38 @@ export class BezierPathInteractionHelper {
396
432
  // +---------------------------------------------------------------------------------
397
433
  // | Called once upon initialization.
398
434
  // +-------------------------------
399
- private _installTouchListener(): void {
435
+ private _installTouchListener(): AlloyFinger {
400
436
  var _self: BezierPathInteractionHelper = this;
401
437
  const afProps = {
402
438
  // Todo: which event types does AlloyFinger use?
403
- touchStart: function (e: TouchEvent) {
439
+ touchStart: function (_event: TouchEvent) {
404
440
  _self.mouseIsOver = true;
405
441
  },
406
- touchMove: function (e: TouchEvent) {
407
- if (_self.pb.getDraggedElementCount() == 0 && e.touches.length > 0) {
442
+ touchMove: function (event: TouchEvent) {
443
+ if (_self.pb.getDraggedElementCount() == 0 && event.touches.length > 0) {
408
444
  // console.log('touchmove');
409
- _self._handleMoveEvent(e.touches[0].clientX, e.touches[0].clientY);
445
+ _self._handleMoveEvent(event.touches[0].clientX, event.touches[0].clientY);
410
446
  }
411
447
  },
412
- touchEnd: function (e: TouchEvent) {
448
+ touchEnd: function (_event: TouchEvent) {
413
449
  _self.mouseIsOver = false;
414
450
  _self._clearMoveEvent();
415
451
  }
416
452
  };
417
453
  // new AlloyFinger(this.pb.canvas, afProps);
418
- if (window["createAlloyFinger"])
419
- window["createAlloyFinger"](this.pb.eventCatcher ? this.pb.eventCatcher : this.pb.canvas, afProps);
420
- else new AlloyFinger(this.pb.eventCatcher ? this.pb.eventCatcher : this.pb.canvas, afProps);
454
+ if (window["createAlloyFinger"]) {
455
+ return window["createAlloyFinger"](this.pb.eventCatcher ? this.pb.eventCatcher : this.pb.canvas, afProps);
456
+ } else {
457
+ return new AlloyFinger(this.pb.eventCatcher ? this.pb.eventCatcher : this.pb.canvas, afProps);
458
+ }
421
459
  }
422
460
 
423
461
  // +---------------------------------------------------------------------------------
424
462
  // | Called once upon initialization.
425
463
  // +-------------------------------
426
- private _installMouseListener(): void {
464
+ private _installMouseListener(): MouseHandler {
427
465
  var _self: BezierPathInteractionHelper = this;
428
- new MouseHandler(this.pb.canvas)
466
+ var mouseHandler = new MouseHandler(this.pb.canvas)
429
467
  .up(function (e: XMouseEvent) {
430
468
  if (e.params.wasDragged) return;
431
469
  if (_self._keyHandler.isDown("shift")) return;
@@ -470,13 +508,16 @@ export class BezierPathInteractionHelper {
470
508
  _self._handleMoveEvent(e.params.pos.x, e.params.pos.y);
471
509
  });
472
510
 
473
- _self.pb.canvas.addEventListener("mouseenter", function () {
474
- _self.mouseIsOver = true;
475
- });
476
- _self.pb.canvas.addEventListener("mouseleave", function () {
477
- _self.mouseIsOver = false;
478
- _self._clearMoveEvent();
479
- });
511
+ // _self.pb.canvas.addEventListener("mouseenter", function () {
512
+ // _self.mouseIsOver = true;
513
+ // });
514
+ // _self.pb.canvas.addEventListener("mouseleave", function () {
515
+ // _self.mouseIsOver = false;
516
+ // _self._clearMoveEvent();
517
+ // });
518
+ this.pb.canvas.addEventListener("mouseenter", this._mouseEnterListener);
519
+ this.pb.canvas.addEventListener("mouseleave", this._mouseLeaveListener);
520
+ return mouseHandler;
480
521
  }
481
522
 
482
523
  // +---------------------------------------------------------------------------------
@@ -491,16 +532,6 @@ export class BezierPathInteractionHelper {
491
532
  });
492
533
  }
493
534
 
494
- // +---------------------------------------------------------------------------------
495
- // | Adds vertex listeners to all path points.
496
- // |
497
- // | @param {BezierPath} path - The path to add vertex listeners to.
498
- // +-------------------------------
499
- // TODO: THIS CAN BE REMOVED?
500
- // private _addDefaultPathListeners( path:BezierPath ) : void {
501
- // BezierPathInteractionHelper.addPathVertexDragListeners( path, this._updateMinDistance );
502
- // };
503
-
504
535
  // +---------------------------------------------------------------------------------
505
536
  // | Removes vertex listeners from all path points.
506
537
  // |
@@ -0,0 +1,178 @@
1
+ /**
2
+ * A basic IO handler for file drop (Drag-and-drop).
3
+ *
4
+ * Example use:
5
+ * ```javascript
6
+ * var body = document.getElememtByTagName("body")[0];
7
+ * var fileDrop = new FileDrop(body);
8
+ * fileDrop.onFileJSONDropped(function (jsonObject) {
9
+ * console.log("jsonObject", jsonObject);
10
+ * });
11
+ * ```
12
+ *
13
+ * @author Ikaros Kappler
14
+ * @date 2021-10-13
15
+ * @modified 2022-01-31 (ported from the ngdg project, then generalized)
16
+ * @version 2.0.0
17
+ */
18
+
19
+ type IDroppedCallbackJSON = (jsonData: object) => void;
20
+ type IDroppedCallbackText = (textData: string) => void;
21
+ type IDroppedCallbackBinary = (binaryData: Blob, file: File) => void;
22
+
23
+ export class FileDrop {
24
+ /**
25
+ * The 'dropzone' element.
26
+ * @private
27
+ * @memberof FileDrop
28
+ * @member {HTMLElement}
29
+ */
30
+ private element: HTMLElement;
31
+
32
+ /**
33
+ * The JSON file drop callback.
34
+ * @private
35
+ * @memberof FileDrop
36
+ * @member {HTMLElement}
37
+ */
38
+ private fileDroppedCallbackJSON: IDroppedCallbackJSON | null;
39
+
40
+ /**
41
+ * The text file drop callback.
42
+ * @private
43
+ * @memberof FileDrop
44
+ * @member {HTMLElement}
45
+ */
46
+ private fileDroppedCallbackText: IDroppedCallbackText | null;
47
+
48
+ /**
49
+ * The binary file drop callback.
50
+ * @private
51
+ * @memberof FileDrop
52
+ * @member {HTMLElement}
53
+ */
54
+ private fileDroppedCallbackBinary: IDroppedCallbackBinary | null;
55
+
56
+ /**
57
+ *
58
+ * @param {HTMLElement} element - The element you wish to operate as the drop zone (like <body/>).
59
+ */
60
+ constructor(element: HTMLElement) {
61
+ this.element = element;
62
+
63
+ // Init the drop listeners
64
+ element.addEventListener("drop", this.handleDropEvent.bind(this));
65
+ element.addEventListener("dragover", this.handleDragOverEvent.bind(this));
66
+ element.addEventListener("dragleave", this.handleDragLeaveEvent.bind(this));
67
+ }
68
+
69
+ /**
70
+ * Install the JSON (MIME type json*) file drop callback. Note than only one callback can be installed
71
+ * in this implementation. Calling this method multiple times will overwrite previously
72
+ * installed listeners.
73
+ *
74
+ * The callback will receive the dropped file content as an object (parsed JSON).
75
+ *
76
+ * @param {(data:object)=>void} callback
77
+ */
78
+ onFileJSONDropped(callback: IDroppedCallbackJSON) {
79
+ this.fileDroppedCallbackJSON = callback;
80
+ }
81
+
82
+ /**
83
+ * Install the text file (MIME type text/plain) drop callback. Note than only one callback can be installed
84
+ * in this implementation. Calling this method multiple times will overwrite previously
85
+ * installed listeners.
86
+ *
87
+ * The callback will receive the dropped file content as a string.
88
+ *
89
+ * @param {(data:object)=>void} callback
90
+ */
91
+ onFileTextDropped(callback: IDroppedCallbackText) {
92
+ this.fileDroppedCallbackText = callback;
93
+ }
94
+
95
+ /**
96
+ * Internally handle a drop event.
97
+ *
98
+ * @param {DragEvent} event
99
+ * @returns {void}
100
+ */
101
+ private handleDropEvent = (event: DragEvent) => {
102
+ event.preventDefault();
103
+ event.stopPropagation();
104
+ this.element.style.opacity = "1.0";
105
+
106
+ if (!event.dataTransfer.files || event.dataTransfer.files.length === 0) {
107
+ // No files were dropped
108
+ return;
109
+ }
110
+ if (event.dataTransfer.files.length > 1) {
111
+ // Multiple file drop is not nupported
112
+ return;
113
+ }
114
+ if (!this.fileDroppedCallbackJSON) {
115
+ // No handling callback defined.
116
+ return;
117
+ }
118
+ if (event.dataTransfer.files[0]) {
119
+ const file: File = event.dataTransfer.files[0];
120
+ // console.log("file", file);
121
+ if (file.type.match(/json.*/) && this.fileDroppedCallbackJSON) {
122
+ var reader = new FileReader();
123
+ reader.onload = (readEvent: ProgressEvent<FileReader>) => {
124
+ // Finished reading file data.
125
+ const jsonObject: object = JSON.parse(readEvent.target.result as string);
126
+ // TODO: what happens on fail?
127
+ this.fileDroppedCallbackJSON(jsonObject);
128
+ };
129
+ reader.readAsText(file); // start reading the file data.
130
+ } else if (file.type.match(/text\/plain.*/) && this.fileDroppedCallbackText) {
131
+ var reader = new FileReader();
132
+ reader.onload = (readEvent: ProgressEvent<FileReader>) => {
133
+ // Finished reading file data.
134
+ this.fileDroppedCallbackText(readEvent.target.result as string);
135
+ };
136
+ reader.readAsText(file); // start reading the file data.
137
+ } else if (this.fileDroppedCallbackBinary) {
138
+ var reader = new FileReader();
139
+ reader.onload = (readEvent: ProgressEvent<FileReader>) => {
140
+ // Finished reading file data.
141
+ this.fileDroppedCallbackBinary(new Blob([readEvent.target.result]), file);
142
+ };
143
+ reader.readAsBinaryString(file); // start reading the file data.
144
+ }
145
+ }
146
+ };
147
+
148
+ /**
149
+ * Toggles the drop sensitive element's opacity to 0.5.
150
+ *
151
+ * @param {DragEvent} event - The event.
152
+ */
153
+ private handleDragOverEvent = (event: DragEvent) => {
154
+ event.preventDefault();
155
+ event.stopPropagation();
156
+ this.element.style.opacity = "0.5";
157
+ };
158
+
159
+ /**
160
+ * Restored the drop sensitive element's opacity back to 1.0.
161
+ *
162
+ * @param {DragEvent} event - The event.
163
+ */
164
+ private handleDragLeaveEvent = (event: DragEvent) => {
165
+ event.preventDefault();
166
+ event.stopPropagation();
167
+ this.element.style.opacity = "1.0";
168
+ };
169
+
170
+ /**
171
+ * Removes all listeners (drop, dragover and dragleave).
172
+ */
173
+ destroy() {
174
+ this.element.removeEventListener("drop", this.handleDropEvent);
175
+ this.element.removeEventListener("dragover", this.handleDragOverEvent);
176
+ this.element.removeEventListener("dragleave", this.handleDragLeaveEvent);
177
+ }
178
+ }