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,155 +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
- exports.RotateTransformer = exports.ResizeTransformer = exports.DragTransformer = void 0;
7
- const math_1 = require("@js-draw/math");
8
- const Viewport_1 = __importDefault(require("../../Viewport"));
9
- const types_1 = require("./types");
10
- class DragTransformer {
11
- constructor(editor, selection) {
12
- this.editor = editor;
13
- this.selection = selection;
14
- }
15
- onDragStart(startPoint) {
16
- this.selection.setTransform(math_1.Mat33.identity);
17
- this.dragStartPoint = startPoint;
18
- }
19
- onDragUpdate(canvasPos) {
20
- const delta = this.editor.viewport.roundPoint(canvasPos.minus(this.dragStartPoint));
21
- this.selection.setTransform(math_1.Mat33.translation(delta));
22
- }
23
- onDragEnd() {
24
- return this.selection.finalizeTransform();
25
- }
26
- }
27
- exports.DragTransformer = DragTransformer;
28
- class ResizeTransformer {
29
- constructor(editor, selection) {
30
- this.editor = editor;
31
- this.selection = selection;
32
- this.mode = types_1.ResizeMode.Both;
33
- }
34
- onDragStart(startPoint, mode) {
35
- this.selection.setTransform(math_1.Mat33.identity);
36
- this.mode = mode;
37
- this.dragStartPoint = startPoint;
38
- this.computeOriginAndScaleRate();
39
- }
40
- computeOriginAndScaleRate() {
41
- // Store the index of the furthest corner from startPoint. We'll use that
42
- // to determine where the transform considers (0, 0) (where we scale from).
43
- const selectionRect = this.selection.preTransformRegion;
44
- const selectionBoxCorners = selectionRect.corners;
45
- let largestDistSquared = 0;
46
- for (let i = 0; i < selectionBoxCorners.length; i++) {
47
- const currentCorner = selectionBoxCorners[i];
48
- const distSquaredToCurrent = this.dragStartPoint.minus(currentCorner).magnitudeSquared();
49
- if (distSquaredToCurrent > largestDistSquared) {
50
- largestDistSquared = distSquaredToCurrent;
51
- this.transformOrigin = currentCorner;
52
- }
53
- }
54
- // Determine whether moving the mouse to the right increases or decreases the width.
55
- let widthScaleRate = 1;
56
- let heightScaleRate = 1;
57
- if (this.transformOrigin.x > selectionRect.center.x) {
58
- widthScaleRate = -1;
59
- }
60
- if (this.transformOrigin.y > selectionRect.center.y) {
61
- heightScaleRate = -1;
62
- }
63
- this.scaleRate = math_1.Vec2.of(widthScaleRate, heightScaleRate);
64
- }
65
- onDragUpdate(canvasPos) {
66
- const canvasDelta = canvasPos.minus(this.dragStartPoint);
67
- const origWidth = this.selection.preTransformRegion.width;
68
- const origHeight = this.selection.preTransformRegion.height;
69
- let scale = math_1.Vec2.of(1, 1);
70
- if (this.mode === types_1.ResizeMode.HorizontalOnly) {
71
- const newWidth = origWidth + canvasDelta.x * this.scaleRate.x;
72
- scale = math_1.Vec2.of(newWidth / origWidth, scale.y);
73
- }
74
- if (this.mode === types_1.ResizeMode.VerticalOnly) {
75
- const newHeight = origHeight + canvasDelta.y * this.scaleRate.y;
76
- scale = math_1.Vec2.of(scale.x, newHeight / origHeight);
77
- }
78
- if (this.mode === types_1.ResizeMode.Both) {
79
- const delta = Math.abs(canvasDelta.x) > Math.abs(canvasDelta.y) ? canvasDelta.x : canvasDelta.y;
80
- const newWidth = origWidth + delta;
81
- scale = math_1.Vec2.of(newWidth / origWidth, newWidth / origWidth);
82
- }
83
- // Round: If this isn't done, scaling can create numbers with long decimal representations.
84
- // long decimal representations => large file sizes.
85
- scale = scale.map(component => Viewport_1.default.roundScaleRatio(component, 2));
86
- if (scale.x !== 0 && scale.y !== 0) {
87
- const origin = this.editor.viewport.roundPoint(this.transformOrigin);
88
- this.selection.setTransform(math_1.Mat33.scaling2D(scale, origin));
89
- }
90
- }
91
- onDragEnd() {
92
- return this.selection.finalizeTransform();
93
- }
94
- }
95
- exports.ResizeTransformer = ResizeTransformer;
96
- class RotateTransformer {
97
- constructor(editor, selection) {
98
- this.editor = editor;
99
- this.selection = selection;
100
- this.startAngle = 0;
101
- this.targetRotation = 0;
102
- this.maximumDistFromStart = 0;
103
- }
104
- getAngle(canvasPoint) {
105
- const selectionCenter = this.selection.preTransformRegion.center;
106
- const offset = canvasPoint.minus(selectionCenter);
107
- return offset.angle();
108
- }
109
- roundAngle(angle) {
110
- // Round angles to the nearest 16th of a turn
111
- const roundingFactor = 16 / 2 / Math.PI;
112
- return Math.round(angle * roundingFactor) / roundingFactor;
113
- }
114
- onDragStart(startPoint) {
115
- this.startPoint = startPoint;
116
- this.selection.setTransform(math_1.Mat33.identity);
117
- this.startAngle = this.getAngle(startPoint);
118
- this.targetRotation = 0;
119
- // Used to determine whether the user clicked or not.
120
- this.maximumDistFromStart = 0;
121
- this.startTime = performance.now();
122
- }
123
- setRotationTo(angle) {
124
- // Transform in canvas space
125
- const canvasSelCenter = this.editor.viewport.roundPoint(this.selection.preTransformRegion.center);
126
- const unrounded = math_1.Mat33.zRotation(angle);
127
- const roundedRotationTransform = unrounded.mapEntries(entry => Viewport_1.default.roundScaleRatio(entry));
128
- const fullRoundedTransform = math_1.Mat33
129
- .translation(canvasSelCenter)
130
- .rightMul(roundedRotationTransform)
131
- .rightMul(math_1.Mat33.translation(canvasSelCenter.times(-1)));
132
- this.selection.setTransform(fullRoundedTransform);
133
- }
134
- onDragUpdate(canvasPos) {
135
- this.targetRotation = this.roundAngle(this.getAngle(canvasPos) - this.startAngle);
136
- this.setRotationTo(this.targetRotation);
137
- const distFromStart = canvasPos.minus(this.startPoint).magnitude();
138
- if (distFromStart > this.maximumDistFromStart) {
139
- this.maximumDistFromStart = distFromStart;
140
- }
141
- }
142
- onDragEnd() {
143
- // Anything with motion less than this is considered a click
144
- const clickThresholdDist = 10;
145
- const clickThresholdTime = 0.4; // s
146
- const dragTimeSeconds = (performance.now() - this.startTime) / 1000;
147
- if (dragTimeSeconds < clickThresholdTime
148
- && this.maximumDistFromStart < clickThresholdDist
149
- && this.targetRotation === 0) {
150
- this.setRotationTo(-Math.PI / 2);
151
- }
152
- return this.selection.finalizeTransform();
153
- }
154
- }
155
- exports.RotateTransformer = RotateTransformer;
@@ -1,28 +0,0 @@
1
- import type { Rect2, Point2 } from '@js-draw/math';
2
- import Pointer from '../../Pointer';
3
- export declare enum ResizeMode {
4
- Both = 0,
5
- HorizontalOnly = 1,
6
- VerticalOnly = 2
7
- }
8
- export declare enum TransformMode {
9
- Snap = 0,
10
- NoSnap = 1
11
- }
12
- /**
13
- * Represents a child of the selection that should move with the selection
14
- * and handle events.
15
- *
16
- * Although selection children should be `HTMLElement`s, the selection may be
17
- * hidden behind an invisible element. As such, these elements should handle
18
- * drag start/update/end events.
19
- */
20
- export interface SelectionBoxChild {
21
- updatePosition(selectionScreenBBox: Rect2): void;
22
- containsPoint(point: Point2): boolean;
23
- addTo(container: HTMLElement): void;
24
- remove(): void;
25
- handleDragStart(pointer: Pointer): boolean;
26
- handleDragUpdate(pointer: Pointer): void;
27
- handleDragEnd(): void;
28
- }
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransformMode = exports.ResizeMode = void 0;
4
- var ResizeMode;
5
- (function (ResizeMode) {
6
- ResizeMode[ResizeMode["Both"] = 0] = "Both";
7
- ResizeMode[ResizeMode["HorizontalOnly"] = 1] = "HorizontalOnly";
8
- ResizeMode[ResizeMode["VerticalOnly"] = 2] = "VerticalOnly";
9
- })(ResizeMode || (exports.ResizeMode = ResizeMode = {}));
10
- var TransformMode;
11
- (function (TransformMode) {
12
- TransformMode[TransformMode["Snap"] = 0] = "Snap";
13
- TransformMode[TransformMode["NoSnap"] = 1] = "NoSnap";
14
- })(TransformMode || (exports.TransformMode = TransformMode = {}));
@@ -1,26 +0,0 @@
1
- import Editor from '../Editor';
2
- import { KeyPressEvent, PointerEvt } from '../inputEvents';
3
- import BaseTool from './BaseTool';
4
- /**
5
- * This tool, when enabled, plays a sound representing the color of the portion of the display
6
- * currently under the cursor. This tool adds a button that can be navigated to with the tab key
7
- * that enables/disables the tool.
8
- *
9
- * This allows the user to explore the content of the display without a working screen.
10
- */
11
- export default class SoundUITool extends BaseTool {
12
- private editor;
13
- private soundFeedback;
14
- private toggleButton;
15
- private toggleButtonContainer;
16
- constructor(editor: Editor, description: string);
17
- canReceiveInputInReadOnlyEditor(): boolean;
18
- private updateToggleButtonText;
19
- setEnabled(enabled: boolean): void;
20
- onKeyPress(event: KeyPressEvent): boolean;
21
- private lastPointerPos;
22
- onPointerDown({ current, allPointers }: PointerEvt): boolean;
23
- onPointerMove({ current }: PointerEvt): void;
24
- onPointerUp(_event: PointerEvt): void;
25
- onGestureCancel(): void;
26
- }
@@ -1,171 +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 BaseTool_1 = __importDefault(require("./BaseTool"));
8
- class SoundFeedback {
9
- constructor() {
10
- this.closed = false;
11
- // No AudioContext? Exit!
12
- if (!window.AudioContext) {
13
- console.warn('Accessibility sound UI: Unable to open AudioContext.');
14
- this.closed = true;
15
- return;
16
- }
17
- this.ctx = new AudioContext();
18
- // Color oscillator and gain
19
- this.colorOscHue = this.ctx.createOscillator();
20
- this.colorOscValue = this.ctx.createOscillator();
21
- this.colorOscSaturation = this.ctx.createOscillator();
22
- this.colorOscHue.type = 'triangle';
23
- this.colorOscSaturation.type = 'sine';
24
- this.colorOscValue.type = 'sawtooth';
25
- this.valueGain = this.ctx.createGain();
26
- this.colorOscValue.connect(this.valueGain);
27
- this.valueGain.gain.setValueAtTime(0.18, this.ctx.currentTime);
28
- this.colorGain = this.ctx.createGain();
29
- this.colorOscHue.connect(this.colorGain);
30
- this.valueGain.connect(this.colorGain);
31
- this.colorOscSaturation.connect(this.colorGain);
32
- this.colorGain.connect(this.ctx.destination);
33
- // Boundary oscillator and gain
34
- this.boundaryGain = this.ctx.createGain();
35
- this.boundaryOsc = this.ctx.createOscillator();
36
- this.boundaryOsc.type = 'sawtooth';
37
- this.boundaryGain.gain.setValueAtTime(0, this.ctx.currentTime);
38
- this.boundaryOsc.connect(this.boundaryGain);
39
- this.boundaryGain.connect(this.ctx.destination);
40
- // Prepare for the first announcement/feedback.
41
- this.colorOscHue.start();
42
- this.colorOscSaturation.start();
43
- this.colorOscValue.start();
44
- this.boundaryOsc.start();
45
- this.pause();
46
- }
47
- pause() {
48
- if (this.closed)
49
- return;
50
- this.colorGain.gain.setValueAtTime(0, this.ctx.currentTime);
51
- void this.ctx.suspend();
52
- }
53
- play() {
54
- if (this.closed)
55
- return;
56
- void this.ctx.resume();
57
- }
58
- setColor(color) {
59
- const hsv = color.asHSV();
60
- // Choose frequencies that roughly correspond to hue, saturation, and value.
61
- const hueFrequency = (-Math.cos(hsv.x / 2)) * 220 + 440;
62
- const saturationFrequency = hsv.y * 440 + 220;
63
- const valueFrequency = (hsv.z + 0.1) * 440;
64
- // Sigmoid with maximum 0.25 * alpha.
65
- // Louder for greater value.
66
- const gain = 0.25 * Math.min(1, color.a) / (1 + Math.exp(-(hsv.z - 0.5) * 3));
67
- this.colorOscHue.frequency.setValueAtTime(hueFrequency, this.ctx.currentTime);
68
- this.colorOscSaturation.frequency.setValueAtTime(saturationFrequency, this.ctx.currentTime);
69
- this.colorOscValue.frequency.setValueAtTime(valueFrequency, this.ctx.currentTime);
70
- this.valueGain.gain.setValueAtTime((1 - hsv.z) * 0.4, this.ctx.currentTime);
71
- this.colorGain.gain.setValueAtTime(gain, this.ctx.currentTime);
72
- }
73
- announceBoundaryCross(boundaryCrossCount) {
74
- this.boundaryGain.gain.cancelScheduledValues(this.ctx.currentTime);
75
- this.boundaryGain.gain.setValueAtTime(0, this.ctx.currentTime);
76
- this.boundaryGain.gain.linearRampToValueAtTime(0.018, this.ctx.currentTime + 0.1);
77
- this.boundaryOsc.frequency.setValueAtTime(440 + Math.atan(boundaryCrossCount / 2) * 100, this.ctx.currentTime);
78
- this.boundaryGain.gain.linearRampToValueAtTime(0, this.ctx.currentTime + 0.25);
79
- }
80
- close() {
81
- this.ctx.close();
82
- this.closed = true;
83
- }
84
- }
85
- /**
86
- * This tool, when enabled, plays a sound representing the color of the portion of the display
87
- * currently under the cursor. This tool adds a button that can be navigated to with the tab key
88
- * that enables/disables the tool.
89
- *
90
- * This allows the user to explore the content of the display without a working screen.
91
- */
92
- class SoundUITool extends BaseTool_1.default {
93
- constructor(editor, description) {
94
- super(editor.notifier, description);
95
- this.editor = editor;
96
- this.soundFeedback = null;
97
- // Create a screen-reader-usable method of toggling the tool:
98
- this.toggleButtonContainer = document.createElement('div');
99
- this.toggleButtonContainer.classList.add('js-draw-sound-ui-toggle');
100
- this.toggleButton = document.createElement('button');
101
- this.toggleButton.onclick = () => {
102
- this.setEnabled(!this.isEnabled());
103
- };
104
- this.toggleButtonContainer.appendChild(this.toggleButton);
105
- this.updateToggleButtonText();
106
- editor.createHTMLOverlay(this.toggleButtonContainer);
107
- }
108
- canReceiveInputInReadOnlyEditor() {
109
- return true;
110
- }
111
- updateToggleButtonText() {
112
- const containerEnabledClass = 'sound-ui-tool-enabled';
113
- if (this.isEnabled()) {
114
- this.toggleButton.innerText = this.editor.localization.disableAccessibilityExploreTool;
115
- this.toggleButtonContainer.classList.add(containerEnabledClass);
116
- }
117
- else {
118
- this.toggleButton.innerText = this.editor.localization.enableAccessibilityExploreTool;
119
- this.toggleButtonContainer.classList.remove(containerEnabledClass);
120
- }
121
- }
122
- setEnabled(enabled) {
123
- super.setEnabled(enabled);
124
- if (!this.isEnabled()) {
125
- this.soundFeedback?.close();
126
- this.soundFeedback = null;
127
- }
128
- else {
129
- this.editor.announceForAccessibility(this.editor.localization.soundExplorerUsageAnnouncement);
130
- }
131
- this.updateToggleButtonText();
132
- }
133
- onKeyPress(event) {
134
- if (event.code === 'Escape') {
135
- this.setEnabled(false);
136
- return true;
137
- }
138
- return false;
139
- }
140
- onPointerDown({ current, allPointers }) {
141
- if (!this.soundFeedback) {
142
- this.soundFeedback = new SoundFeedback();
143
- }
144
- // Allow two-finger gestures to move the screen.
145
- if (allPointers.length >= 2) {
146
- return false;
147
- }
148
- // Accept multiple cursors -- some screen readers require multiple (touch) pointers to interact with
149
- // an image instead of using the built-in navigation features.
150
- this.soundFeedback?.play();
151
- this.soundFeedback?.setColor(this.editor.display.getColorAt(current.screenPos) ?? math_1.Color4.black);
152
- this.lastPointerPos = current.canvasPos;
153
- return true;
154
- }
155
- onPointerMove({ current }) {
156
- this.soundFeedback?.setColor(this.editor.display.getColorAt(current.screenPos) ?? math_1.Color4.black);
157
- const pointerMotionLine = new math_1.LineSegment2(this.lastPointerPos, current.canvasPos);
158
- const collisions = this.editor.image.getElementsIntersectingRegion(pointerMotionLine.bbox).filter(component => component.intersects(pointerMotionLine));
159
- this.lastPointerPos = current.canvasPos;
160
- if (collisions.length > 0) {
161
- this.soundFeedback?.announceBoundaryCross(collisions.length);
162
- }
163
- }
164
- onPointerUp(_event) {
165
- this.soundFeedback?.pause();
166
- }
167
- onGestureCancel() {
168
- this.soundFeedback?.pause();
169
- }
170
- }
171
- exports.default = SoundUITool;
@@ -1,36 +0,0 @@
1
- import Editor from '../Editor';
2
- import { Color4 } from '@js-draw/math';
3
- import { PointerEvt } from '../inputEvents';
4
- import BaseTool from './BaseTool';
5
- import { ToolLocalization } from './localization';
6
- import TextRenderingStyle from '../rendering/TextRenderingStyle';
7
- import { MutableReactiveValue } from '../util/ReactiveValue';
8
- export default class TextTool extends BaseTool {
9
- private editor;
10
- private localizationTable;
11
- private textStyleValue;
12
- private textStyle;
13
- private textEditOverlay;
14
- private textInputElem;
15
- private textTargetPosition;
16
- private textMeasuringCtx;
17
- private textRotation;
18
- private textScale;
19
- private removeExistingCommand;
20
- constructor(editor: Editor, description: string, localizationTable: ToolLocalization);
21
- private initTextMeasuringCanvas;
22
- private getTextAscent;
23
- private flushInput;
24
- private getTextScaleMatrix;
25
- private updateTextInput;
26
- private startTextInput;
27
- setEnabled(enabled: boolean): void;
28
- onPointerDown({ current, allPointers }: PointerEvt): boolean;
29
- onGestureCancel(): void;
30
- setFontFamily(fontFamily: string): void;
31
- setColor(color: Color4): void;
32
- setFontSize(size: number): void;
33
- getTextStyle(): TextRenderingStyle;
34
- getStyleValue(): MutableReactiveValue<TextRenderingStyle>;
35
- private setTextStyle;
36
- }