js-draw 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +57 -0
- package/.husky/pre-commit +4 -0
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/__mocks__/coloris.ts +8 -0
- package/__mocks__/styleMock.js +1 -0
- package/dist/__mocks__/coloris.d.ts +2 -0
- package/dist/__mocks__/coloris.js +5 -0
- package/dist/build_tools/BundledFile.d.ts +12 -0
- package/dist/build_tools/BundledFile.js +153 -0
- package/dist/scripts/bundle.d.ts +1 -0
- package/dist/scripts/bundle.js +19 -0
- package/dist/scripts/watchBundle.d.ts +1 -0
- package/dist/scripts/watchBundle.js +9 -0
- package/dist/src/Color4.d.ts +23 -0
- package/dist/src/Color4.js +102 -0
- package/dist/src/Display.d.ts +22 -0
- package/dist/src/Display.js +93 -0
- package/dist/src/Editor.d.ts +55 -0
- package/dist/src/Editor.js +366 -0
- package/dist/src/EditorImage.d.ts +44 -0
- package/dist/src/EditorImage.js +243 -0
- package/dist/src/EventDispatcher.d.ts +11 -0
- package/dist/src/EventDispatcher.js +39 -0
- package/dist/src/Pointer.d.ts +22 -0
- package/dist/src/Pointer.js +57 -0
- package/dist/src/SVGLoader.d.ts +21 -0
- package/dist/src/SVGLoader.js +204 -0
- package/dist/src/StrokeBuilder.d.ts +35 -0
- package/dist/src/StrokeBuilder.js +275 -0
- package/dist/src/UndoRedoHistory.d.ts +17 -0
- package/dist/src/UndoRedoHistory.js +46 -0
- package/dist/src/Viewport.d.ts +39 -0
- package/dist/src/Viewport.js +134 -0
- package/dist/src/commands/Command.d.ts +15 -0
- package/dist/src/commands/Command.js +29 -0
- package/dist/src/commands/Erase.d.ts +11 -0
- package/dist/src/commands/Erase.js +37 -0
- package/dist/src/commands/localization.d.ts +19 -0
- package/dist/src/commands/localization.js +17 -0
- package/dist/src/components/AbstractComponent.d.ts +19 -0
- package/dist/src/components/AbstractComponent.js +46 -0
- package/dist/src/components/Stroke.d.ts +16 -0
- package/dist/src/components/Stroke.js +79 -0
- package/dist/src/components/UnknownSVGObject.d.ts +15 -0
- package/dist/src/components/UnknownSVGObject.js +25 -0
- package/dist/src/components/localization.d.ts +5 -0
- package/dist/src/components/localization.js +4 -0
- package/dist/src/geometry/LineSegment2.d.ts +19 -0
- package/dist/src/geometry/LineSegment2.js +100 -0
- package/dist/src/geometry/Mat33.d.ts +31 -0
- package/dist/src/geometry/Mat33.js +187 -0
- package/dist/src/geometry/Path.d.ts +55 -0
- package/dist/src/geometry/Path.js +364 -0
- package/dist/src/geometry/Rect2.d.ts +47 -0
- package/dist/src/geometry/Rect2.js +148 -0
- package/dist/src/geometry/Vec2.d.ts +13 -0
- package/dist/src/geometry/Vec2.js +13 -0
- package/dist/src/geometry/Vec3.d.ts +32 -0
- package/dist/src/geometry/Vec3.js +98 -0
- package/dist/src/localization.d.ts +12 -0
- package/dist/src/localization.js +5 -0
- package/dist/src/main.d.ts +3 -0
- package/dist/src/main.js +4 -0
- package/dist/src/rendering/AbstractRenderer.d.ts +38 -0
- package/dist/src/rendering/AbstractRenderer.js +108 -0
- package/dist/src/rendering/CanvasRenderer.d.ts +23 -0
- package/dist/src/rendering/CanvasRenderer.js +108 -0
- package/dist/src/rendering/DummyRenderer.d.ts +25 -0
- package/dist/src/rendering/DummyRenderer.js +65 -0
- package/dist/src/rendering/SVGRenderer.d.ts +27 -0
- package/dist/src/rendering/SVGRenderer.js +122 -0
- package/dist/src/testing/loadExpectExtensions.d.ts +17 -0
- package/dist/src/testing/loadExpectExtensions.js +27 -0
- package/dist/src/toolbar/HTMLToolbar.d.ts +12 -0
- package/dist/src/toolbar/HTMLToolbar.js +444 -0
- package/dist/src/toolbar/types.d.ts +17 -0
- package/dist/src/toolbar/types.js +5 -0
- package/dist/src/tools/BaseTool.d.ts +20 -0
- package/dist/src/tools/BaseTool.js +44 -0
- package/dist/src/tools/Eraser.d.ts +16 -0
- package/dist/src/tools/Eraser.js +53 -0
- package/dist/src/tools/PanZoom.d.ts +40 -0
- package/dist/src/tools/PanZoom.js +191 -0
- package/dist/src/tools/Pen.d.ts +25 -0
- package/dist/src/tools/Pen.js +97 -0
- package/dist/src/tools/SelectionTool.d.ts +49 -0
- package/dist/src/tools/SelectionTool.js +437 -0
- package/dist/src/tools/ToolController.d.ts +18 -0
- package/dist/src/tools/ToolController.js +110 -0
- package/dist/src/tools/ToolEnabledGroup.d.ts +6 -0
- package/dist/src/tools/ToolEnabledGroup.js +11 -0
- package/dist/src/tools/localization.d.ts +10 -0
- package/dist/src/tools/localization.js +9 -0
- package/dist/src/types.d.ts +88 -0
- package/dist/src/types.js +20 -0
- package/jest.config.js +22 -0
- package/lint-staged.config.js +6 -0
- package/package.json +82 -0
- package/src/Color4.test.ts +12 -0
- package/src/Color4.ts +122 -0
- package/src/Display.ts +118 -0
- package/src/Editor.css +58 -0
- package/src/Editor.ts +469 -0
- package/src/EditorImage.test.ts +90 -0
- package/src/EditorImage.ts +297 -0
- package/src/EventDispatcher.test.ts +123 -0
- package/src/EventDispatcher.ts +53 -0
- package/src/Pointer.ts +93 -0
- package/src/SVGLoader.ts +230 -0
- package/src/StrokeBuilder.ts +362 -0
- package/src/UndoRedoHistory.ts +61 -0
- package/src/Viewport.ts +168 -0
- package/src/commands/Command.ts +43 -0
- package/src/commands/Erase.ts +52 -0
- package/src/commands/localization.ts +38 -0
- package/src/components/AbstractComponent.ts +73 -0
- package/src/components/Stroke.test.ts +18 -0
- package/src/components/Stroke.ts +102 -0
- package/src/components/UnknownSVGObject.ts +36 -0
- package/src/components/localization.ts +9 -0
- package/src/editorStyles.js +3 -0
- package/src/geometry/LineSegment2.test.ts +77 -0
- package/src/geometry/LineSegment2.ts +127 -0
- package/src/geometry/Mat33.test.ts +144 -0
- package/src/geometry/Mat33.ts +268 -0
- package/src/geometry/Path.fromString.test.ts +146 -0
- package/src/geometry/Path.test.ts +96 -0
- package/src/geometry/Path.toString.test.ts +31 -0
- package/src/geometry/Path.ts +456 -0
- package/src/geometry/Rect2.test.ts +121 -0
- package/src/geometry/Rect2.ts +215 -0
- package/src/geometry/Vec2.test.ts +32 -0
- package/src/geometry/Vec2.ts +18 -0
- package/src/geometry/Vec3.test.ts +29 -0
- package/src/geometry/Vec3.ts +133 -0
- package/src/localization.ts +27 -0
- package/src/rendering/AbstractRenderer.ts +164 -0
- package/src/rendering/CanvasRenderer.ts +141 -0
- package/src/rendering/DummyRenderer.ts +80 -0
- package/src/rendering/SVGRenderer.ts +159 -0
- package/src/testing/loadExpectExtensions.ts +43 -0
- package/src/toolbar/HTMLToolbar.ts +551 -0
- package/src/toolbar/toolbar.css +110 -0
- package/src/toolbar/types.ts +20 -0
- package/src/tools/BaseTool.ts +58 -0
- package/src/tools/Eraser.ts +67 -0
- package/src/tools/PanZoom.ts +253 -0
- package/src/tools/Pen.ts +121 -0
- package/src/tools/SelectionTool.test.ts +85 -0
- package/src/tools/SelectionTool.ts +545 -0
- package/src/tools/ToolController.ts +126 -0
- package/src/tools/ToolEnabledGroup.ts +14 -0
- package/src/tools/localization.ts +22 -0
- package/src/types.ts +133 -0
- package/tsconfig.json +28 -0
@@ -0,0 +1,191 @@
|
|
1
|
+
import Mat33 from '../geometry/Mat33';
|
2
|
+
import { Vec2 } from '../geometry/Vec2';
|
3
|
+
import Vec3 from '../geometry/Vec3';
|
4
|
+
import { PointerDevice } from '../Pointer';
|
5
|
+
import { Viewport } from '../Viewport';
|
6
|
+
import BaseTool from './BaseTool';
|
7
|
+
import { ToolType } from './ToolController';
|
8
|
+
export var PanZoomMode;
|
9
|
+
(function (PanZoomMode) {
|
10
|
+
// Handle one-pointer gestures (touchscreen only unless AnyDevice is set)
|
11
|
+
PanZoomMode[PanZoomMode["OneFingerGestures"] = 1] = "OneFingerGestures";
|
12
|
+
// Handle two-pointer gestures (touchscreen only unless AnyDevice is set)
|
13
|
+
PanZoomMode[PanZoomMode["TwoFingerGestures"] = 2] = "TwoFingerGestures";
|
14
|
+
// / Handle gestures from any device, rather than just touch
|
15
|
+
PanZoomMode[PanZoomMode["AnyDevice"] = 4] = "AnyDevice";
|
16
|
+
})(PanZoomMode || (PanZoomMode = {}));
|
17
|
+
export default class PanZoom extends BaseTool {
|
18
|
+
constructor(editor, mode, description) {
|
19
|
+
super(editor.notifier, description);
|
20
|
+
this.editor = editor;
|
21
|
+
this.mode = mode;
|
22
|
+
this.kind = ToolType.PanZoom;
|
23
|
+
this.transform = null;
|
24
|
+
if (mode === PanZoomMode.OneFingerGestures) {
|
25
|
+
this.kind = ToolType.TouchPanZoom;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
// Returns information about the pointers in a gesture
|
29
|
+
computePinchData(p1, p2) {
|
30
|
+
const screenBetween = p2.screenPos.minus(p1.screenPos);
|
31
|
+
const angle = screenBetween.angle();
|
32
|
+
const dist = screenBetween.magnitude();
|
33
|
+
const canvasCenter = p2.canvasPos.plus(p1.canvasPos).times(0.5);
|
34
|
+
const screenCenter = p2.screenPos.plus(p1.screenPos).times(0.5);
|
35
|
+
return { canvasCenter, screenCenter, angle, dist };
|
36
|
+
}
|
37
|
+
pointersHaveCorrectDeviceType(pointers) {
|
38
|
+
return this.mode & PanZoomMode.AnyDevice || pointers.every(pointer => pointer.device === PointerDevice.Touch);
|
39
|
+
}
|
40
|
+
onPointerDown({ allPointers }) {
|
41
|
+
var _a;
|
42
|
+
let handlingGesture = false;
|
43
|
+
if (!this.pointersHaveCorrectDeviceType(allPointers)) {
|
44
|
+
handlingGesture = false;
|
45
|
+
}
|
46
|
+
else if (allPointers.length === 2 && this.mode & PanZoomMode.TwoFingerGestures) {
|
47
|
+
const { screenCenter, angle, dist } = this.computePinchData(allPointers[0], allPointers[1]);
|
48
|
+
this.lastAngle = angle;
|
49
|
+
this.lastDist = dist;
|
50
|
+
this.lastScreenCenter = screenCenter;
|
51
|
+
handlingGesture = true;
|
52
|
+
}
|
53
|
+
else if (allPointers.length === 1 && this.mode & PanZoomMode.OneFingerGestures) {
|
54
|
+
this.lastScreenCenter = allPointers[0].screenPos;
|
55
|
+
handlingGesture = true;
|
56
|
+
}
|
57
|
+
if (handlingGesture) {
|
58
|
+
(_a = this.transform) !== null && _a !== void 0 ? _a : (this.transform = new Viewport.ViewportTransform(Mat33.identity));
|
59
|
+
}
|
60
|
+
return handlingGesture;
|
61
|
+
}
|
62
|
+
// Returns the change in position of the center of the given group of pointers.
|
63
|
+
// Assumes this.lastScreenCenter has been set appropriately.
|
64
|
+
getCenterDelta(screenCenter) {
|
65
|
+
// Use transformVec3 to avoid translating the delta
|
66
|
+
const delta = this.editor.viewport.screenToCanvasTransform.transformVec3(screenCenter.minus(this.lastScreenCenter));
|
67
|
+
return delta;
|
68
|
+
}
|
69
|
+
handleTwoFingerMove(allPointers) {
|
70
|
+
const { screenCenter, canvasCenter, angle, dist } = this.computePinchData(allPointers[0], allPointers[1]);
|
71
|
+
const delta = this.getCenterDelta(screenCenter);
|
72
|
+
const transformUpdate = Mat33.translation(delta)
|
73
|
+
.rightMul(Mat33.scaling2D(dist / this.lastDist, canvasCenter))
|
74
|
+
.rightMul(Mat33.zRotation(angle - this.lastAngle, canvasCenter));
|
75
|
+
this.lastScreenCenter = screenCenter;
|
76
|
+
this.lastDist = dist;
|
77
|
+
this.lastAngle = angle;
|
78
|
+
this.transform = new Viewport.ViewportTransform(this.transform.transform.rightMul(transformUpdate));
|
79
|
+
}
|
80
|
+
handleOneFingerMove(pointer) {
|
81
|
+
const delta = this.getCenterDelta(pointer.screenPos);
|
82
|
+
this.transform = new Viewport.ViewportTransform(this.transform.transform.rightMul(Mat33.translation(delta)));
|
83
|
+
this.lastScreenCenter = pointer.screenPos;
|
84
|
+
}
|
85
|
+
onPointerMove({ allPointers }) {
|
86
|
+
var _a;
|
87
|
+
(_a = this.transform) !== null && _a !== void 0 ? _a : (this.transform = new Viewport.ViewportTransform(Mat33.identity));
|
88
|
+
const lastTransform = this.transform;
|
89
|
+
if (allPointers.length === 2 && this.mode & PanZoomMode.TwoFingerGestures) {
|
90
|
+
this.handleTwoFingerMove(allPointers);
|
91
|
+
}
|
92
|
+
else if (allPointers.length === 1 && this.mode & PanZoomMode.OneFingerGestures) {
|
93
|
+
this.handleOneFingerMove(allPointers[0]);
|
94
|
+
}
|
95
|
+
lastTransform.unapply(this.editor);
|
96
|
+
this.transform.apply(this.editor);
|
97
|
+
}
|
98
|
+
onPointerUp(_event) {
|
99
|
+
if (this.transform) {
|
100
|
+
this.transform.unapply(this.editor);
|
101
|
+
this.editor.dispatch(this.transform, false);
|
102
|
+
}
|
103
|
+
this.transform = null;
|
104
|
+
}
|
105
|
+
onGestureCancel() {
|
106
|
+
var _a;
|
107
|
+
(_a = this.transform) === null || _a === void 0 ? void 0 : _a.unapply(this.editor);
|
108
|
+
this.transform = null;
|
109
|
+
}
|
110
|
+
// Applies [transformUpdate] to the editor. This stacks on top of the
|
111
|
+
// current transformation, if it exists.
|
112
|
+
updateTransform(transformUpdate) {
|
113
|
+
var _a;
|
114
|
+
let newTransform = transformUpdate;
|
115
|
+
if (this.transform) {
|
116
|
+
newTransform = this.transform.transform.rightMul(transformUpdate);
|
117
|
+
}
|
118
|
+
(_a = this.transform) === null || _a === void 0 ? void 0 : _a.unapply(this.editor);
|
119
|
+
this.transform = new Viewport.ViewportTransform(newTransform);
|
120
|
+
this.transform.apply(this.editor);
|
121
|
+
}
|
122
|
+
onWheel({ delta, screenPos }) {
|
123
|
+
if (this.transform === null) {
|
124
|
+
this.transform = new Viewport.ViewportTransform(Mat33.identity);
|
125
|
+
}
|
126
|
+
const canvasPos = this.editor.viewport.screenToCanvas(screenPos);
|
127
|
+
const toCanvas = this.editor.viewport.screenToCanvasTransform;
|
128
|
+
// Transform without including translation
|
129
|
+
const translation = toCanvas.transformVec3(Vec3.of(-delta.x, -delta.y, 0));
|
130
|
+
const pinchZoomScaleFactor = 1.04;
|
131
|
+
const transformUpdate = Mat33.scaling2D(Math.pow(pinchZoomScaleFactor, -delta.z), canvasPos).rightMul(Mat33.translation(translation));
|
132
|
+
this.updateTransform(transformUpdate);
|
133
|
+
return true;
|
134
|
+
}
|
135
|
+
onKeyPress({ key }) {
|
136
|
+
let translation = Vec2.zero;
|
137
|
+
let scale = 1;
|
138
|
+
let rotation = 0;
|
139
|
+
// Keyboard shortcut handling
|
140
|
+
switch (key) {
|
141
|
+
case 'a':
|
142
|
+
case 'h':
|
143
|
+
case 'ArrowLeft':
|
144
|
+
translation = Vec2.of(-1, 0);
|
145
|
+
break;
|
146
|
+
case 'd':
|
147
|
+
case 'l':
|
148
|
+
case 'ArrowRight':
|
149
|
+
translation = Vec2.of(1, 0);
|
150
|
+
break;
|
151
|
+
case 'k':
|
152
|
+
case 'ArrowUp':
|
153
|
+
translation = Vec2.of(0, -1);
|
154
|
+
break;
|
155
|
+
case 'j':
|
156
|
+
case 'ArrowDown':
|
157
|
+
translation = Vec2.of(0, 1);
|
158
|
+
break;
|
159
|
+
case 'w':
|
160
|
+
scale = 1 / 2;
|
161
|
+
break;
|
162
|
+
case 's':
|
163
|
+
scale = 2;
|
164
|
+
break;
|
165
|
+
case 'r':
|
166
|
+
rotation = 1;
|
167
|
+
break;
|
168
|
+
case 'R':
|
169
|
+
rotation = -1;
|
170
|
+
break;
|
171
|
+
default:
|
172
|
+
return false;
|
173
|
+
}
|
174
|
+
// For each keypress,
|
175
|
+
translation = translation.times(30); // Move at most 30 units
|
176
|
+
rotation *= Math.PI / 8; // Rotate at most a sixteenth of a rotation
|
177
|
+
// Transform the canvas, not the viewport:
|
178
|
+
translation = translation.times(-1);
|
179
|
+
rotation = rotation * -1;
|
180
|
+
scale = 1 / scale;
|
181
|
+
const toCanvas = this.editor.viewport.screenToCanvasTransform;
|
182
|
+
// Transform without translating (treat toCanvas as a linear instead of
|
183
|
+
// an affine transformation).
|
184
|
+
translation = toCanvas.transformVec3(translation);
|
185
|
+
// Rotate/scale about the center of the canvas
|
186
|
+
const transformCenter = this.editor.viewport.visibleRect.center;
|
187
|
+
const transformUpdate = Mat33.scaling2D(scale, transformCenter).rightMul(Mat33.zRotation(rotation, transformCenter)).rightMul(Mat33.translation(translation));
|
188
|
+
this.updateTransform(transformUpdate);
|
189
|
+
return true;
|
190
|
+
}
|
191
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import Color4 from '../Color4';
|
2
|
+
import Editor from '../Editor';
|
3
|
+
import { PointerEvt } from '../types';
|
4
|
+
import BaseTool from './BaseTool';
|
5
|
+
import { ToolType } from './ToolController';
|
6
|
+
export default class Pen extends BaseTool {
|
7
|
+
private editor;
|
8
|
+
private color;
|
9
|
+
private thickness;
|
10
|
+
private builder;
|
11
|
+
readonly kind: ToolType;
|
12
|
+
constructor(editor: Editor, description: string, color?: Color4, thickness?: number);
|
13
|
+
private getPressureMultiplier;
|
14
|
+
private getStrokePoint;
|
15
|
+
private addPointToStroke;
|
16
|
+
onPointerDown({ current, allPointers }: PointerEvt): boolean;
|
17
|
+
onPointerMove({ current }: PointerEvt): void;
|
18
|
+
onPointerUp({ current }: PointerEvt): void;
|
19
|
+
onGestureCancel(): void;
|
20
|
+
private noteUpdated;
|
21
|
+
setColor(color: Color4): void;
|
22
|
+
setThickness(thickness: number): void;
|
23
|
+
getThickness(): number;
|
24
|
+
getColor(): Color4;
|
25
|
+
}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
import Color4 from '../Color4';
|
2
|
+
import EditorImage from '../EditorImage';
|
3
|
+
import { Vec2 } from '../geometry/Vec2';
|
4
|
+
import { PointerDevice } from '../Pointer';
|
5
|
+
import StrokeBuilder from '../StrokeBuilder';
|
6
|
+
import { EditorEventType } from '../types';
|
7
|
+
import BaseTool from './BaseTool';
|
8
|
+
import { ToolType } from './ToolController';
|
9
|
+
export default class Pen extends BaseTool {
|
10
|
+
constructor(editor, description, color = Color4.purple, thickness = 16.0) {
|
11
|
+
super(editor.notifier, description);
|
12
|
+
this.editor = editor;
|
13
|
+
this.color = color;
|
14
|
+
this.thickness = thickness;
|
15
|
+
this.builder = null;
|
16
|
+
this.kind = ToolType.Pen;
|
17
|
+
}
|
18
|
+
getPressureMultiplier() {
|
19
|
+
return 1 / this.editor.viewport.getScaleFactor() * this.thickness;
|
20
|
+
}
|
21
|
+
getStrokePoint(pointer) {
|
22
|
+
var _a;
|
23
|
+
const minPressure = 0.3;
|
24
|
+
const pressure = Math.max((_a = pointer.pressure) !== null && _a !== void 0 ? _a : 1.0, minPressure);
|
25
|
+
return {
|
26
|
+
pos: pointer.canvasPos,
|
27
|
+
width: pressure * this.getPressureMultiplier(),
|
28
|
+
color: this.color,
|
29
|
+
time: pointer.timeStamp,
|
30
|
+
};
|
31
|
+
}
|
32
|
+
addPointToStroke(pointer) {
|
33
|
+
if (!this.builder) {
|
34
|
+
throw new Error('No stroke is currently being generated.');
|
35
|
+
}
|
36
|
+
this.builder.addPoint(this.getStrokePoint(pointer));
|
37
|
+
this.editor.clearWetInk();
|
38
|
+
this.editor.drawWetInk(...this.builder.preview());
|
39
|
+
}
|
40
|
+
onPointerDown({ current, allPointers }) {
|
41
|
+
if (current.device === PointerDevice.Eraser) {
|
42
|
+
return false;
|
43
|
+
}
|
44
|
+
if (allPointers.length === 1 || current.device === PointerDevice.Pen) {
|
45
|
+
// Don't smooth if input is more than ± 7 pixels from the true curve, do smooth if
|
46
|
+
// less than ± 2 px from the curve.
|
47
|
+
const canvasTransform = this.editor.viewport.screenToCanvasTransform;
|
48
|
+
const maxSmoothingDist = canvasTransform.transformVec3(Vec2.unitX).magnitude() * 7;
|
49
|
+
const minSmoothingDist = canvasTransform.transformVec3(Vec2.unitX).magnitude() * 2;
|
50
|
+
this.builder = new StrokeBuilder(this.getStrokePoint(current), minSmoothingDist, maxSmoothingDist);
|
51
|
+
return true;
|
52
|
+
}
|
53
|
+
return false;
|
54
|
+
}
|
55
|
+
onPointerMove({ current }) {
|
56
|
+
this.addPointToStroke(current);
|
57
|
+
}
|
58
|
+
onPointerUp({ current }) {
|
59
|
+
if (!this.builder) {
|
60
|
+
return;
|
61
|
+
}
|
62
|
+
this.addPointToStroke(current);
|
63
|
+
if (this.builder && current.isPrimary) {
|
64
|
+
const stroke = this.builder.build();
|
65
|
+
this.editor.clearWetInk();
|
66
|
+
this.editor.drawWetInk(...this.builder.preview());
|
67
|
+
const canFlatten = true;
|
68
|
+
const action = new EditorImage.AddElementCommand(stroke, canFlatten);
|
69
|
+
this.editor.dispatch(action);
|
70
|
+
}
|
71
|
+
this.builder = null;
|
72
|
+
this.editor.clearWetInk();
|
73
|
+
}
|
74
|
+
onGestureCancel() {
|
75
|
+
this.editor.clearWetInk();
|
76
|
+
}
|
77
|
+
noteUpdated() {
|
78
|
+
this.editor.notifier.dispatch(EditorEventType.ToolUpdated, {
|
79
|
+
kind: EditorEventType.ToolUpdated,
|
80
|
+
tool: this,
|
81
|
+
});
|
82
|
+
}
|
83
|
+
setColor(color) {
|
84
|
+
if (color.toHexString() !== this.color.toHexString()) {
|
85
|
+
this.color = color;
|
86
|
+
this.noteUpdated();
|
87
|
+
}
|
88
|
+
}
|
89
|
+
setThickness(thickness) {
|
90
|
+
if (thickness !== this.thickness) {
|
91
|
+
this.thickness = thickness;
|
92
|
+
this.noteUpdated();
|
93
|
+
}
|
94
|
+
}
|
95
|
+
getThickness() { return this.thickness; }
|
96
|
+
getColor() { return this.color; }
|
97
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import Editor from '../Editor';
|
2
|
+
import Rect2 from '../geometry/Rect2';
|
3
|
+
import { Point2, Vec2 } from '../geometry/Vec2';
|
4
|
+
import { PointerEvt } from '../types';
|
5
|
+
import BaseTool from './BaseTool';
|
6
|
+
import { ToolType } from './ToolController';
|
7
|
+
declare class Selection {
|
8
|
+
startPoint: Point2;
|
9
|
+
private editor;
|
10
|
+
region: Rect2;
|
11
|
+
private boxRotation;
|
12
|
+
private backgroundBox;
|
13
|
+
private rotateCircle;
|
14
|
+
private selectedElems;
|
15
|
+
private transform;
|
16
|
+
private transformationCommands;
|
17
|
+
constructor(startPoint: Point2, editor: Editor);
|
18
|
+
handleBackgroundDrag(deltaPosition: Vec2): void;
|
19
|
+
handleResizeCornerDrag(deltaPosition: Vec2): void;
|
20
|
+
handleRotateCircleDrag(offset: Vec2): void;
|
21
|
+
private computeTransformCommands;
|
22
|
+
finishDragging(): void;
|
23
|
+
private previewTransformCmds;
|
24
|
+
appendBackgroundBoxTo(elem: HTMLElement): void;
|
25
|
+
setToPoint(point: Point2): void;
|
26
|
+
cancelSelection(): void;
|
27
|
+
resolveToObjects(): boolean;
|
28
|
+
recomputeRegion(): boolean;
|
29
|
+
getMinCanvasSize(): number;
|
30
|
+
private recomputeBoxRotation;
|
31
|
+
getSelectedItemCount(): number;
|
32
|
+
updateUI(): void;
|
33
|
+
}
|
34
|
+
export default class SelectionTool extends BaseTool {
|
35
|
+
private editor;
|
36
|
+
private handleOverlay;
|
37
|
+
private prevSelectionBox;
|
38
|
+
private selectionBox;
|
39
|
+
readonly kind: ToolType;
|
40
|
+
constructor(editor: Editor, description: string);
|
41
|
+
onPointerDown(event: PointerEvt): boolean;
|
42
|
+
onPointerMove(event: PointerEvt): void;
|
43
|
+
private onGestureEnd;
|
44
|
+
onPointerUp(event: PointerEvt): void;
|
45
|
+
onGestureCancel(): void;
|
46
|
+
setEnabled(enabled: boolean): void;
|
47
|
+
getSelection(): Selection | null;
|
48
|
+
}
|
49
|
+
export {};
|