js-draw 1.20.3 → 1.21.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. package/LICENSE +1 -1
  2. package/dist/Editor.css +136 -26
  3. package/dist/bundle.js +2 -2
  4. package/dist/bundledStyles.js +1 -1
  5. package/dist/cjs/Editor.d.ts +27 -6
  6. package/dist/cjs/Editor.js +30 -8
  7. package/dist/cjs/SVGLoader/SVGLoader.js +2 -2
  8. package/dist/cjs/Viewport.d.ts +2 -2
  9. package/dist/cjs/commands/Command.d.ts +5 -0
  10. package/dist/cjs/commands/Command.js +5 -0
  11. package/dist/cjs/commands/SerializableCommand.d.ts +7 -0
  12. package/dist/cjs/commands/SerializableCommand.js +9 -0
  13. package/dist/cjs/dialogs/makeAboutDialog.d.ts +1 -1
  14. package/dist/cjs/dialogs/makeAboutDialog.js +10 -25
  15. package/dist/cjs/dialogs/makeMessageDialog.d.ts +11 -0
  16. package/dist/cjs/dialogs/makeMessageDialog.js +56 -0
  17. package/dist/cjs/image/EditorImage.d.ts +15 -1
  18. package/dist/cjs/image/EditorImage.js +15 -5
  19. package/dist/cjs/inputEvents.d.ts +10 -2
  20. package/dist/cjs/inputEvents.js +1 -0
  21. package/dist/cjs/localizations/es.js +3 -0
  22. package/dist/cjs/rendering/Display.d.ts +1 -0
  23. package/dist/cjs/rendering/Display.js +1 -0
  24. package/dist/cjs/rendering/TextRenderingStyle.d.ts +7 -6
  25. package/dist/cjs/rendering/TextRenderingStyle.js +1 -0
  26. package/dist/cjs/rendering/renderers/CanvasRenderer.d.ts +12 -3
  27. package/dist/cjs/rendering/renderers/CanvasRenderer.js +15 -2
  28. package/dist/cjs/rendering/renderers/DummyRenderer.d.ts +1 -1
  29. package/dist/cjs/testing/firstElementAncestorOfNode.d.ts +1 -1
  30. package/dist/cjs/testing/firstElementAncestorOfNode.js +1 -1
  31. package/dist/cjs/testing/sendPenEvent.d.ts +2 -2
  32. package/dist/cjs/testing/sendTouchEvent.d.ts +2 -2
  33. package/dist/cjs/toolbar/AbstractToolbar.d.ts +6 -1
  34. package/dist/cjs/toolbar/AbstractToolbar.js +6 -1
  35. package/dist/cjs/toolbar/IconProvider.d.ts +1 -1
  36. package/dist/cjs/toolbar/IconProvider.js +6 -1
  37. package/dist/cjs/toolbar/widgets/BaseWidget.d.ts +8 -0
  38. package/dist/cjs/toolbar/widgets/BaseWidget.js +8 -0
  39. package/dist/cjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  40. package/dist/cjs/toolbar/widgets/HandToolWidget.js +1 -0
  41. package/dist/cjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -1
  42. package/dist/cjs/toolbar/widgets/PenToolWidget.d.ts +6 -0
  43. package/dist/cjs/toolbar/widgets/PenToolWidget.js +5 -0
  44. package/dist/cjs/types.d.ts +5 -0
  45. package/dist/cjs/types.js +1 -0
  46. package/dist/cjs/util/ClipboardHandler.d.ts +9 -1
  47. package/dist/cjs/util/ClipboardHandler.js +82 -24
  48. package/dist/cjs/version.js +1 -1
  49. package/dist/mjs/Editor.d.ts +27 -6
  50. package/dist/mjs/Editor.mjs +31 -9
  51. package/dist/mjs/SVGLoader/SVGLoader.mjs +2 -2
  52. package/dist/mjs/Viewport.d.ts +2 -2
  53. package/dist/mjs/commands/Command.d.ts +5 -0
  54. package/dist/mjs/commands/Command.mjs +5 -0
  55. package/dist/mjs/commands/SerializableCommand.d.ts +7 -0
  56. package/dist/mjs/commands/SerializableCommand.mjs +9 -0
  57. package/dist/mjs/dialogs/makeAboutDialog.d.ts +1 -1
  58. package/dist/mjs/dialogs/makeAboutDialog.mjs +7 -25
  59. package/dist/mjs/dialogs/makeMessageDialog.d.ts +11 -0
  60. package/dist/mjs/dialogs/makeMessageDialog.mjs +51 -0
  61. package/dist/mjs/image/EditorImage.d.ts +15 -1
  62. package/dist/mjs/image/EditorImage.mjs +15 -5
  63. package/dist/mjs/inputEvents.d.ts +10 -2
  64. package/dist/mjs/inputEvents.mjs +1 -0
  65. package/dist/mjs/localizations/es.mjs +3 -0
  66. package/dist/mjs/rendering/Display.d.ts +1 -0
  67. package/dist/mjs/rendering/Display.mjs +1 -0
  68. package/dist/mjs/rendering/TextRenderingStyle.d.ts +7 -6
  69. package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -0
  70. package/dist/mjs/rendering/renderers/CanvasRenderer.d.ts +12 -3
  71. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +15 -2
  72. package/dist/mjs/rendering/renderers/DummyRenderer.d.ts +1 -1
  73. package/dist/mjs/testing/firstElementAncestorOfNode.d.ts +1 -1
  74. package/dist/mjs/testing/firstElementAncestorOfNode.mjs +1 -1
  75. package/dist/mjs/testing/sendPenEvent.d.ts +2 -2
  76. package/dist/mjs/testing/sendTouchEvent.d.ts +2 -2
  77. package/dist/mjs/toolbar/AbstractToolbar.d.ts +6 -1
  78. package/dist/mjs/toolbar/AbstractToolbar.mjs +6 -1
  79. package/dist/mjs/toolbar/IconProvider.d.ts +1 -1
  80. package/dist/mjs/toolbar/IconProvider.mjs +6 -1
  81. package/dist/mjs/toolbar/widgets/BaseWidget.d.ts +8 -0
  82. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -0
  83. package/dist/mjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  84. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +1 -0
  85. package/dist/mjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -1
  86. package/dist/mjs/toolbar/widgets/PenToolWidget.d.ts +6 -0
  87. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +5 -0
  88. package/dist/mjs/types.d.ts +5 -0
  89. package/dist/mjs/types.mjs +1 -0
  90. package/dist/mjs/util/ClipboardHandler.d.ts +9 -1
  91. package/dist/mjs/util/ClipboardHandler.mjs +82 -24
  92. package/dist/mjs/version.mjs +1 -1
  93. package/package.json +8 -9
  94. package/src/dialogs/dialogs.scss +9 -21
  95. package/src/dialogs/makeAboutDialog.scss +13 -33
  96. package/src/dialogs/makeMessageDialog.scss +46 -0
  97. package/dist/cjs/tools/BaseTool.d.ts +0 -60
  98. package/dist/cjs/tools/BaseTool.js +0 -174
  99. package/dist/cjs/tools/Eraser.d.ts +0 -56
  100. package/dist/cjs/tools/Eraser.js +0 -295
  101. package/dist/cjs/tools/Eraser.test.d.ts +0 -1
  102. package/dist/cjs/tools/FindTool.d.ts +0 -21
  103. package/dist/cjs/tools/FindTool.js +0 -137
  104. package/dist/cjs/tools/FindTool.test.d.ts +0 -1
  105. package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +0 -12
  106. package/dist/cjs/tools/InputFilter/FunctionMapper.js +0 -21
  107. package/dist/cjs/tools/InputFilter/InputMapper.d.ts +0 -23
  108. package/dist/cjs/tools/InputFilter/InputMapper.js +0 -38
  109. package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +0 -15
  110. package/dist/cjs/tools/InputFilter/InputPipeline.js +0 -54
  111. package/dist/cjs/tools/InputFilter/InputPipeline.test.d.ts +0 -1
  112. package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +0 -29
  113. package/dist/cjs/tools/InputFilter/InputStabilizer.js +0 -181
  114. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +0 -21
  115. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +0 -84
  116. package/dist/cjs/tools/PanZoom.d.ts +0 -119
  117. package/dist/cjs/tools/PanZoom.js +0 -508
  118. package/dist/cjs/tools/PanZoom.test.d.ts +0 -1
  119. package/dist/cjs/tools/PasteHandler.d.ts +0 -23
  120. package/dist/cjs/tools/PasteHandler.js +0 -109
  121. package/dist/cjs/tools/Pen.d.ts +0 -53
  122. package/dist/cjs/tools/Pen.js +0 -318
  123. package/dist/cjs/tools/Pen.test.d.ts +0 -1
  124. package/dist/cjs/tools/PipetteTool.d.ts +0 -28
  125. package/dist/cjs/tools/PipetteTool.js +0 -69
  126. package/dist/cjs/tools/ScrollbarTool.d.ts +0 -18
  127. package/dist/cjs/tools/ScrollbarTool.js +0 -85
  128. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -9
  129. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +0 -32
  130. package/dist/cjs/tools/SelectionTool/Selection.d.ts +0 -71
  131. package/dist/cjs/tools/SelectionTool/Selection.js +0 -620
  132. package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +0 -62
  133. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +0 -141
  134. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +0 -40
  135. package/dist/cjs/tools/SelectionTool/SelectionTool.js +0 -494
  136. package/dist/cjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +0 -1
  137. package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  138. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +0 -23
  139. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +0 -83
  140. package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +0 -42
  141. package/dist/cjs/tools/SelectionTool/TransformMode.js +0 -155
  142. package/dist/cjs/tools/SelectionTool/types.d.ts +0 -28
  143. package/dist/cjs/tools/SelectionTool/types.js +0 -14
  144. package/dist/cjs/tools/SoundUITool.d.ts +0 -26
  145. package/dist/cjs/tools/SoundUITool.js +0 -171
  146. package/dist/cjs/tools/TextTool.d.ts +0 -36
  147. package/dist/cjs/tools/TextTool.js +0 -285
  148. package/dist/cjs/tools/TextTool.test.d.ts +0 -1
  149. package/dist/cjs/tools/ToolController.d.ts +0 -73
  150. package/dist/cjs/tools/ToolController.js +0 -304
  151. package/dist/cjs/tools/ToolController.test.d.ts +0 -1
  152. package/dist/cjs/tools/ToolEnabledGroup.d.ts +0 -6
  153. package/dist/cjs/tools/ToolEnabledGroup.js +0 -13
  154. package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +0 -16
  155. package/dist/cjs/tools/ToolSwitcherShortcut.js +0 -40
  156. package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +0 -12
  157. package/dist/cjs/tools/ToolbarShortcutHandler.js +0 -34
  158. package/dist/cjs/tools/UndoRedoShortcut.d.ts +0 -8
  159. package/dist/cjs/tools/UndoRedoShortcut.js +0 -27
  160. package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  161. package/dist/cjs/tools/keybindings.d.ts +0 -18
  162. package/dist/cjs/tools/keybindings.js +0 -49
  163. package/dist/cjs/tools/lib.d.ts +0 -14
  164. package/dist/cjs/tools/lib.js +0 -36
  165. package/dist/cjs/tools/localization.d.ts +0 -34
  166. package/dist/cjs/tools/localization.js +0 -36
  167. package/dist/cjs/tools/util/StationaryPenDetector.d.ts +0 -22
  168. package/dist/cjs/tools/util/StationaryPenDetector.js +0 -95
  169. package/dist/mjs/tools/BaseTool.d.ts +0 -60
  170. package/dist/mjs/tools/BaseTool.mjs +0 -172
  171. package/dist/mjs/tools/Eraser.d.ts +0 -56
  172. package/dist/mjs/tools/Eraser.mjs +0 -288
  173. package/dist/mjs/tools/Eraser.test.d.ts +0 -1
  174. package/dist/mjs/tools/FindTool.d.ts +0 -21
  175. package/dist/mjs/tools/FindTool.mjs +0 -131
  176. package/dist/mjs/tools/FindTool.test.d.ts +0 -1
  177. package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +0 -12
  178. package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +0 -15
  179. package/dist/mjs/tools/InputFilter/InputMapper.d.ts +0 -23
  180. package/dist/mjs/tools/InputFilter/InputMapper.mjs +0 -36
  181. package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +0 -15
  182. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +0 -49
  183. package/dist/mjs/tools/InputFilter/InputPipeline.test.d.ts +0 -1
  184. package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +0 -29
  185. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +0 -175
  186. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +0 -21
  187. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +0 -78
  188. package/dist/mjs/tools/PanZoom.d.ts +0 -119
  189. package/dist/mjs/tools/PanZoom.mjs +0 -501
  190. package/dist/mjs/tools/PanZoom.test.d.ts +0 -1
  191. package/dist/mjs/tools/PasteHandler.d.ts +0 -23
  192. package/dist/mjs/tools/PasteHandler.mjs +0 -103
  193. package/dist/mjs/tools/Pen.d.ts +0 -53
  194. package/dist/mjs/tools/Pen.mjs +0 -312
  195. package/dist/mjs/tools/Pen.test.d.ts +0 -1
  196. package/dist/mjs/tools/PipetteTool.d.ts +0 -28
  197. package/dist/mjs/tools/PipetteTool.mjs +0 -63
  198. package/dist/mjs/tools/ScrollbarTool.d.ts +0 -18
  199. package/dist/mjs/tools/ScrollbarTool.mjs +0 -79
  200. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -9
  201. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +0 -26
  202. package/dist/mjs/tools/SelectionTool/Selection.d.ts +0 -71
  203. package/dist/mjs/tools/SelectionTool/Selection.mjs +0 -592
  204. package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +0 -62
  205. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +0 -137
  206. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +0 -40
  207. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +0 -488
  208. package/dist/mjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +0 -1
  209. package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  210. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +0 -23
  211. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +0 -77
  212. package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +0 -42
  213. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +0 -146
  214. package/dist/mjs/tools/SelectionTool/types.d.ts +0 -28
  215. package/dist/mjs/tools/SelectionTool/types.mjs +0 -11
  216. package/dist/mjs/tools/SoundUITool.d.ts +0 -26
  217. package/dist/mjs/tools/SoundUITool.mjs +0 -165
  218. package/dist/mjs/tools/TextTool.d.ts +0 -36
  219. package/dist/mjs/tools/TextTool.mjs +0 -279
  220. package/dist/mjs/tools/TextTool.test.d.ts +0 -1
  221. package/dist/mjs/tools/ToolController.d.ts +0 -73
  222. package/dist/mjs/tools/ToolController.mjs +0 -275
  223. package/dist/mjs/tools/ToolController.test.d.ts +0 -1
  224. package/dist/mjs/tools/ToolEnabledGroup.d.ts +0 -6
  225. package/dist/mjs/tools/ToolEnabledGroup.mjs +0 -10
  226. package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +0 -16
  227. package/dist/mjs/tools/ToolSwitcherShortcut.mjs +0 -34
  228. package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +0 -12
  229. package/dist/mjs/tools/ToolbarShortcutHandler.mjs +0 -28
  230. package/dist/mjs/tools/UndoRedoShortcut.d.ts +0 -8
  231. package/dist/mjs/tools/UndoRedoShortcut.mjs +0 -21
  232. package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  233. package/dist/mjs/tools/keybindings.d.ts +0 -18
  234. package/dist/mjs/tools/keybindings.mjs +0 -43
  235. package/dist/mjs/tools/lib.d.ts +0 -14
  236. package/dist/mjs/tools/lib.mjs +0 -14
  237. package/dist/mjs/tools/localization.d.ts +0 -34
  238. package/dist/mjs/tools/localization.mjs +0 -33
  239. package/dist/mjs/tools/util/StationaryPenDetector.d.ts +0 -22
  240. package/dist/mjs/tools/util/StationaryPenDetector.mjs +0 -92
  241. package/src/tools/FindTool.css +0 -7
  242. package/src/tools/ScrollbarTool.scss +0 -57
  243. package/src/tools/SelectionTool/SelectionTool.scss +0 -137
  244. package/src/tools/SoundUITool.scss +0 -22
  245. package/src/tools/tools.scss +0 -5
@@ -1,53 +0,0 @@
1
- import { Color4 } from '@js-draw/math';
2
- import Editor from '../Editor';
3
- import Pointer from '../Pointer';
4
- import { StrokeDataPoint } from '../types';
5
- import { KeyPressEvent, PointerEvt } from '../inputEvents';
6
- import BaseTool from './BaseTool';
7
- import { ComponentBuilder, ComponentBuilderFactory } from '../components/builders/types';
8
- import { MutableReactiveValue } from '../util/ReactiveValue';
9
- export interface PenStyle {
10
- readonly color: Color4;
11
- readonly thickness: number;
12
- readonly factory: ComponentBuilderFactory;
13
- }
14
- export default class Pen extends BaseTool {
15
- private editor;
16
- protected builder: ComponentBuilder | null;
17
- private lastPoint;
18
- private startPoint;
19
- private currentDeviceType;
20
- private styleValue;
21
- private style;
22
- private shapeAutocompletionEnabled;
23
- private autocorrectedShape;
24
- private lastAutocorrectedShape;
25
- private removedAutocorrectedShapeTime;
26
- private stationaryDetector;
27
- constructor(editor: Editor, description: string, style: Partial<PenStyle>);
28
- private getPressureMultiplier;
29
- protected toStrokePoint(pointer: Pointer): StrokeDataPoint;
30
- protected previewStroke(): void;
31
- protected addPointToStroke(point: StrokeDataPoint): void;
32
- onPointerDown(event: PointerEvt): boolean;
33
- private eventCanCancelStroke;
34
- eventCanBeDeliveredToNonActiveTool(event: PointerEvt): boolean;
35
- onPointerMove({ current }: PointerEvt): void;
36
- onPointerUp({ current }: PointerEvt): boolean;
37
- onGestureCancel(): void;
38
- private removedAutocorrectedShapeRecently;
39
- private autocorrectShape;
40
- private finalizeStroke;
41
- private noteUpdated;
42
- setColor(color: Color4): void;
43
- setThickness(thickness: number): void;
44
- setStrokeFactory(factory: ComponentBuilderFactory): void;
45
- setHasStabilization(hasStabilization: boolean): void;
46
- setStrokeAutocorrectEnabled(enabled: boolean): void;
47
- getStrokeAutocorrectionEnabled(): boolean;
48
- getThickness(): number;
49
- getColor(): Color4;
50
- getStrokeFactory(): ComponentBuilderFactory;
51
- getStyleValue(): MutableReactiveValue<PenStyle>;
52
- onKeyPress(event: KeyPressEvent): boolean;
53
- }
@@ -1,318 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const math_1 = require("@js-draw/math");
7
- const EditorImage_1 = __importDefault(require("../image/EditorImage"));
8
- const Pointer_1 = require("../Pointer");
9
- const FreehandLineBuilder_1 = require("../components/builders/FreehandLineBuilder");
10
- const types_1 = require("../types");
11
- const BaseTool_1 = __importDefault(require("./BaseTool"));
12
- const keybindings_1 = require("./keybindings");
13
- const keybindings_2 = require("./keybindings");
14
- const InputStabilizer_1 = __importDefault(require("./InputFilter/InputStabilizer"));
15
- const ReactiveValue_1 = require("../util/ReactiveValue");
16
- const StationaryPenDetector_1 = __importDefault(require("./util/StationaryPenDetector"));
17
- class Pen extends BaseTool_1.default {
18
- constructor(editor, description, style) {
19
- super(editor.notifier, description);
20
- this.editor = editor;
21
- this.builder = null;
22
- this.lastPoint = null;
23
- this.startPoint = null;
24
- this.currentDeviceType = null;
25
- this.shapeAutocompletionEnabled = false;
26
- this.autocorrectedShape = null;
27
- this.lastAutocorrectedShape = null;
28
- this.removedAutocorrectedShapeTime = 0;
29
- this.stationaryDetector = null;
30
- this.styleValue = ReactiveValue_1.ReactiveValue.fromInitialValue({
31
- factory: FreehandLineBuilder_1.makeFreehandLineBuilder,
32
- color: math_1.Color4.blue,
33
- thickness: 4,
34
- ...style,
35
- });
36
- this.styleValue.onUpdateAndNow(newValue => {
37
- this.style = newValue;
38
- this.noteUpdated();
39
- });
40
- }
41
- getPressureMultiplier() {
42
- const thickness = this.style.thickness;
43
- return 1 / this.editor.viewport.getScaleFactor() * thickness;
44
- }
45
- // Converts a `pointer` to a `StrokeDataPoint`.
46
- toStrokePoint(pointer) {
47
- const minPressure = 0.3;
48
- let pressure = Math.max(pointer.pressure ?? 1.0, minPressure);
49
- if (!isFinite(pressure)) {
50
- console.warn('Non-finite pressure!', pointer);
51
- pressure = minPressure;
52
- }
53
- console.assert(isFinite(pointer.canvasPos.length()), 'Non-finite canvas position!');
54
- console.assert(isFinite(pointer.screenPos.length()), 'Non-finite screen position!');
55
- console.assert(isFinite(pointer.timeStamp), 'Non-finite timeStamp on pointer!');
56
- const pos = pointer.canvasPos;
57
- return {
58
- pos,
59
- width: pressure * this.getPressureMultiplier(),
60
- color: this.style.color,
61
- time: pointer.timeStamp,
62
- };
63
- }
64
- // Displays the stroke that is currently being built with the display's `wetInkRenderer`.
65
- previewStroke() {
66
- this.editor.clearWetInk();
67
- const wetInkRenderer = this.editor.display.getWetInkRenderer();
68
- if (this.autocorrectedShape) {
69
- const visibleRect = this.editor.viewport.visibleRect;
70
- this.autocorrectedShape.render(wetInkRenderer, visibleRect);
71
- }
72
- else {
73
- this.builder?.preview(wetInkRenderer);
74
- }
75
- }
76
- // Throws if no stroke builder exists.
77
- addPointToStroke(point) {
78
- if (!this.builder) {
79
- throw new Error('No stroke is currently being generated.');
80
- }
81
- this.builder.addPoint(point);
82
- this.lastPoint = point;
83
- this.previewStroke();
84
- }
85
- onPointerDown(event) {
86
- const { current, allPointers } = event;
87
- const isEraser = current.device === Pointer_1.PointerDevice.Eraser;
88
- let anyDeviceIsStylus = false;
89
- for (const pointer of allPointers) {
90
- if (pointer.device === Pointer_1.PointerDevice.Pen) {
91
- anyDeviceIsStylus = true;
92
- break;
93
- }
94
- }
95
- // Avoid canceling an existing stroke
96
- if (this.builder && !this.eventCanCancelStroke(event)) {
97
- return true;
98
- }
99
- if ((allPointers.length === 1 && !isEraser) || anyDeviceIsStylus) {
100
- this.startPoint = this.toStrokePoint(current);
101
- this.builder = this.style.factory(this.startPoint, this.editor.viewport);
102
- this.currentDeviceType = current.device;
103
- if (this.shapeAutocompletionEnabled) {
104
- const stationaryDetectionConfig = {
105
- maxSpeed: 8.5, // screenPx/s
106
- maxRadius: 11, // screenPx
107
- minTimeSeconds: 0.5, // s
108
- };
109
- this.stationaryDetector = new StationaryPenDetector_1.default(current, stationaryDetectionConfig, pointer => this.autocorrectShape(pointer));
110
- }
111
- else {
112
- this.stationaryDetector = null;
113
- }
114
- this.lastAutocorrectedShape = null;
115
- this.removedAutocorrectedShapeTime = 0;
116
- return true;
117
- }
118
- return false;
119
- }
120
- eventCanCancelStroke(event) {
121
- // If there has been a delay since the last input event,
122
- // it's always okay to cancel
123
- const lastInputTime = this.lastPoint?.time ?? 0;
124
- if (event.current.timeStamp - lastInputTime > 1000) {
125
- return true;
126
- }
127
- const isPenStroke = this.currentDeviceType === Pointer_1.PointerDevice.Pen;
128
- const isTouchEvent = event.current.device === Pointer_1.PointerDevice.Touch;
129
- // Don't allow pen strokes to be cancelled by touch events.
130
- if (isPenStroke && isTouchEvent) {
131
- return false;
132
- }
133
- return true;
134
- }
135
- eventCanBeDeliveredToNonActiveTool(event) {
136
- return this.eventCanCancelStroke(event);
137
- }
138
- onPointerMove({ current }) {
139
- if (!this.builder)
140
- return;
141
- if (current.device !== this.currentDeviceType)
142
- return;
143
- const isStationary = this.stationaryDetector?.onPointerMove(current);
144
- if (!isStationary) {
145
- this.addPointToStroke(this.toStrokePoint(current));
146
- if (this.autocorrectedShape) {
147
- this.removedAutocorrectedShapeTime = performance.now();
148
- this.autocorrectedShape = null;
149
- this.editor.announceForAccessibility(this.editor.localization.autocorrectionCanceled);
150
- }
151
- }
152
- }
153
- onPointerUp({ current }) {
154
- if (!this.builder)
155
- return false;
156
- if (current.device !== this.currentDeviceType) {
157
- // this.builder still exists, so we're handling events from another
158
- // device type.
159
- return true;
160
- }
161
- this.stationaryDetector?.onPointerUp(current);
162
- // onPointerUp events can have zero pressure. Use the last pressure instead.
163
- const currentPoint = this.toStrokePoint(current);
164
- const strokePoint = {
165
- ...currentPoint,
166
- width: this.lastPoint?.width ?? currentPoint.width,
167
- };
168
- this.addPointToStroke(strokePoint);
169
- if (current.isPrimary) {
170
- this.finalizeStroke();
171
- }
172
- return false;
173
- }
174
- onGestureCancel() {
175
- this.builder = null;
176
- this.editor.clearWetInk();
177
- this.stationaryDetector?.destroy();
178
- this.stationaryDetector = null;
179
- }
180
- removedAutocorrectedShapeRecently() {
181
- return this.removedAutocorrectedShapeTime > performance.now() - 320;
182
- }
183
- async autocorrectShape(_lastPointer) {
184
- if (!this.builder || !this.builder.autocorrectShape)
185
- return;
186
- if (!this.shapeAutocompletionEnabled)
187
- return;
188
- // If already corrected, do nothing
189
- if (this.autocorrectedShape)
190
- return;
191
- // Activate stroke fitting
192
- const correctedShape = await this.builder.autocorrectShape();
193
- if (!this.builder || !correctedShape) {
194
- return;
195
- }
196
- // Don't complete to empty shapes.
197
- const bboxArea = correctedShape.getBBox().area;
198
- if (bboxArea === 0 || !isFinite(bboxArea)) {
199
- return;
200
- }
201
- const shapeDescription = correctedShape.description(this.editor.localization);
202
- this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(shapeDescription));
203
- this.autocorrectedShape = correctedShape;
204
- this.lastAutocorrectedShape = correctedShape;
205
- this.previewStroke();
206
- }
207
- finalizeStroke() {
208
- if (this.builder) {
209
- // If autocorrectedShape was cleared recently enough, it was
210
- // probably by mistake. Reset it.
211
- if (this.lastAutocorrectedShape && this.removedAutocorrectedShapeRecently()) {
212
- this.autocorrectedShape = this.lastAutocorrectedShape;
213
- }
214
- const stroke = this.autocorrectedShape ?? this.builder.build();
215
- this.previewStroke();
216
- if (stroke.getBBox().area > 0) {
217
- if (stroke === this.autocorrectedShape) {
218
- this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(stroke.description(this.editor.localization)));
219
- }
220
- const canFlatten = true;
221
- const action = EditorImage_1.default.addElement(stroke, canFlatten);
222
- this.editor.dispatch(action);
223
- }
224
- else {
225
- console.warn('Pen: Not adding empty stroke', stroke, 'to the canvas.');
226
- }
227
- }
228
- this.builder = null;
229
- this.lastPoint = null;
230
- this.autocorrectedShape = null;
231
- this.lastAutocorrectedShape = null;
232
- this.editor.clearWetInk();
233
- this.stationaryDetector?.destroy();
234
- this.stationaryDetector = null;
235
- }
236
- noteUpdated() {
237
- this.editor.notifier.dispatch(types_1.EditorEventType.ToolUpdated, {
238
- kind: types_1.EditorEventType.ToolUpdated,
239
- tool: this,
240
- });
241
- }
242
- setColor(color) {
243
- if (color.toHexString() !== this.style.color.toHexString()) {
244
- this.styleValue.set({
245
- ...this.style,
246
- color,
247
- });
248
- }
249
- }
250
- setThickness(thickness) {
251
- if (thickness !== this.style.thickness) {
252
- this.styleValue.set({
253
- ...this.style,
254
- thickness,
255
- });
256
- }
257
- }
258
- setStrokeFactory(factory) {
259
- if (factory !== this.style.factory) {
260
- this.styleValue.set({
261
- ...this.style,
262
- factory,
263
- });
264
- }
265
- }
266
- setHasStabilization(hasStabilization) {
267
- const hasInputMapper = !!this.getInputMapper();
268
- // TODO: Currently, this assumes that there is no other input mapper.
269
- if (hasStabilization === hasInputMapper) {
270
- return;
271
- }
272
- if (hasInputMapper) {
273
- this.setInputMapper(null);
274
- }
275
- else {
276
- this.setInputMapper(new InputStabilizer_1.default(this.editor.viewport));
277
- }
278
- this.noteUpdated();
279
- }
280
- setStrokeAutocorrectEnabled(enabled) {
281
- if (enabled !== this.shapeAutocompletionEnabled) {
282
- this.shapeAutocompletionEnabled = enabled;
283
- this.noteUpdated();
284
- }
285
- }
286
- getStrokeAutocorrectionEnabled() {
287
- return this.shapeAutocompletionEnabled;
288
- }
289
- getThickness() { return this.style.thickness; }
290
- getColor() { return this.style.color; }
291
- getStrokeFactory() { return this.style.factory; }
292
- getStyleValue() { return this.styleValue; }
293
- onKeyPress(event) {
294
- const shortcuts = this.editor.shortcuts;
295
- // Ctrl+Z: End the stroke so that it can be undone/redone.
296
- const isCtrlZ = shortcuts.matchesShortcut(keybindings_1.undoKeyboardShortcutId, event);
297
- if (this.builder && isCtrlZ) {
298
- this.finalizeStroke();
299
- // Return false: Allow other listeners to handle the event (e.g.
300
- // undo/redo).
301
- return false;
302
- }
303
- let newThickness;
304
- if (shortcuts.matchesShortcut(keybindings_2.decreaseSizeKeyboardShortcutId, event)) {
305
- newThickness = this.getThickness() * 2 / 3;
306
- }
307
- else if (shortcuts.matchesShortcut(keybindings_2.increaseSizeKeyboardShortcutId, event)) {
308
- newThickness = this.getThickness() * 3 / 2;
309
- }
310
- if (newThickness !== undefined) {
311
- newThickness = Math.min(Math.max(1, newThickness), 256);
312
- this.setThickness(newThickness);
313
- return true;
314
- }
315
- return false;
316
- }
317
- }
318
- exports.default = Pen;
@@ -1 +0,0 @@
1
- export {};
@@ -1,28 +0,0 @@
1
- import { Color4 } from '@js-draw/math';
2
- import Editor from '../Editor';
3
- import { PointerEvt } from '../inputEvents';
4
- import BaseTool from './BaseTool';
5
- type ColorListener = (color: Color4 | null) => void;
6
- /**
7
- * A tool used internally to pick colors from the canvas.
8
- *
9
- * When color selection is in progress, the `pipette--color-selection-in-progress` class
10
- * is added to the root element. This can be used by themes.
11
- *
12
- * @internal
13
- */
14
- export default class PipetteTool extends BaseTool {
15
- private editor;
16
- private colorPreviewListener;
17
- private colorSelectListener;
18
- constructor(editor: Editor, description: string);
19
- canReceiveInputInReadOnlyEditor(): boolean;
20
- private updateSelectingStatus;
21
- setColorListener(colorPreviewListener: ColorListener, colorSelectListener: ColorListener): void;
22
- clearColorListener(): void;
23
- onPointerDown({ current, allPointers }: PointerEvt): boolean;
24
- onPointerMove({ current }: PointerEvt): void;
25
- onPointerUp({ current }: PointerEvt): void;
26
- onGestureCancel(): void;
27
- }
28
- export {};
@@ -1,69 +0,0 @@
1
- "use strict";
2
- // @internal @packageDocumentation
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const BaseTool_1 = __importDefault(require("./BaseTool"));
8
- /**
9
- * A tool used internally to pick colors from the canvas.
10
- *
11
- * When color selection is in progress, the `pipette--color-selection-in-progress` class
12
- * is added to the root element. This can be used by themes.
13
- *
14
- * @internal
15
- */
16
- class PipetteTool extends BaseTool_1.default {
17
- constructor(editor, description) {
18
- super(editor.notifier, description);
19
- this.editor = editor;
20
- this.colorPreviewListener = null;
21
- this.colorSelectListener = null;
22
- this.enabledValue().onUpdateAndNow(() => {
23
- this.updateSelectingStatus();
24
- });
25
- }
26
- canReceiveInputInReadOnlyEditor() {
27
- return true;
28
- }
29
- // Ensures that the root editor element correctly reflects whether color selection
30
- // is in progress.
31
- updateSelectingStatus() {
32
- const className = 'pipette--color-selection-in-progress';
33
- if (this.isEnabled() && this.colorSelectListener && this.colorPreviewListener) {
34
- this.editor.getRootElement().classList.add(className);
35
- }
36
- else {
37
- this.editor.getRootElement().classList.remove(className);
38
- }
39
- }
40
- setColorListener(colorPreviewListener,
41
- // Called when the gesture ends -- when the user has selected a color.
42
- colorSelectListener) {
43
- this.colorPreviewListener = colorPreviewListener;
44
- this.colorSelectListener = colorSelectListener;
45
- this.updateSelectingStatus();
46
- }
47
- clearColorListener() {
48
- this.colorPreviewListener = null;
49
- this.colorSelectListener = null;
50
- this.updateSelectingStatus();
51
- }
52
- onPointerDown({ current, allPointers }) {
53
- if (this.colorPreviewListener && allPointers.length === 1) {
54
- this.colorPreviewListener(this.editor.display.getColorAt(current.screenPos));
55
- return true;
56
- }
57
- return false;
58
- }
59
- onPointerMove({ current }) {
60
- this.colorPreviewListener?.(this.editor.display.getColorAt(current.screenPos));
61
- }
62
- onPointerUp({ current }) {
63
- this.colorSelectListener?.(this.editor.display.getColorAt(current.screenPos));
64
- }
65
- onGestureCancel() {
66
- this.colorSelectListener?.(null);
67
- }
68
- }
69
- exports.default = PipetteTool;
@@ -1,18 +0,0 @@
1
- import Editor from '../Editor';
2
- import BaseTool from './BaseTool';
3
- /**
4
- * This tool, when enabled, renders scrollbars reflecting the current position
5
- * of the view relative to the import/export area of the image.
6
- *
7
- * **Note**: These scrollbars are currently not draggable. This may change in
8
- * a future release.
9
- */
10
- export default class ScrollbarTool extends BaseTool {
11
- private editor;
12
- private scrollbarOverlay;
13
- private verticalScrollbar;
14
- private horizontalScrollbar;
15
- constructor(editor: Editor);
16
- private fadeOutTimeout;
17
- private updateScrollbars;
18
- }
@@ -1,85 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const math_1 = require("@js-draw/math");
7
- const types_1 = require("../types");
8
- const BaseTool_1 = __importDefault(require("./BaseTool"));
9
- /**
10
- * This tool, when enabled, renders scrollbars reflecting the current position
11
- * of the view relative to the import/export area of the image.
12
- *
13
- * **Note**: These scrollbars are currently not draggable. This may change in
14
- * a future release.
15
- */
16
- class ScrollbarTool extends BaseTool_1.default {
17
- constructor(editor) {
18
- super(editor.notifier, 'scrollbar');
19
- this.editor = editor;
20
- this.fadeOutTimeout = null;
21
- this.scrollbarOverlay = document.createElement('div');
22
- this.scrollbarOverlay.classList.add('ScrollbarTool-overlay');
23
- this.verticalScrollbar = document.createElement('div');
24
- this.verticalScrollbar.classList.add('vertical-scrollbar');
25
- this.horizontalScrollbar = document.createElement('div');
26
- this.horizontalScrollbar.classList.add('horizontal-scrollbar');
27
- this.scrollbarOverlay.replaceChildren(this.verticalScrollbar, this.horizontalScrollbar);
28
- let overlay = null;
29
- let viewportListener = null;
30
- this.enabledValue().onUpdateAndNow(enabled => {
31
- overlay?.remove();
32
- viewportListener?.remove();
33
- viewportListener = null;
34
- overlay = null;
35
- if (enabled) {
36
- viewportListener = editor.notifier.on(types_1.EditorEventType.ViewportChanged, _event => {
37
- this.updateScrollbars();
38
- });
39
- this.updateScrollbars();
40
- overlay = editor.createHTMLOverlay(this.scrollbarOverlay);
41
- }
42
- });
43
- }
44
- updateScrollbars() {
45
- const viewport = this.editor.viewport;
46
- const screenSize = viewport.getScreenRectSize();
47
- const screenRect = new math_1.Rect2(0, 0, screenSize.x, screenSize.y);
48
- const imageRect = this.editor.getImportExportRect()
49
- // The scrollbars are positioned in screen coordinates, so the exportRect also needs
50
- // to be in screen coordinates
51
- .transformedBoundingBox(viewport.canvasToScreenTransform)
52
- // If the screenRect is outside of the exportRect, expand the image rectangle
53
- .union(screenRect);
54
- const scrollbarWidth = screenRect.width / imageRect.width * screenSize.x;
55
- const scrollbarHeight = screenRect.height / imageRect.height * screenSize.y;
56
- const scrollbarX = (screenRect.x - imageRect.x) / imageRect.width * (screenSize.x);
57
- const scrollbarY = (screenRect.y - imageRect.y) / imageRect.height * (screenSize.y);
58
- this.horizontalScrollbar.style.width = `${scrollbarWidth}px`;
59
- this.verticalScrollbar.style.height = `${scrollbarHeight}px`;
60
- this.horizontalScrollbar.style.marginLeft = `${scrollbarX}px`;
61
- this.verticalScrollbar.style.marginTop = `${scrollbarY}px`;
62
- // Style the scrollbars differently when there's no scroll (all content visible)
63
- const handleNoScrollStyling = (scrollbar, size, fillSize) => {
64
- const fillsWindowClass = 'represents-no-scroll';
65
- if (Math.abs(size - fillSize) < 1e-8) {
66
- scrollbar.classList.add(fillsWindowClass);
67
- }
68
- else {
69
- scrollbar.classList.remove(fillsWindowClass);
70
- }
71
- };
72
- handleNoScrollStyling(this.horizontalScrollbar, scrollbarWidth, screenSize.x);
73
- handleNoScrollStyling(this.verticalScrollbar, scrollbarHeight, screenSize.y);
74
- // Fade out after a delay.
75
- if (this.fadeOutTimeout !== null) {
76
- clearTimeout(this.fadeOutTimeout);
77
- }
78
- const fadeOutDelay = 3000;
79
- this.fadeOutTimeout = setTimeout(() => {
80
- this.scrollbarOverlay.classList.remove('just-updated');
81
- }, fadeOutDelay);
82
- this.scrollbarOverlay.classList.add('just-updated');
83
- }
84
- }
85
- exports.default = ScrollbarTool;
@@ -1,9 +0,0 @@
1
- import Editor from '../../Editor';
2
- import { KeyPressEvent } from '../../inputEvents';
3
- import BaseTool from '../BaseTool';
4
- export default class SelectAllShortcutHandler extends BaseTool {
5
- private editor;
6
- constructor(editor: Editor);
7
- canReceiveInputInReadOnlyEditor(): boolean;
8
- onKeyPress(event: KeyPressEvent): boolean;
9
- }
@@ -1,32 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const BaseTool_1 = __importDefault(require("../BaseTool"));
7
- const keybindings_1 = require("../keybindings");
8
- const SelectionTool_1 = __importDefault(require("./SelectionTool"));
9
- // Handles ctrl+a: Select all
10
- class SelectAllShortcutHandler extends BaseTool_1.default {
11
- constructor(editor) {
12
- super(editor.notifier, editor.localization.selectAllTool);
13
- this.editor = editor;
14
- }
15
- canReceiveInputInReadOnlyEditor() {
16
- return true;
17
- }
18
- // @internal
19
- onKeyPress(event) {
20
- if (this.editor.shortcuts.matchesShortcut(keybindings_1.selectAllKeyboardShortcut, event)) {
21
- const selectionTools = this.editor.toolController.getMatchingTools(SelectionTool_1.default);
22
- if (selectionTools.length > 0) {
23
- const selectionTool = selectionTools[0];
24
- selectionTool.setEnabled(true);
25
- selectionTool.setSelection(this.editor.image.getAllElements());
26
- return true;
27
- }
28
- }
29
- return false;
30
- }
31
- }
32
- exports.default = SelectAllShortcutHandler;