js-draw 0.2.2 → 0.3.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 (78) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +2 -2
  3. package/dist/bundle.js +1 -1
  4. package/dist/src/EditorImage.js +0 -1
  5. package/dist/src/components/builders/FreehandLineBuilder.js +18 -9
  6. package/dist/src/components/lib.d.ts +2 -0
  7. package/dist/src/components/lib.js +2 -0
  8. package/dist/src/lib.d.ts +5 -1
  9. package/dist/src/lib.js +5 -1
  10. package/dist/src/rendering/Display.js +2 -2
  11. package/dist/src/rendering/caching/RenderingCacheNode.js +2 -1
  12. package/dist/src/rendering/renderers/CanvasRenderer.js +6 -6
  13. package/dist/src/toolbar/HTMLToolbar.d.ts +4 -1
  14. package/dist/src/toolbar/HTMLToolbar.js +29 -31
  15. package/dist/src/toolbar/icons.d.ts +1 -1
  16. package/dist/src/toolbar/icons.js +4 -0
  17. package/dist/src/toolbar/lib.d.ts +3 -0
  18. package/dist/src/toolbar/lib.js +4 -0
  19. package/dist/src/toolbar/makeColorInput.js +2 -2
  20. package/dist/src/toolbar/types.d.ts +0 -4
  21. package/dist/src/toolbar/types.js +1 -5
  22. package/dist/src/toolbar/widgets/{EraserWidget.d.ts → EraserToolWidget.d.ts} +1 -1
  23. package/dist/src/toolbar/widgets/{EraserWidget.js → EraserToolWidget.js} +1 -1
  24. package/dist/src/toolbar/widgets/{PenWidget.d.ts → PenToolWidget.d.ts} +2 -3
  25. package/dist/src/toolbar/widgets/{PenWidget.js → PenToolWidget.js} +6 -7
  26. package/dist/src/toolbar/widgets/{SelectionWidget.d.ts → SelectionToolWidget.d.ts} +1 -1
  27. package/dist/src/toolbar/widgets/{SelectionWidget.js → SelectionToolWidget.js} +1 -1
  28. package/dist/src/toolbar/widgets/lib.d.ts +8 -0
  29. package/dist/src/toolbar/widgets/lib.js +8 -0
  30. package/dist/src/tools/BaseTool.d.ts +0 -2
  31. package/dist/src/tools/Eraser.d.ts +0 -2
  32. package/dist/src/tools/Eraser.js +0 -2
  33. package/dist/src/tools/PanZoom.d.ts +0 -2
  34. package/dist/src/tools/PanZoom.js +0 -2
  35. package/dist/src/tools/Pen.d.ts +8 -9
  36. package/dist/src/tools/Pen.js +15 -9
  37. package/dist/src/tools/PipetteTool.d.ts +0 -2
  38. package/dist/src/tools/PipetteTool.js +0 -2
  39. package/dist/src/tools/SelectionTool.d.ts +0 -2
  40. package/dist/src/tools/SelectionTool.js +4 -3
  41. package/dist/src/tools/TextTool.d.ts +0 -2
  42. package/dist/src/tools/TextTool.js +0 -2
  43. package/dist/src/tools/ToolController.d.ts +7 -11
  44. package/dist/src/tools/ToolController.js +28 -16
  45. package/dist/src/tools/ToolEnabledGroup.js +1 -1
  46. package/dist/src/tools/UndoRedoShortcut.d.ts +0 -2
  47. package/dist/src/tools/UndoRedoShortcut.js +3 -2
  48. package/dist/src/tools/lib.d.ts +12 -0
  49. package/dist/src/tools/lib.js +12 -0
  50. package/package.json +1 -1
  51. package/src/EditorImage.ts +0 -1
  52. package/src/components/builders/FreehandLineBuilder.ts +27 -17
  53. package/src/components/lib.ts +3 -0
  54. package/src/lib.ts +5 -1
  55. package/src/rendering/Display.ts +2 -2
  56. package/src/rendering/caching/RenderingCacheNode.ts +3 -1
  57. package/src/rendering/renderers/CanvasRenderer.ts +6 -6
  58. package/src/toolbar/HTMLToolbar.ts +34 -37
  59. package/src/toolbar/icons.ts +5 -1
  60. package/src/toolbar/lib.ts +4 -0
  61. package/src/toolbar/makeColorInput.ts +1 -2
  62. package/src/toolbar/types.ts +0 -4
  63. package/src/toolbar/widgets/{EraserWidget.ts → EraserToolWidget.ts} +1 -1
  64. package/src/toolbar/widgets/{PenWidget.ts → PenToolWidget.ts} +10 -9
  65. package/src/toolbar/widgets/{SelectionWidget.ts → SelectionToolWidget.ts} +1 -1
  66. package/src/toolbar/widgets/lib.ts +10 -0
  67. package/src/tools/BaseTool.ts +0 -3
  68. package/src/tools/Eraser.ts +0 -2
  69. package/src/tools/PanZoom.ts +0 -2
  70. package/src/tools/Pen.ts +21 -15
  71. package/src/tools/PipetteTool.ts +0 -3
  72. package/src/tools/SelectionTool.test.ts +1 -2
  73. package/src/tools/SelectionTool.ts +5 -3
  74. package/src/tools/TextTool.ts +0 -2
  75. package/src/tools/ToolController.ts +34 -17
  76. package/src/tools/ToolEnabledGroup.ts +1 -1
  77. package/src/tools/UndoRedoShortcut.ts +4 -4
  78. package/src/tools/lib.ts +17 -0
@@ -302,7 +302,6 @@ export class ImageNode {
302
302
  this.children = [];
303
303
  }
304
304
  render(renderer, visibleRect) {
305
- // Don't render components that are < 0.1% of the viewport.
306
305
  const leaves = this.getLeavesIntersectingRegion(visibleRect, rect => renderer.isTooSmallToRender(rect));
307
306
  sortLeavesByZIndex(leaves);
308
307
  for (const leaf of leaves) {
@@ -8,9 +8,8 @@ import Viewport from '../../Viewport';
8
8
  export const makeFreehandLineBuilder = (initialPoint, viewport) => {
9
9
  // Don't smooth if input is more than ± 7 pixels from the true curve, do smooth if
10
10
  // less than ± 2 px from the curve.
11
- const canvasTransform = viewport.screenToCanvasTransform;
12
- const maxSmoothingDist = canvasTransform.transformVec3(Vec2.unitX).magnitude() * 7;
13
- const minSmoothingDist = canvasTransform.transformVec3(Vec2.unitX).magnitude() * 2;
11
+ const maxSmoothingDist = viewport.getSizeOfPixelOnCanvas() * 7;
12
+ const minSmoothingDist = viewport.getSizeOfPixelOnCanvas() * 2;
14
13
  return new FreehandLineBuilder(initialPoint, minSmoothingDist, maxSmoothingDist);
15
14
  };
16
15
  // Handles stroke smoothing and creates Strokes from user/stylus input.
@@ -27,6 +26,7 @@ export default class FreehandLineBuilder {
27
26
  this.isFirstSegment = true;
28
27
  this.pathStartConnector = null;
29
28
  this.mostRecentConnector = null;
29
+ this.lastExitingVec = null;
30
30
  this.currentCurve = null;
31
31
  this.lastPoint = this.startPoint;
32
32
  this.upperSegments = [];
@@ -34,6 +34,7 @@ export default class FreehandLineBuilder {
34
34
  this.buffer = [this.startPoint.pos];
35
35
  this.momentum = Vec2.zero;
36
36
  this.currentCurve = null;
37
+ this.curveStartWidth = startPoint.width;
37
38
  this.bbox = new Rect2(this.startPoint.pos.x, this.startPoint.pos.y, 0, 0);
38
39
  }
39
40
  getBBox() {
@@ -122,7 +123,11 @@ export default class FreehandLineBuilder {
122
123
  return this.previewStroke();
123
124
  }
124
125
  roundPoint(point) {
125
- return Viewport.roundPoint(point, this.minFitAllowed);
126
+ let minFit = Math.min(this.minFitAllowed, this.curveStartWidth / 2);
127
+ if (minFit < 1e-10) {
128
+ minFit = this.minFitAllowed;
129
+ }
130
+ return Viewport.roundPoint(point, minFit);
126
131
  }
127
132
  finalizeCurrentCurve() {
128
133
  // Case where no points have been added
@@ -227,10 +232,13 @@ export default class FreehandLineBuilder {
227
232
  const computeBoundaryCurve = (direction, halfVec) => {
228
233
  return new Bezier(startPt.plus(startVec.times(direction)), controlPoint.plus(halfVec.times(direction)), endPt.plus(endVec.times(direction)));
229
234
  };
230
- const upperBoundary = computeBoundaryCurve(1, halfVec);
231
- const lowerBoundary = computeBoundaryCurve(-1, halfVec);
235
+ const boundariesIntersect = () => {
236
+ const upperBoundary = computeBoundaryCurve(1, halfVec);
237
+ const lowerBoundary = computeBoundaryCurve(-1, halfVec);
238
+ return upperBoundary.intersects(lowerBoundary).length > 0;
239
+ };
232
240
  // If the boundaries have two intersections, increasing the half vector's length could fix this.
233
- if (upperBoundary.intersects(lowerBoundary).length > 0) {
241
+ if (boundariesIntersect()) {
234
242
  halfVec = halfVec.times(2);
235
243
  }
236
244
  // Each starts at startPt ± startVec
@@ -274,7 +282,7 @@ export default class FreehandLineBuilder {
274
282
  console.warn('Discarding NaN point.', newPoint);
275
283
  return;
276
284
  }
277
- const threshold = Math.min(this.lastPoint.width, newPoint.width) / 4;
285
+ const threshold = Math.min(this.lastPoint.width, newPoint.width) / 3;
278
286
  const shouldSnapToInitial = this.startPoint.pos.minus(newPoint.pos).magnitude() < threshold
279
287
  && this.isFirstSegment;
280
288
  // Snap to the starting point if the stroke is contained within a small ball centered
@@ -361,7 +369,8 @@ export default class FreehandLineBuilder {
361
369
  }
362
370
  return true;
363
371
  };
364
- if (this.buffer.length > 3) {
372
+ const approxCurveLen = controlPoint.minus(segmentStart).magnitude() + segmentEnd.minus(controlPoint).magnitude();
373
+ if (this.buffer.length > 3 && approxCurveLen > this.curveEndWidth / 2) {
365
374
  if (!curveMatchesPoints(this.currentCurve)) {
366
375
  // Use a curve that better fits the points
367
376
  this.currentCurve = prevCurve;
@@ -1,3 +1,5 @@
1
+ export * from './builders/types';
2
+ export { makeFreehandLineBuilder } from './builders/FreehandLineBuilder';
1
3
  import AbstractComponent from './AbstractComponent';
2
4
  import Stroke from './Stroke';
3
5
  import Text from './Text';
@@ -1,3 +1,5 @@
1
+ export * from './builders/types';
2
+ export { makeFreehandLineBuilder } from './builders/FreehandLineBuilder';
1
3
  import AbstractComponent from './AbstractComponent';
2
4
  import Stroke from './Stroke';
3
5
  import Text from './Text';
package/dist/src/lib.d.ts CHANGED
@@ -13,13 +13,17 @@
13
13
  * @packageDocumentation
14
14
  */
15
15
  import Editor from './Editor';
16
- export { EditorEventType } from './types';
16
+ export { default as EditorImage } from './EditorImage';
17
+ export * from './types';
17
18
  export { default as getLocalizationTable } from './localizations/getLocalizationTable';
18
19
  export * from './localization';
19
20
  export { default as Color4 } from './Color4';
20
21
  export * from './math/lib';
21
22
  export * from './components/lib';
22
23
  export * from './commands/lib';
24
+ export * from './tools/lib';
25
+ export * from './toolbar/lib';
26
+ export { default as Pointer, PointerDevice } from './Pointer';
23
27
  export { default as HTMLToolbar } from './toolbar/HTMLToolbar';
24
28
  export { Editor };
25
29
  export default Editor;
package/dist/src/lib.js CHANGED
@@ -13,13 +13,17 @@
13
13
  * @packageDocumentation
14
14
  */
15
15
  import Editor from './Editor';
16
- export { EditorEventType } from './types';
16
+ export { default as EditorImage } from './EditorImage';
17
+ export * from './types';
17
18
  export { default as getLocalizationTable } from './localizations/getLocalizationTable';
18
19
  export * from './localization';
19
20
  export { default as Color4 } from './Color4';
20
21
  export * from './math/lib';
21
22
  export * from './components/lib';
22
23
  export * from './commands/lib';
24
+ export * from './tools/lib';
25
+ export * from './toolbar/lib';
26
+ export { default as Pointer, PointerDevice } from './Pointer';
23
27
  export { default as HTMLToolbar } from './toolbar/HTMLToolbar';
24
28
  export { Editor };
25
29
  export default Editor;
@@ -71,8 +71,8 @@ export default class Display {
71
71
  return this.dryInkRenderer.canRenderFromWithoutDataLoss(renderer);
72
72
  },
73
73
  blockResolution: cacheBlockResolution,
74
- cacheSize: 500 * 500 * 4 * 150,
75
- maxScale: 1.5,
74
+ cacheSize: 600 * 600 * 4 * 120,
75
+ maxScale: 1.4,
76
76
  minComponentsPerCache: 45,
77
77
  minComponentsToUseCache: 105,
78
78
  });
@@ -177,9 +177,10 @@ export default class RenderingCacheNode {
177
177
  }
178
178
  else {
179
179
  // Determine whether we already have rendered the items
180
+ const tooSmallToRender = (rect) => rect.w / this.region.w < 1 / this.cacheState.props.blockResolution.x;
180
181
  const leaves = [];
181
182
  for (const item of items) {
182
- leaves.push(...item.getLeavesIntersectingRegion(this.region, rect => rect.w / this.region.w < 2 / this.cacheState.props.blockResolution.x));
183
+ leaves.push(...item.getLeavesIntersectingRegion(this.region, tooSmallToRender));
183
184
  }
184
185
  sortLeavesByZIndex(leaves);
185
186
  const leavesByIds = this.computeSortedByLeafIds(leaves);
@@ -37,14 +37,14 @@ export default class CanvasRenderer extends AbstractRenderer {
37
37
  // Set parameters for lower/higher quality rendering
38
38
  setDraftMode(draftMode) {
39
39
  if (draftMode) {
40
- this.minSquareCurveApproxDist = 64;
41
- this.minRenderSizeBothDimens = 8;
42
- this.minRenderSizeAnyDimen = 2;
40
+ this.minSquareCurveApproxDist = 9;
41
+ this.minRenderSizeBothDimens = 2;
42
+ this.minRenderSizeAnyDimen = 0.5;
43
43
  }
44
44
  else {
45
- this.minSquareCurveApproxDist = 1;
46
- this.minRenderSizeBothDimens = 0.5;
47
- this.minRenderSizeAnyDimen = 0;
45
+ this.minSquareCurveApproxDist = 0.5;
46
+ this.minRenderSizeBothDimens = 0.3;
47
+ this.minRenderSizeAnyDimen = 1e-5;
48
48
  }
49
49
  }
50
50
  displaySize() {
@@ -1,16 +1,19 @@
1
1
  import Editor from '../Editor';
2
2
  import { ToolbarLocalization } from './localization';
3
3
  import { ActionButtonIcon } from './types';
4
+ import BaseWidget from './widgets/BaseWidget';
4
5
  export declare const toolbarCSSPrefix = "toolbar-";
5
6
  export default class HTMLToolbar {
6
7
  private editor;
7
8
  private localizationTable;
8
9
  private container;
9
10
  private static colorisStarted;
11
+ private updateColoris;
10
12
  constructor(editor: Editor, parent: HTMLElement, localizationTable?: ToolbarLocalization);
11
13
  setupColorPickers(): void;
14
+ addWidget(widget: BaseWidget): void;
12
15
  addActionButton(title: string | ActionButtonIcon, command: () => void, parent?: Element): HTMLButtonElement;
13
- private addUndoRedoButtons;
16
+ addUndoRedoButtons(): void;
14
17
  addDefaultToolWidgets(): void;
15
18
  addDefaultActionButtons(): void;
16
19
  }
@@ -1,24 +1,23 @@
1
- import { ToolType } from '../tools/ToolController';
2
1
  import { EditorEventType } from '../types';
3
2
  import { coloris, init as colorisInit } from '@melloware/coloris';
4
3
  import Color4 from '../Color4';
5
- import Pen from '../tools/Pen';
6
- import Eraser from '../tools/Eraser';
7
4
  import SelectionTool from '../tools/SelectionTool';
8
5
  import { defaultToolbarLocalization } from './localization';
9
6
  import { makeRedoIcon, makeUndoIcon } from './icons';
10
7
  import PanZoom from '../tools/PanZoom';
11
8
  import TextTool from '../tools/TextTool';
12
- import PenWidget from './widgets/PenWidget';
13
- import EraserWidget from './widgets/EraserWidget';
14
- import { SelectionWidget } from './widgets/SelectionWidget';
9
+ import PenToolWidget from './widgets/PenToolWidget';
10
+ import EraserWidget from './widgets/EraserToolWidget';
11
+ import SelectionToolWidget from './widgets/SelectionToolWidget';
15
12
  import TextToolWidget from './widgets/TextToolWidget';
16
13
  import HandToolWidget from './widgets/HandToolWidget';
14
+ import { EraserTool, PenTool } from '../tools/lib';
17
15
  export const toolbarCSSPrefix = 'toolbar-';
18
16
  export default class HTMLToolbar {
19
17
  constructor(editor, parent, localizationTable = defaultToolbarLocalization) {
20
18
  this.editor = editor;
21
19
  this.localizationTable = localizationTable;
20
+ this.updateColoris = null;
22
21
  this.container = document.createElement('div');
23
22
  this.container.classList.add(`${toolbarCSSPrefix}root`);
24
23
  this.container.setAttribute('role', 'toolbar');
@@ -31,6 +30,11 @@ export default class HTMLToolbar {
31
30
  }
32
31
  // @internal
33
32
  setupColorPickers() {
33
+ // Much of the setup only needs to be done once.
34
+ if (this.updateColoris) {
35
+ this.updateColoris();
36
+ return;
37
+ }
34
38
  const closePickerOverlay = document.createElement('div');
35
39
  closePickerOverlay.className = `${toolbarCSSPrefix}closeColorPickerOverlay`;
36
40
  this.editor.createHTMLOverlay(closePickerOverlay);
@@ -56,6 +60,7 @@ export default class HTMLToolbar {
56
60
  });
57
61
  };
58
62
  initColoris();
63
+ this.updateColoris = initColoris;
59
64
  const addColorToSwatch = (newColor) => {
60
65
  let alreadyPresent = false;
61
66
  for (const color of swatches) {
@@ -86,6 +91,12 @@ export default class HTMLToolbar {
86
91
  }
87
92
  });
88
93
  }
94
+ // Adds an `ActionButtonWidget` or `BaseToolWidget`. The widget should not have already have a parent
95
+ // (i.e. its `addTo` method should not have been called).
96
+ addWidget(widget) {
97
+ widget.addTo(this.container);
98
+ this.setupColorPickers();
99
+ }
89
100
  addActionButton(title, command, parent) {
90
101
  const button = document.createElement('button');
91
102
  button.classList.add(`${toolbarCSSPrefix}button`);
@@ -133,36 +144,23 @@ export default class HTMLToolbar {
133
144
  }
134
145
  addDefaultToolWidgets() {
135
146
  const toolController = this.editor.toolController;
136
- for (const tool of toolController.getMatchingTools(ToolType.Pen)) {
137
- if (!(tool instanceof Pen)) {
138
- throw new Error('All `Pen` tools must have kind === ToolType.Pen');
139
- }
140
- const widget = new PenWidget(this.editor, tool, this.localizationTable);
141
- widget.addTo(this.container);
147
+ for (const tool of toolController.getMatchingTools(PenTool)) {
148
+ const widget = new PenToolWidget(this.editor, tool, this.localizationTable);
149
+ this.addWidget(widget);
142
150
  }
143
- for (const tool of toolController.getMatchingTools(ToolType.Eraser)) {
144
- if (!(tool instanceof Eraser)) {
145
- throw new Error('All Erasers must have kind === ToolType.Eraser!');
146
- }
147
- (new EraserWidget(this.editor, tool, this.localizationTable)).addTo(this.container);
151
+ for (const tool of toolController.getMatchingTools(EraserTool)) {
152
+ this.addWidget(new EraserWidget(this.editor, tool, this.localizationTable));
148
153
  }
149
- for (const tool of toolController.getMatchingTools(ToolType.Selection)) {
150
- if (!(tool instanceof SelectionTool)) {
151
- throw new Error('All SelectionTools must have kind === ToolType.Selection');
152
- }
153
- (new SelectionWidget(this.editor, tool, this.localizationTable)).addTo(this.container);
154
+ for (const tool of toolController.getMatchingTools(SelectionTool)) {
155
+ this.addWidget(new SelectionToolWidget(this.editor, tool, this.localizationTable));
154
156
  }
155
- for (const tool of toolController.getMatchingTools(ToolType.Text)) {
156
- if (!(tool instanceof TextTool)) {
157
- throw new Error('All text tools must have kind === ToolType.Text');
158
- }
159
- (new TextToolWidget(this.editor, tool, this.localizationTable)).addTo(this.container);
157
+ for (const tool of toolController.getMatchingTools(TextTool)) {
158
+ this.addWidget(new TextToolWidget(this.editor, tool, this.localizationTable));
160
159
  }
161
- const panZoomTool = toolController.getMatchingTools(ToolType.PanZoom)[0];
162
- if (panZoomTool && panZoomTool instanceof PanZoom) {
163
- (new HandToolWidget(this.editor, panZoomTool, this.localizationTable)).addTo(this.container);
160
+ const panZoomTool = toolController.getMatchingTools(PanZoom)[0];
161
+ if (panZoomTool) {
162
+ this.addWidget(new HandToolWidget(this.editor, panZoomTool, this.localizationTable));
164
163
  }
165
- this.setupColorPickers();
166
164
  }
167
165
  addDefaultActionButtons() {
168
166
  this.addUndoRedoButtons();
@@ -12,7 +12,7 @@ export declare const makeTouchPanningIcon: () => SVGSVGElement;
12
12
  export declare const makeAllDevicePanningIcon: () => SVGSVGElement;
13
13
  export declare const makeZoomIcon: () => SVGSVGElement;
14
14
  export declare const makeTextIcon: (textStyle: TextStyle) => SVGSVGElement;
15
- export declare const makePenIcon: (tipThickness: number, color: string) => SVGSVGElement;
15
+ export declare const makePenIcon: (tipThickness: number, color: string | Color4) => SVGSVGElement;
16
16
  export declare const makeIconFromFactory: (pen: Pen, factory: ComponentBuilderFactory) => SVGSVGElement;
17
17
  export declare const makePipetteIcon: (color?: Color4) => SVGSVGElement;
18
18
  export declare const makeResizeViewportIcon: () => SVGSVGElement;
@@ -1,3 +1,4 @@
1
+ import Color4 from '../Color4';
1
2
  import EventDispatcher from '../EventDispatcher';
2
3
  import { Vec2 } from '../math/Vec2';
3
4
  import SVGRenderer from '../rendering/renderers/SVGRenderer';
@@ -251,6 +252,9 @@ export const makeTextIcon = (textStyle) => {
251
252
  return icon;
252
253
  };
253
254
  export const makePenIcon = (tipThickness, color) => {
255
+ if (color instanceof Color4) {
256
+ color = color.toHexString();
257
+ }
254
258
  const icon = document.createElementNS(svgNamespace, 'svg');
255
259
  icon.setAttribute('viewBox', '0 0 100 100');
256
260
  const halfThickness = tipThickness / 2;
@@ -0,0 +1,3 @@
1
+ export * from './widgets/lib';
2
+ export * as icons from './icons';
3
+ export * from './makeColorInput';
@@ -0,0 +1,4 @@
1
+ export * from './widgets/lib';
2
+ import * as icons_1 from './icons';
3
+ export { icons_1 as icons };
4
+ export * from './makeColorInput';
@@ -1,5 +1,5 @@
1
1
  import Color4 from '../Color4';
2
- import { ToolType } from '../tools/ToolController';
2
+ import PipetteTool from '../tools/PipetteTool';
3
3
  import { EditorEventType } from '../types';
4
4
  import { makePipetteIcon } from './icons';
5
5
  // Returns [ color input, input container ].
@@ -59,7 +59,7 @@ const addPipetteTool = (editor, container, onColorChange) => {
59
59
  pipetteButton.replaceChildren(makePipetteIcon(color));
60
60
  };
61
61
  updatePipetteIcon();
62
- const pipetteTool = editor.toolController.getMatchingTools(ToolType.Pipette)[0];
62
+ const pipetteTool = editor.toolController.getMatchingTools(PipetteTool)[0];
63
63
  const endColorSelectMode = () => {
64
64
  pipetteTool === null || pipetteTool === void 0 ? void 0 : pipetteTool.clearColorListener();
65
65
  updatePipetteIcon();
@@ -1,7 +1,3 @@
1
- export declare enum ToolbarButtonType {
2
- ToggleButton = 0,
3
- ActionButton = 1
4
- }
5
1
  export interface ActionButtonIcon {
6
2
  icon: Element;
7
3
  label: string;
@@ -1,5 +1 @@
1
- export var ToolbarButtonType;
2
- (function (ToolbarButtonType) {
3
- ToolbarButtonType[ToolbarButtonType["ToggleButton"] = 0] = "ToggleButton";
4
- ToolbarButtonType[ToolbarButtonType["ActionButton"] = 1] = "ActionButton";
5
- })(ToolbarButtonType || (ToolbarButtonType = {}));
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  import BaseToolWidget from './BaseToolWidget';
2
- export default class EraserWidget extends BaseToolWidget {
2
+ export default class EraserToolWidget extends BaseToolWidget {
3
3
  protected getTitle(): string;
4
4
  protected createIcon(): Element;
5
5
  protected fillDropdown(_dropdown: HTMLElement): boolean;
@@ -1,6 +1,6 @@
1
1
  import { makeEraserIcon } from '../icons';
2
2
  import BaseToolWidget from './BaseToolWidget';
3
- export default class EraserWidget extends BaseToolWidget {
3
+ export default class EraserToolWidget extends BaseToolWidget {
4
4
  getTitle() {
5
5
  return this.localizationTable.eraser;
6
6
  }
@@ -3,11 +3,11 @@ import Editor from '../../Editor';
3
3
  import Pen from '../../tools/Pen';
4
4
  import { ToolbarLocalization } from '../localization';
5
5
  import BaseToolWidget from './BaseToolWidget';
6
- interface PenTypeRecord {
6
+ export interface PenTypeRecord {
7
7
  name: string;
8
8
  factory: ComponentBuilderFactory;
9
9
  }
10
- export default class PenWidget extends BaseToolWidget {
10
+ export default class PenToolWidget extends BaseToolWidget {
11
11
  private tool;
12
12
  private updateInputs;
13
13
  protected penTypes: PenTypeRecord[];
@@ -17,4 +17,3 @@ export default class PenWidget extends BaseToolWidget {
17
17
  private static idCounter;
18
18
  protected fillDropdown(dropdown: HTMLElement): boolean;
19
19
  }
20
- export {};
@@ -1,4 +1,3 @@
1
- // @internal @packageDocumentation
2
1
  import { makeArrowBuilder } from '../../components/builders/ArrowBuilder';
3
2
  import { makeFreehandLineBuilder } from '../../components/builders/FreehandLineBuilder';
4
3
  import { makeLineBuilder } from '../../components/builders/LineBuilder';
@@ -8,7 +7,7 @@ import { toolbarCSSPrefix } from '../HTMLToolbar';
8
7
  import { makeIconFromFactory, makePenIcon } from '../icons';
9
8
  import makeColorInput from '../makeColorInput';
10
9
  import BaseToolWidget from './BaseToolWidget';
11
- export default class PenWidget extends BaseToolWidget {
10
+ export default class PenToolWidget extends BaseToolWidget {
12
11
  constructor(editor, tool, localization) {
13
12
  super(editor, tool, localization);
14
13
  this.tool = tool;
@@ -73,14 +72,14 @@ export default class PenWidget extends BaseToolWidget {
73
72
  const objectSelectLabel = document.createElement('label');
74
73
  const objectTypeSelect = document.createElement('select');
75
74
  // Give inputs IDs so we can label them with a <label for=...>Label text</label>
76
- thicknessInput.id = `${toolbarCSSPrefix}thicknessInput${PenWidget.idCounter++}`;
77
- objectTypeSelect.id = `${toolbarCSSPrefix}builderSelect${PenWidget.idCounter++}`;
75
+ thicknessInput.id = `${toolbarCSSPrefix}thicknessInput${PenToolWidget.idCounter++}`;
76
+ objectTypeSelect.id = `${toolbarCSSPrefix}builderSelect${PenToolWidget.idCounter++}`;
78
77
  thicknessLabel.innerText = this.localizationTable.thicknessLabel;
79
78
  thicknessLabel.setAttribute('for', thicknessInput.id);
80
79
  objectSelectLabel.innerText = this.localizationTable.selectObjectType;
81
80
  objectSelectLabel.setAttribute('for', objectTypeSelect.id);
82
81
  thicknessInput.type = 'range';
83
- thicknessInput.min = '1';
82
+ thicknessInput.min = '2';
84
83
  thicknessInput.max = '20';
85
84
  thicknessInput.step = '1';
86
85
  thicknessInput.oninput = () => {
@@ -103,7 +102,7 @@ export default class PenWidget extends BaseToolWidget {
103
102
  const [colorInput, colorInputContainer] = makeColorInput(this.editor, color => {
104
103
  this.tool.setColor(color);
105
104
  });
106
- colorInput.id = `${toolbarCSSPrefix}colorInput${PenWidget.idCounter++}`;
105
+ colorInput.id = `${toolbarCSSPrefix}colorInput${PenToolWidget.idCounter++}`;
107
106
  colorLabel.innerText = this.localizationTable.colorLabel;
108
107
  colorLabel.setAttribute('for', colorInput.id);
109
108
  colorRow.appendChild(colorLabel);
@@ -129,4 +128,4 @@ export default class PenWidget extends BaseToolWidget {
129
128
  return true;
130
129
  }
131
130
  }
132
- PenWidget.idCounter = 0;
131
+ PenToolWidget.idCounter = 0;
@@ -2,7 +2,7 @@ import Editor from '../../Editor';
2
2
  import SelectionTool from '../../tools/SelectionTool';
3
3
  import { ToolbarLocalization } from '../localization';
4
4
  import BaseToolWidget from './BaseToolWidget';
5
- export declare class SelectionWidget extends BaseToolWidget {
5
+ export default class SelectionToolWidget extends BaseToolWidget {
6
6
  private tool;
7
7
  constructor(editor: Editor, tool: SelectionTool, localization: ToolbarLocalization);
8
8
  protected getTitle(): string;
@@ -2,7 +2,7 @@ import { EditorEventType } from '../../types';
2
2
  import { makeDeleteSelectionIcon, makeDuplicateSelectionIcon, makeResizeViewportIcon, makeSelectionIcon } from '../icons';
3
3
  import ActionButtonWidget from './ActionButtonWidget';
4
4
  import BaseToolWidget from './BaseToolWidget';
5
- export class SelectionWidget extends BaseToolWidget {
5
+ export default class SelectionToolWidget extends BaseToolWidget {
6
6
  constructor(editor, tool, localization) {
7
7
  super(editor, tool, localization);
8
8
  this.tool = tool;
@@ -0,0 +1,8 @@
1
+ export { default as ActionButtonWidget } from './ActionButtonWidget';
2
+ export { default as BaseToolWidget } from './BaseToolWidget';
3
+ export { default as BaseWidget } from './BaseWidget';
4
+ export { default as PenToolWidget } from './PenToolWidget';
5
+ export { default as TextToolWidget } from './TextToolWidget';
6
+ export { default as HandToolWidget } from './HandToolWidget';
7
+ export { default as SelectionToolWidget } from './SelectionToolWidget';
8
+ export { default as EraserToolWidget } from './EraserToolWidget';
@@ -0,0 +1,8 @@
1
+ export { default as ActionButtonWidget } from './ActionButtonWidget';
2
+ export { default as BaseToolWidget } from './BaseToolWidget';
3
+ export { default as BaseWidget } from './BaseWidget';
4
+ export { default as PenToolWidget } from './PenToolWidget';
5
+ export { default as TextToolWidget } from './TextToolWidget';
6
+ export { default as HandToolWidget } from './HandToolWidget';
7
+ export { default as SelectionToolWidget } from './SelectionToolWidget';
8
+ export { default as EraserToolWidget } from './EraserToolWidget';
@@ -1,5 +1,4 @@
1
1
  import { PointerEvtListener, WheelEvt, PointerEvt, EditorNotifier, KeyPressEvent, KeyUpEvent } from '../types';
2
- import { ToolType } from './ToolController';
3
2
  import ToolEnabledGroup from './ToolEnabledGroup';
4
3
  export default abstract class BaseTool implements PointerEvtListener {
5
4
  private notifier;
@@ -10,7 +9,6 @@ export default abstract class BaseTool implements PointerEvtListener {
10
9
  onPointerMove(_event: PointerEvt): void;
11
10
  onPointerUp(_event: PointerEvt): void;
12
11
  onGestureCancel(): void;
13
- abstract readonly kind: ToolType;
14
12
  protected constructor(notifier: EditorNotifier, description: string);
15
13
  onWheel(_event: WheelEvt): boolean;
16
14
  onKeyPress(_event: KeyPressEvent): boolean;
@@ -1,12 +1,10 @@
1
1
  import { PointerEvt } from '../types';
2
2
  import BaseTool from './BaseTool';
3
3
  import Editor from '../Editor';
4
- import { ToolType } from './ToolController';
5
4
  export default class Eraser extends BaseTool {
6
5
  private editor;
7
6
  private lastPoint;
8
7
  private command;
9
- kind: ToolType;
10
8
  private toRemove;
11
9
  constructor(editor: Editor, description: string);
12
10
  onPointerDown(event: PointerEvt): boolean;
@@ -1,14 +1,12 @@
1
1
  import BaseTool from './BaseTool';
2
2
  import LineSegment2 from '../math/LineSegment2';
3
3
  import Erase from '../commands/Erase';
4
- import { ToolType } from './ToolController';
5
4
  import { PointerDevice } from '../Pointer';
6
5
  export default class Eraser extends BaseTool {
7
6
  constructor(editor, description) {
8
7
  super(editor.notifier, description);
9
8
  this.editor = editor;
10
9
  this.command = null;
11
- this.kind = ToolType.Eraser;
12
10
  }
13
11
  onPointerDown(event) {
14
12
  if (event.allPointers.length === 1 || event.current.device === PointerDevice.Eraser) {
@@ -3,7 +3,6 @@ import { Point2 } from '../math/Vec2';
3
3
  import Pointer from '../Pointer';
4
4
  import { KeyPressEvent, PointerEvt, WheelEvt } from '../types';
5
5
  import BaseTool from './BaseTool';
6
- import { ToolType } from './ToolController';
7
6
  interface PinchData {
8
7
  canvasCenter: Point2;
9
8
  screenCenter: Point2;
@@ -20,7 +19,6 @@ export declare enum PanZoomMode {
20
19
  export default class PanZoom extends BaseTool {
21
20
  private editor;
22
21
  private mode;
23
- readonly kind: ToolType.PanZoom;
24
22
  private transform;
25
23
  private lastAngle;
26
24
  private lastDist;
@@ -5,7 +5,6 @@ import { PointerDevice } from '../Pointer';
5
5
  import { EditorEventType } from '../types';
6
6
  import { Viewport } from '../Viewport';
7
7
  import BaseTool from './BaseTool';
8
- import { ToolType } from './ToolController';
9
8
  export var PanZoomMode;
10
9
  (function (PanZoomMode) {
11
10
  PanZoomMode[PanZoomMode["OneFingerTouchGestures"] = 1] = "OneFingerTouchGestures";
@@ -19,7 +18,6 @@ export default class PanZoom extends BaseTool {
19
18
  super(editor.notifier, description);
20
19
  this.editor = editor;
21
20
  this.mode = mode;
22
- this.kind = ToolType.PanZoom;
23
21
  this.transform = null;
24
22
  }
25
23
  // Returns information about the pointers in a gesture
@@ -1,9 +1,9 @@
1
1
  import Color4 from '../Color4';
2
2
  import Editor from '../Editor';
3
- import { PointerEvt } from '../types';
3
+ import Pointer from '../Pointer';
4
+ import { PointerEvt, StrokeDataPoint } from '../types';
4
5
  import BaseTool from './BaseTool';
5
- import { ToolType } from './ToolController';
6
- import { ComponentBuilderFactory } from '../components/builders/types';
6
+ import { ComponentBuilder, ComponentBuilderFactory } from '../components/builders/types';
7
7
  export interface PenStyle {
8
8
  color: Color4;
9
9
  thickness: number;
@@ -11,15 +11,14 @@ export interface PenStyle {
11
11
  export default class Pen extends BaseTool {
12
12
  private editor;
13
13
  private style;
14
- private builder;
15
- private builderFactory;
14
+ protected builder: ComponentBuilder | null;
15
+ protected builderFactory: ComponentBuilderFactory;
16
16
  private lastPoint;
17
- readonly kind: ToolType;
18
17
  constructor(editor: Editor, description: string, style: PenStyle);
19
18
  private getPressureMultiplier;
20
- private getStrokePoint;
21
- private previewStroke;
22
- private addPointToStroke;
19
+ protected toStrokePoint(pointer: Pointer): StrokeDataPoint;
20
+ protected previewStroke(): void;
21
+ protected addPointToStroke(point: StrokeDataPoint): void;
23
22
  onPointerDown({ current, allPointers }: PointerEvt): boolean;
24
23
  onPointerMove({ current }: PointerEvt): void;
25
24
  onPointerUp({ current }: PointerEvt): void;