js-draw 1.21.2 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +103 -75
- package/build-config.json +2 -2
- package/dist/Editor.css +29 -16
- package/dist/bundle.js +2 -2
- package/dist/bundledStyles.js +1 -1
- package/dist/cjs/Editor.js +36 -22
- package/dist/cjs/EventDispatcher.js +1 -1
- package/dist/cjs/Pointer.js +3 -3
- package/dist/cjs/SVGLoader/SVGLoader.js +13 -6
- package/dist/cjs/UndoRedoHistory.js +1 -1
- package/dist/cjs/Viewport.js +4 -2
- package/dist/cjs/commands/Command.js +7 -5
- package/dist/cjs/commands/Duplicate.js +2 -2
- package/dist/cjs/commands/Erase.js +3 -4
- package/dist/cjs/commands/invertCommand.js +4 -4
- package/dist/cjs/commands/lib.d.ts +1 -1
- package/dist/cjs/commands/uniteCommands.js +4 -4
- package/dist/cjs/components/AbstractComponent.d.ts +1 -1
- package/dist/cjs/components/AbstractComponent.js +3 -3
- package/dist/cjs/components/BackgroundComponent.js +8 -6
- package/dist/cjs/components/ImageComponent.js +12 -5
- package/dist/cjs/components/RestylableComponent.js +1 -1
- package/dist/cjs/components/SVGGlobalAttributesObject.js +1 -2
- package/dist/cjs/components/Stroke.js +37 -24
- package/dist/cjs/components/TextComponent.js +13 -10
- package/dist/cjs/components/UnknownSVGObject.js +2 -3
- package/dist/cjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/ArrowBuilder.js +9 -3
- package/dist/cjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/CircleBuilder.js +11 -4
- package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/FreehandLineBuilder.js +10 -4
- package/dist/cjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/LineBuilder.js +8 -4
- package/dist/cjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/cjs/components/builders/PolylineBuilder.js +9 -5
- package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +16 -10
- package/dist/cjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/cjs/components/builders/RectangleBuilder.js +17 -3
- package/dist/cjs/components/builders/autocorrect/makeShapeFitAutocorrect.js +5 -8
- package/dist/cjs/components/builders/autocorrect/makeSnapToGridAutocorrect.js +1 -1
- package/dist/cjs/components/builders/lib.d.ts +7 -0
- package/dist/cjs/components/builders/lib.js +18 -0
- package/dist/cjs/components/lib.d.ts +1 -4
- package/dist/cjs/components/lib.js +2 -9
- package/dist/cjs/components/util/StrokeSmoother.js +5 -6
- package/dist/cjs/dialogs/makeAboutDialog.js +1 -1
- package/dist/cjs/dialogs/makeMessageDialog.js +2 -2
- package/dist/cjs/image/EditorImage.js +13 -15
- package/dist/cjs/image/export/editorImageToSVG.js +1 -1
- package/dist/cjs/inputEvents.js +3 -3
- package/dist/cjs/lib.d.ts +2 -2
- package/dist/cjs/localizations/de.js +2 -2
- package/dist/cjs/localizations/es.js +7 -3
- package/dist/cjs/rendering/Display.js +7 -3
- package/dist/cjs/rendering/RenderablePathSpec.js +26 -11
- package/dist/cjs/rendering/RenderingStyle.js +22 -15
- package/dist/cjs/rendering/TextRenderingStyle.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecord.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecordManager.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCache.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCacheNode.js +26 -15
- package/dist/cjs/rendering/caching/testUtils.js +2 -2
- package/dist/cjs/rendering/renderers/AbstractRenderer.js +3 -1
- package/dist/cjs/rendering/renderers/CanvasRenderer.js +4 -3
- package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
- package/dist/cjs/rendering/renderers/SVGRenderer.js +37 -19
- package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +13 -15
- package/dist/cjs/shortcuts/KeyBinding.js +6 -12
- package/dist/cjs/shortcuts/KeyboardShortcutManager.js +2 -2
- package/dist/cjs/testing/createEditor.js +6 -1
- package/dist/cjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/cjs/testing/findNodeWithText.js +12 -3
- package/dist/cjs/testing/getUniquePointerId.js +1 -1
- package/dist/cjs/testing/sendHtmlSwipe.js +7 -3
- package/dist/cjs/testing/sendPenEvent.js +1 -3
- package/dist/cjs/testing/sendTouchEvent.js +1 -4
- package/dist/cjs/testing/startPinchGesture.js +3 -1
- package/dist/cjs/toolbar/AbstractToolbar.js +7 -11
- package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
- package/dist/cjs/toolbar/IconProvider.js +5 -3
- package/dist/cjs/toolbar/localization.js +3 -3
- package/dist/cjs/toolbar/utils/HelpDisplay.js +8 -6
- package/dist/cjs/toolbar/utils/makeDraggable.js +4 -7
- package/dist/cjs/toolbar/widgets/BaseToolWidget.js +3 -2
- package/dist/cjs/toolbar/widgets/BaseWidget.js +7 -7
- package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/EraserToolWidget.js +5 -3
- package/dist/cjs/toolbar/widgets/HandToolWidget.js +8 -6
- package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +9 -10
- package/dist/cjs/toolbar/widgets/PenToolWidget.js +22 -13
- package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/TextToolWidget.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeFileInput.js +7 -7
- package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +9 -5
- package/dist/cjs/toolbar/widgets/keybindings.js +2 -2
- package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +6 -6
- package/dist/cjs/tools/BaseTool.d.ts +61 -0
- package/dist/cjs/tools/BaseTool.js +181 -0
- package/dist/cjs/tools/Eraser.d.ts +60 -0
- package/dist/cjs/tools/Eraser.js +304 -0
- package/dist/cjs/tools/Eraser.test.d.ts +1 -0
- package/dist/cjs/tools/FindTool.d.ts +21 -0
- package/dist/cjs/tools/FindTool.js +137 -0
- package/dist/cjs/tools/FindTool.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +103 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
- package/dist/cjs/tools/InputFilter/FunctionMapper.js +21 -0
- package/dist/cjs/tools/InputFilter/InputMapper.d.ts +23 -0
- package/dist/cjs/tools/InputFilter/InputMapper.js +38 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +15 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.js +54 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
- package/dist/cjs/tools/InputFilter/InputStabilizer.js +188 -0
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +87 -0
- package/dist/cjs/tools/PanZoom.d.ts +125 -0
- package/dist/cjs/tools/PanZoom.js +522 -0
- package/dist/cjs/tools/PanZoom.test.d.ts +1 -0
- package/dist/cjs/tools/PasteHandler.d.ts +23 -0
- package/dist/cjs/tools/PasteHandler.js +115 -0
- package/dist/cjs/tools/Pen.d.ts +54 -0
- package/dist/cjs/tools/Pen.js +343 -0
- package/dist/cjs/tools/Pen.test.d.ts +1 -0
- package/dist/cjs/tools/PipetteTool.d.ts +28 -0
- package/dist/cjs/tools/PipetteTool.js +69 -0
- package/dist/cjs/tools/ScrollbarTool.d.ts +18 -0
- package/dist/cjs/tools/ScrollbarTool.js +86 -0
- package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
- package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +32 -0
- package/dist/cjs/tools/SelectionTool/Selection.d.ts +72 -0
- package/dist/cjs/tools/SelectionTool/Selection.js +638 -0
- package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
- package/dist/cjs/tools/SelectionTool/SelectionHandle.js +144 -0
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +88 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.js +509 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +83 -0
- package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +42 -0
- package/dist/cjs/tools/SelectionTool/TransformMode.js +154 -0
- package/dist/cjs/tools/SelectionTool/keybindings.d.ts +15 -0
- package/dist/cjs/tools/SelectionTool/keybindings.js +38 -0
- package/dist/cjs/tools/SelectionTool/types.d.ts +35 -0
- package/dist/cjs/tools/SelectionTool/types.js +14 -0
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +71 -0
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +52 -0
- package/dist/cjs/tools/SoundUITool.d.ts +26 -0
- package/dist/cjs/tools/SoundUITool.js +173 -0
- package/dist/cjs/tools/TextTool.d.ts +36 -0
- package/dist/cjs/tools/TextTool.js +287 -0
- package/dist/cjs/tools/TextTool.test.d.ts +1 -0
- package/dist/cjs/tools/ToolController.d.ts +73 -0
- package/dist/cjs/tools/ToolController.js +310 -0
- package/dist/cjs/tools/ToolController.test.d.ts +1 -0
- package/dist/cjs/tools/ToolEnabledGroup.d.ts +6 -0
- package/dist/cjs/tools/ToolEnabledGroup.js +13 -0
- package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +16 -0
- package/dist/cjs/tools/ToolSwitcherShortcut.js +40 -0
- package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +12 -0
- package/dist/cjs/tools/ToolbarShortcutHandler.js +34 -0
- package/dist/cjs/tools/UndoRedoShortcut.d.ts +8 -0
- package/dist/cjs/tools/UndoRedoShortcut.js +27 -0
- package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +1 -0
- package/dist/cjs/tools/keybindings.d.ts +16 -0
- package/dist/cjs/tools/keybindings.js +58 -0
- package/dist/cjs/tools/lib.d.ts +14 -0
- package/dist/cjs/tools/lib.js +36 -0
- package/dist/cjs/tools/localization.d.ts +45 -0
- package/dist/cjs/tools/localization.js +47 -0
- package/dist/cjs/tools/util/StationaryPenDetector.d.ts +25 -0
- package/dist/cjs/tools/util/StationaryPenDetector.js +107 -0
- package/dist/cjs/tools/util/createMenuOverlay.d.ts +10 -0
- package/dist/cjs/tools/util/createMenuOverlay.js +126 -0
- package/dist/cjs/tools/util/createMenuOverlay.test.d.ts +1 -0
- package/dist/cjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/cjs/util/ClipboardHandler.js +19 -18
- package/dist/cjs/util/ReactiveValue.js +16 -12
- package/dist/cjs/util/adjustEditorThemeForContrast.js +6 -2
- package/dist/cjs/util/guessKeyCodeFromKey.js +1 -1
- package/dist/cjs/util/listenForKeyboardEventsFrom.js +8 -6
- package/dist/cjs/util/waitForAll.js +3 -3
- package/dist/cjs/util/waitForImageLoaded.js +3 -3
- package/dist/cjs/util/waitForTimeout.js +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/mjs/Editor.mjs +37 -23
- package/dist/mjs/EventDispatcher.mjs +1 -1
- package/dist/mjs/Pointer.mjs +3 -3
- package/dist/mjs/SVGLoader/SVGLoader.mjs +14 -7
- package/dist/mjs/UndoRedoHistory.mjs +1 -1
- package/dist/mjs/Viewport.mjs +4 -2
- package/dist/mjs/commands/Command.mjs +7 -5
- package/dist/mjs/commands/Duplicate.mjs +2 -2
- package/dist/mjs/commands/Erase.mjs +3 -4
- package/dist/mjs/commands/invertCommand.mjs +4 -4
- package/dist/mjs/commands/lib.d.ts +1 -1
- package/dist/mjs/commands/lib.mjs +1 -1
- package/dist/mjs/commands/uniteCommands.mjs +4 -4
- package/dist/mjs/components/AbstractComponent.d.ts +1 -1
- package/dist/mjs/components/AbstractComponent.mjs +3 -3
- package/dist/mjs/components/BackgroundComponent.mjs +10 -8
- package/dist/mjs/components/ImageComponent.mjs +12 -5
- package/dist/mjs/components/RestylableComponent.mjs +2 -2
- package/dist/mjs/components/SVGGlobalAttributesObject.mjs +1 -2
- package/dist/mjs/components/Stroke.mjs +40 -27
- package/dist/mjs/components/TextComponent.mjs +15 -12
- package/dist/mjs/components/UnknownSVGObject.mjs +2 -3
- package/dist/mjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/ArrowBuilder.mjs +9 -3
- package/dist/mjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/CircleBuilder.mjs +11 -4
- package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/FreehandLineBuilder.mjs +10 -4
- package/dist/mjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/LineBuilder.mjs +8 -4
- package/dist/mjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/mjs/components/builders/PolylineBuilder.mjs +10 -6
- package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +17 -11
- package/dist/mjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/mjs/components/builders/RectangleBuilder.mjs +17 -3
- package/dist/mjs/components/builders/autocorrect/makeShapeFitAutocorrect.mjs +5 -8
- package/dist/mjs/components/builders/autocorrect/makeSnapToGridAutocorrect.mjs +1 -1
- package/dist/mjs/components/builders/lib.d.ts +7 -0
- package/dist/mjs/components/builders/lib.mjs +7 -0
- package/dist/mjs/components/lib.d.ts +1 -4
- package/dist/mjs/components/lib.mjs +2 -5
- package/dist/mjs/components/util/StrokeSmoother.mjs +5 -6
- package/dist/mjs/dialogs/makeAboutDialog.mjs +1 -1
- package/dist/mjs/dialogs/makeMessageDialog.mjs +2 -2
- package/dist/mjs/image/EditorImage.mjs +13 -15
- package/dist/mjs/image/export/editorImageToSVG.mjs +1 -1
- package/dist/mjs/inputEvents.mjs +3 -3
- package/dist/mjs/lib.d.ts +2 -2
- package/dist/mjs/lib.mjs +2 -2
- package/dist/mjs/localization.mjs +2 -2
- package/dist/mjs/localizations/de.mjs +2 -2
- package/dist/mjs/localizations/es.mjs +7 -3
- package/dist/mjs/rendering/Display.mjs +7 -3
- package/dist/mjs/rendering/RenderablePathSpec.mjs +26 -11
- package/dist/mjs/rendering/RenderingStyle.mjs +22 -15
- package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecord.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecordManager.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCache.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +26 -15
- package/dist/mjs/rendering/caching/testUtils.mjs +2 -2
- package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +3 -1
- package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +4 -3
- package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
- package/dist/mjs/rendering/renderers/SVGRenderer.mjs +38 -20
- package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +13 -15
- package/dist/mjs/shortcuts/KeyBinding.mjs +6 -12
- package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +2 -2
- package/dist/mjs/testing/createEditor.mjs +6 -1
- package/dist/mjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/mjs/testing/findNodeWithText.mjs +12 -3
- package/dist/mjs/testing/getUniquePointerId.mjs +1 -1
- package/dist/mjs/testing/sendHtmlSwipe.mjs +7 -3
- package/dist/mjs/testing/sendPenEvent.mjs +1 -3
- package/dist/mjs/testing/sendTouchEvent.mjs +1 -4
- package/dist/mjs/testing/startPinchGesture.mjs +3 -1
- package/dist/mjs/toolbar/AbstractToolbar.mjs +7 -11
- package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
- package/dist/mjs/toolbar/IconProvider.mjs +5 -3
- package/dist/mjs/toolbar/localization.mjs +3 -3
- package/dist/mjs/toolbar/utils/HelpDisplay.mjs +8 -6
- package/dist/mjs/toolbar/utils/makeDraggable.mjs +4 -7
- package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +3 -2
- package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -8
- package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +5 -3
- package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +8 -6
- package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +9 -10
- package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +23 -14
- package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +7 -7
- package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +9 -5
- package/dist/mjs/toolbar/widgets/keybindings.mjs +2 -2
- package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +6 -6
- package/dist/mjs/tools/BaseTool.d.ts +61 -0
- package/dist/mjs/tools/BaseTool.mjs +179 -0
- package/dist/mjs/tools/Eraser.d.ts +60 -0
- package/dist/mjs/tools/Eraser.mjs +297 -0
- package/dist/mjs/tools/Eraser.test.d.ts +1 -0
- package/dist/mjs/tools/FindTool.d.ts +21 -0
- package/dist/mjs/tools/FindTool.mjs +131 -0
- package/dist/mjs/tools/FindTool.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +74 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
- package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +15 -0
- package/dist/mjs/tools/InputFilter/InputMapper.d.ts +23 -0
- package/dist/mjs/tools/InputFilter/InputMapper.mjs +36 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +15 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.mjs +49 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
- package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +182 -0
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +81 -0
- package/dist/mjs/tools/PanZoom.d.ts +125 -0
- package/dist/mjs/tools/PanZoom.mjs +515 -0
- package/dist/mjs/tools/PanZoom.test.d.ts +1 -0
- package/dist/mjs/tools/PasteHandler.d.ts +23 -0
- package/dist/mjs/tools/PasteHandler.mjs +109 -0
- package/dist/mjs/tools/Pen.d.ts +54 -0
- package/dist/mjs/tools/Pen.mjs +314 -0
- package/dist/mjs/tools/Pen.test.d.ts +1 -0
- package/dist/mjs/tools/PipetteTool.d.ts +28 -0
- package/dist/mjs/tools/PipetteTool.mjs +63 -0
- package/dist/mjs/tools/ScrollbarTool.d.ts +18 -0
- package/dist/mjs/tools/ScrollbarTool.mjs +80 -0
- package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
- package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +26 -0
- package/dist/mjs/tools/SelectionTool/Selection.d.ts +72 -0
- package/dist/mjs/tools/SelectionTool/Selection.mjs +610 -0
- package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
- package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +140 -0
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +85 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +502 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +77 -0
- package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +42 -0
- package/dist/mjs/tools/SelectionTool/TransformMode.mjs +145 -0
- package/dist/mjs/tools/SelectionTool/keybindings.d.ts +15 -0
- package/dist/mjs/tools/SelectionTool/keybindings.mjs +32 -0
- package/dist/mjs/tools/SelectionTool/types.d.ts +35 -0
- package/dist/mjs/tools/SelectionTool/types.mjs +11 -0
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +66 -0
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +47 -0
- package/dist/mjs/tools/SoundUITool.d.ts +26 -0
- package/dist/mjs/tools/SoundUITool.mjs +167 -0
- package/dist/mjs/tools/TextTool.d.ts +36 -0
- package/dist/mjs/tools/TextTool.mjs +281 -0
- package/dist/mjs/tools/TextTool.test.d.ts +1 -0
- package/dist/mjs/tools/ToolController.d.ts +73 -0
- package/dist/mjs/tools/ToolController.mjs +281 -0
- package/dist/mjs/tools/ToolController.test.d.ts +1 -0
- package/dist/mjs/tools/ToolEnabledGroup.d.ts +6 -0
- package/dist/mjs/tools/ToolEnabledGroup.mjs +10 -0
- package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +16 -0
- package/dist/mjs/tools/ToolSwitcherShortcut.mjs +34 -0
- package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +12 -0
- package/dist/mjs/tools/ToolbarShortcutHandler.mjs +28 -0
- package/dist/mjs/tools/UndoRedoShortcut.d.ts +8 -0
- package/dist/mjs/tools/UndoRedoShortcut.mjs +21 -0
- package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +1 -0
- package/dist/mjs/tools/keybindings.d.ts +16 -0
- package/dist/mjs/tools/keybindings.mjs +38 -0
- package/dist/mjs/tools/lib.d.ts +14 -0
- package/dist/mjs/tools/lib.mjs +14 -0
- package/dist/mjs/tools/localization.d.ts +45 -0
- package/dist/mjs/tools/localization.mjs +44 -0
- package/dist/mjs/tools/util/StationaryPenDetector.d.ts +25 -0
- package/dist/mjs/tools/util/StationaryPenDetector.mjs +103 -0
- package/dist/mjs/tools/util/createMenuOverlay.d.ts +10 -0
- package/dist/mjs/tools/util/createMenuOverlay.mjs +121 -0
- package/dist/mjs/tools/util/createMenuOverlay.test.d.ts +1 -0
- package/dist/mjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/mjs/util/ClipboardHandler.mjs +19 -18
- package/dist/mjs/util/ReactiveValue.mjs +16 -12
- package/dist/mjs/util/adjustEditorThemeForContrast.mjs +6 -2
- package/dist/mjs/util/guessKeyCodeFromKey.mjs +1 -1
- package/dist/mjs/util/listenForKeyboardEventsFrom.mjs +8 -6
- package/dist/mjs/util/waitForAll.mjs +3 -3
- package/dist/mjs/util/waitForImageLoaded.mjs +3 -3
- package/dist/mjs/util/waitForTimeout.mjs +1 -1
- package/dist/mjs/version.mjs +1 -1
- package/package.json +88 -88
- package/src/Coloris.css +6 -6
- package/src/Editor.scss +7 -5
- package/src/dialogs/dialogs.scss +3 -4
- package/src/dialogs/makeAboutDialog.scss +2 -2
- package/src/dialogs/makeMessageDialog.scss +11 -7
- package/src/styles.js +1 -1
- package/src/toolbar/AbstractToolbar.scss +20 -12
- package/src/toolbar/DropdownToolbar.scss +5 -4
- package/src/toolbar/EdgeToolbar.scss +65 -31
- package/src/toolbar/toolbar.scss +5 -5
- package/src/toolbar/utils/HelpDisplay.scss +48 -25
- package/src/toolbar/utils/labelVisibleOnHover.scss +39 -16
- package/src/toolbar/widgets/DocumentPropertiesWidget.scss +0 -1
- package/src/toolbar/widgets/HandToolWidget.scss +0 -1
- package/src/toolbar/widgets/InsertImageWidget/InsertImageWidget.scss +2 -3
- package/src/toolbar/widgets/OverflowWidget.css +1 -2
- package/src/toolbar/widgets/PenToolWidget.scss +0 -2
- package/src/toolbar/widgets/SelectionToolWidget.scss +1 -2
- package/src/toolbar/widgets/components/components.scss +6 -6
- package/src/toolbar/widgets/components/makeColorInput.scss +0 -2
- package/src/toolbar/widgets/components/makeFileInput.scss +5 -7
- package/src/toolbar/widgets/components/makeGridSelector.scss +6 -9
- package/src/toolbar/widgets/components/makeSnappedList.scss +3 -4
- package/src/toolbar/widgets/components/makeThicknessSlider.scss +1 -2
- package/src/toolbar/widgets/widgets.scss +7 -7
- package/src/tools/FindTool.css +6 -0
- package/src/tools/ScrollbarTool.scss +61 -0
- package/src/tools/SelectionTool/SelectionTool.scss +173 -0
- package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +14 -0
- package/src/tools/SoundUITool.scss +22 -0
- package/src/tools/tools.scss +5 -0
- package/src/tools/util/createMenuOverlay.scss +73 -0
- package/tsconfig.json +1 -3
- package/typedoc.json +1 -1
@@ -42,15 +42,18 @@ const pathIncluded = (renderablePath, path) => {
|
|
42
42
|
*
|
43
43
|
* @internal
|
44
44
|
*/
|
45
|
-
const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = {
|
45
|
+
const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = {
|
46
|
+
fastCheck: true,
|
47
|
+
expensiveCheck: true,
|
48
|
+
}) => {
|
46
49
|
const path = (0, exports.pathFromRenderable)(renderablePath);
|
47
50
|
const strokeWidth = renderablePath.style.stroke?.width ?? 0;
|
48
51
|
const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
|
49
52
|
const styledPathBBox = path.bbox.grownBy(strokeWidth);
|
50
53
|
// Are we close enough to the path that it fills the entire screen?
|
51
|
-
const isOnlyStrokedAndCouldFillScreen =
|
52
|
-
|
53
|
-
|
54
|
+
const isOnlyStrokedAndCouldFillScreen = onlyStroked &&
|
55
|
+
strokeWidth > visibleRect.maxDimension &&
|
56
|
+
styledPathBBox.containsRect(visibleRect);
|
54
57
|
if (options.fastCheck && isOnlyStrokedAndCouldFillScreen && renderablePath.style.stroke) {
|
55
58
|
const strokeRadius = strokeWidth / 2;
|
56
59
|
// Are we completely within the stroke?
|
@@ -60,7 +63,9 @@ const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options =
|
|
60
63
|
if (visibleRect.isWithinRadiusOf(strokeRadius, point)) {
|
61
64
|
return {
|
62
65
|
rectangle: visibleRect,
|
63
|
-
path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
|
66
|
+
path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
|
67
|
+
fill: renderablePath.style.stroke.color,
|
68
|
+
}),
|
64
69
|
fullScreen: true,
|
65
70
|
};
|
66
71
|
}
|
@@ -68,13 +73,16 @@ const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options =
|
|
68
73
|
}
|
69
74
|
// Try filtering again, but with slightly more expensive checks
|
70
75
|
if (options.expensiveCheck &&
|
71
|
-
isOnlyStrokedAndCouldFillScreen &&
|
72
|
-
|
76
|
+
isOnlyStrokedAndCouldFillScreen &&
|
77
|
+
renderablePath.style.stroke &&
|
78
|
+
strokeWidth > visibleRect.maxDimension * 3) {
|
73
79
|
const signedDist = path.signedDistance(visibleRect.center, strokeWidth / 2);
|
74
80
|
const margin = strokeWidth / 6;
|
75
81
|
if (signedDist < -visibleRect.maxDimension / 2 - margin) {
|
76
82
|
return {
|
77
|
-
path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
|
83
|
+
path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
|
84
|
+
fill: renderablePath.style.stroke.color,
|
85
|
+
}),
|
78
86
|
rectangle: visibleRect,
|
79
87
|
fullScreen: true,
|
80
88
|
};
|
@@ -98,12 +106,16 @@ const visualEquivalent = (renderablePath, visibleRect) => {
|
|
98
106
|
const strokeWidth = renderablePath.style.stroke?.width ?? 0;
|
99
107
|
const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
|
100
108
|
const styledPathBBox = path.bbox.grownBy(strokeWidth);
|
101
|
-
let rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
|
109
|
+
let rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
|
110
|
+
fastCheck: true,
|
111
|
+
expensiveCheck: false,
|
112
|
+
});
|
102
113
|
if (rectangleSimplification) {
|
103
114
|
return rectangleSimplification.path;
|
104
115
|
}
|
105
116
|
// Scale the expanded rect --- the visual equivalent is only close for huge strokes.
|
106
|
-
const expandedRect = visibleRect
|
117
|
+
const expandedRect = visibleRect
|
118
|
+
.grownBy(strokeWidth)
|
107
119
|
.transformedBoundingBox(math_1.Mat33.scaling2D(4, visibleRect.center));
|
108
120
|
// TODO: Handle simplifying very small paths.
|
109
121
|
if (expandedRect.containsRect(styledPathBBox)) {
|
@@ -144,7 +156,10 @@ const visualEquivalent = (renderablePath, visibleRect) => {
|
|
144
156
|
}
|
145
157
|
const newPath = new math_1.Path(path.startPoint, parts);
|
146
158
|
const newStyle = renderablePath.style;
|
147
|
-
rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
|
159
|
+
rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
|
160
|
+
fastCheck: false,
|
161
|
+
expensiveCheck: true,
|
162
|
+
});
|
148
163
|
if (rectangleSimplification) {
|
149
164
|
return rectangleSimplification.path;
|
150
165
|
}
|
@@ -5,17 +5,20 @@ const math_1 = require("@js-draw/math");
|
|
5
5
|
const cloneStyle = (style) => {
|
6
6
|
return {
|
7
7
|
fill: style.fill,
|
8
|
-
stroke: style.stroke
|
9
|
-
|
10
|
-
|
8
|
+
stroke: style.stroke
|
9
|
+
? {
|
10
|
+
...style.stroke,
|
11
|
+
}
|
12
|
+
: undefined,
|
11
13
|
};
|
12
14
|
};
|
13
15
|
exports.cloneStyle = cloneStyle;
|
14
16
|
const stylesEqual = (a, b) => {
|
15
|
-
const result = a === b ||
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
const result = a === b ||
|
18
|
+
(a.fill.eq(b.fill) &&
|
19
|
+
(a.stroke == undefined) === (b.stroke == undefined) &&
|
20
|
+
(a.stroke?.color?.eq(b.stroke?.color) ?? true) &&
|
21
|
+
a.stroke?.width === b.stroke?.width);
|
19
22
|
// Map undefined/null -> false
|
20
23
|
return result ?? false;
|
21
24
|
};
|
@@ -23,10 +26,12 @@ exports.stylesEqual = stylesEqual;
|
|
23
26
|
// Returns an object that can be converted to a JSON string with
|
24
27
|
// JSON.stringify.
|
25
28
|
const styleToJSON = (style) => {
|
26
|
-
const stroke = !style.stroke
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
const stroke = !style.stroke
|
30
|
+
? undefined
|
31
|
+
: {
|
32
|
+
color: style.stroke.color.toHexString(),
|
33
|
+
width: style.stroke.width,
|
34
|
+
};
|
30
35
|
return {
|
31
36
|
fill: style.fill.toHexString(),
|
32
37
|
stroke,
|
@@ -34,10 +39,12 @@ const styleToJSON = (style) => {
|
|
34
39
|
};
|
35
40
|
exports.styleToJSON = styleToJSON;
|
36
41
|
const styleFromJSON = (json) => {
|
37
|
-
const stroke = json.stroke
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
const stroke = json.stroke
|
43
|
+
? {
|
44
|
+
color: math_1.Color4.fromHex(json.stroke.color),
|
45
|
+
width: json.stroke.width,
|
46
|
+
}
|
47
|
+
: undefined;
|
41
48
|
return {
|
42
49
|
fill: math_1.Color4.fromHex(json.fill),
|
43
50
|
stroke,
|
@@ -14,7 +14,7 @@ const textStyleFromJSON = (json) => {
|
|
14
14
|
if (typeof json === 'string') {
|
15
15
|
json = JSON.parse(json);
|
16
16
|
}
|
17
|
-
if (typeof
|
17
|
+
if (typeof json.fontFamily !== 'string') {
|
18
18
|
throw new Error('Serialized textStyle missing string fontFamily attribute!');
|
19
19
|
}
|
20
20
|
const style = {
|
@@ -17,7 +17,7 @@ class CacheRecord {
|
|
17
17
|
startRender() {
|
18
18
|
this.lastUsedCycle = this.cacheState.currentRenderingCycle;
|
19
19
|
if (!this.allocd) {
|
20
|
-
throw new Error(
|
20
|
+
throw new Error("Only alloc'd canvases can be rendered to");
|
21
21
|
}
|
22
22
|
return this.renderer;
|
23
23
|
}
|
@@ -34,7 +34,7 @@ class CacheRecordManager {
|
|
34
34
|
lru.realloc(onDealloc);
|
35
35
|
lru.setRenderingRegion(drawTo);
|
36
36
|
if (this.cacheState.debugMode) {
|
37
|
-
console.log(
|
37
|
+
console.log("[Cache] Now re-alloc'd. Last used cycle: ", lru.getLastUsedCycle());
|
38
38
|
console.assert(lru['cacheState'] === this.cacheState, '[Cache] Unequal cache states! cacheState should be a shared object!');
|
39
39
|
}
|
40
40
|
return lru;
|
@@ -35,7 +35,7 @@ class RenderingCache {
|
|
35
35
|
this.rootNode = this.rootNode.generateParent();
|
36
36
|
}
|
37
37
|
this.rootNode = this.rootNode.smallestChildContaining(visibleRect) ?? this.rootNode;
|
38
|
-
const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, rect => screenRenderer.isTooSmallToRender(rect));
|
38
|
+
const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, (rect) => screenRenderer.isTooSmallToRender(rect));
|
39
39
|
let approxVisibleRenderTime = 0;
|
40
40
|
for (const leaf of visibleLeaves) {
|
41
41
|
approxVisibleRenderTime += leaf.getContent().getProportionalRenderingTime();
|
@@ -32,7 +32,7 @@ class RenderingCacheNode {
|
|
32
32
|
const middleChildIdx = (parent.instantiatedChildren.length - 1) / 2;
|
33
33
|
if (!parent.instantiatedChildren[middleChildIdx].region.eq(this.region, checkTolerance)) {
|
34
34
|
console.error(parent.instantiatedChildren[middleChildIdx].region, '≠', this.region);
|
35
|
-
throw new Error(
|
35
|
+
throw new Error("Logic error: [this] is not contained within its parent's center child");
|
36
36
|
}
|
37
37
|
// Replace the middle child
|
38
38
|
parent.instantiatedChildren[middleChildIdx] = this;
|
@@ -42,7 +42,8 @@ class RenderingCacheNode {
|
|
42
42
|
// Generates children, if missing.
|
43
43
|
generateChildren() {
|
44
44
|
if (this.instantiatedChildren.length === 0) {
|
45
|
-
if (this.region.size.x / cacheDivisionSize === 0 ||
|
45
|
+
if (this.region.size.x / cacheDivisionSize === 0 ||
|
46
|
+
this.region.size.y / cacheDivisionSize === 0) {
|
46
47
|
console.warn('Cache element has zero size! Not generating children.');
|
47
48
|
return;
|
48
49
|
}
|
@@ -137,8 +138,7 @@ class RenderingCacheNode {
|
|
137
138
|
}
|
138
139
|
// Render all [items] within [viewport]
|
139
140
|
renderItems(screenRenderer, items, viewport) {
|
140
|
-
if (!viewport.visibleRect.intersects(this.region)
|
141
|
-
|| items.length === 0) {
|
141
|
+
if (!viewport.visibleRect.intersects(this.region) || items.length === 0) {
|
142
142
|
return;
|
143
143
|
}
|
144
144
|
// Divide [items] until nodes are smaller than this, or are leaves.
|
@@ -167,13 +167,15 @@ class RenderingCacheNode {
|
|
167
167
|
return;
|
168
168
|
}
|
169
169
|
if (this.cacheState.debugMode) {
|
170
|
-
screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), {
|
170
|
+
screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), {
|
171
|
+
fill: math_1.Color4.yellow,
|
172
|
+
});
|
171
173
|
}
|
172
174
|
// Could we render direclty from [this] or do we need to recurse?
|
173
175
|
const couldRender = this.renderingWouldBeHighEnoughResolution(viewport);
|
174
176
|
if (!couldRender) {
|
175
177
|
for (const child of this.getChildren()) {
|
176
|
-
child.renderItems(screenRenderer, items.filter(item => {
|
178
|
+
child.renderItems(screenRenderer, items.filter((item) => {
|
177
179
|
return item.getBBox().intersects(child.region);
|
178
180
|
}), viewport);
|
179
181
|
}
|
@@ -191,7 +193,7 @@ class RenderingCacheNode {
|
|
191
193
|
if (leavesByIds.length === 0) {
|
192
194
|
return;
|
193
195
|
}
|
194
|
-
const leafIds = leavesByIds.map(leaf => leaf.getId());
|
196
|
+
const leafIds = leavesByIds.map((leaf) => leaf.getId());
|
195
197
|
let thisRenderer;
|
196
198
|
if (!this.renderingIsUpToDate(leafIds)) {
|
197
199
|
if (this.allChildrenCanRender(viewport, leavesByIds)) {
|
@@ -212,7 +214,9 @@ class RenderingCacheNode {
|
|
212
214
|
if (!this.cachedRenderer) {
|
213
215
|
this.cachedRenderer = this.cacheState.recordManager.allocCanvas(this.region, () => this.onRegionDealloc());
|
214
216
|
}
|
215
|
-
else if (leavesByIds.length > this.renderedIds.length &&
|
217
|
+
else if (leavesByIds.length > this.renderedIds.length &&
|
218
|
+
this.allRenderedIdsIn(leafIds) &&
|
219
|
+
this.renderedMaxZIndex !== null) {
|
216
220
|
// We often don't need to do a full re-render even if something's changed.
|
217
221
|
// Check whether we can just draw on top of the existing cache.
|
218
222
|
const newLeaves = [];
|
@@ -242,7 +246,9 @@ class RenderingCacheNode {
|
|
242
246
|
}
|
243
247
|
if (this.cacheState.debugMode) {
|
244
248
|
// Clay for adding new elements
|
245
|
-
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
249
|
+
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
250
|
+
fill: math_1.Color4.clay,
|
251
|
+
});
|
246
252
|
}
|
247
253
|
}
|
248
254
|
}
|
@@ -263,7 +269,9 @@ class RenderingCacheNode {
|
|
263
269
|
}
|
264
270
|
if (this.cacheState.debugMode) {
|
265
271
|
// Red for full rerender
|
266
|
-
screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), {
|
272
|
+
screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), {
|
273
|
+
fill: math_1.Color4.red,
|
274
|
+
});
|
267
275
|
}
|
268
276
|
}
|
269
277
|
this.renderedIds = leafIds;
|
@@ -282,7 +290,9 @@ class RenderingCacheNode {
|
|
282
290
|
screenRenderer.endObject();
|
283
291
|
if (this.cacheState.debugMode) {
|
284
292
|
// Green for no cache needed render
|
285
|
-
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
293
|
+
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
294
|
+
fill: math_1.Color4.green,
|
295
|
+
});
|
286
296
|
}
|
287
297
|
}
|
288
298
|
}
|
@@ -294,7 +304,7 @@ class RenderingCacheNode {
|
|
294
304
|
screenRenderer.renderFromOtherOfSameType(transformMat, thisRenderer);
|
295
305
|
}
|
296
306
|
// Can we clean up this' children? (Are they unused?)
|
297
|
-
if (this.instantiatedChildren.every(child => child.isEmpty())) {
|
307
|
+
if (this.instantiatedChildren.every((child) => child.isEmpty())) {
|
298
308
|
this.instantiatedChildren = [];
|
299
309
|
}
|
300
310
|
}
|
@@ -305,7 +315,7 @@ class RenderingCacheNode {
|
|
305
315
|
if (this.cachedRenderer !== null) {
|
306
316
|
return false;
|
307
317
|
}
|
308
|
-
return this.instantiatedChildren.every(child => child.isEmpty());
|
318
|
+
return this.instantiatedChildren.every((child) => child.isEmpty());
|
309
319
|
}
|
310
320
|
onRegionDealloc() {
|
311
321
|
this.cachedRenderer = null;
|
@@ -314,7 +324,8 @@ class RenderingCacheNode {
|
|
314
324
|
}
|
315
325
|
}
|
316
326
|
checkRep() {
|
317
|
-
if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize &&
|
327
|
+
if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize &&
|
328
|
+
this.instantiatedChildren.length !== 0) {
|
318
329
|
throw new Error(`Repcheck: Wrong number of children. Got ${this.instantiatedChildren.length}`);
|
319
330
|
}
|
320
331
|
if (this.renderedIds[1] !== undefined && this.renderedIds[0] >= this.renderedIds[1]) {
|
@@ -327,7 +338,7 @@ class RenderingCacheNode {
|
|
327
338
|
}
|
328
339
|
}
|
329
340
|
if (this.cachedRenderer && !this.cachedRenderer.isAllocd()) {
|
330
|
-
throw new Error(
|
341
|
+
throw new Error("this' cachedRenderer != null, but is dealloc'd");
|
331
342
|
}
|
332
343
|
}
|
333
344
|
}
|
@@ -25,11 +25,11 @@ const createCache = (onRenderAlloc, cacheOptions) => {
|
|
25
25
|
maxScale: 2,
|
26
26
|
minProportionalRenderTimePerCache: 0,
|
27
27
|
minProportionalRenderTimeToUseCache: 0,
|
28
|
-
...cacheOptions
|
28
|
+
...cacheOptions,
|
29
29
|
});
|
30
30
|
return {
|
31
31
|
cache,
|
32
|
-
editor
|
32
|
+
editor,
|
33
33
|
};
|
34
34
|
};
|
35
35
|
exports.createCache = createCache;
|
@@ -22,7 +22,9 @@ class AbstractRenderer {
|
|
22
22
|
* methods on `Viewport`, because the viewport may not accurately reflect
|
23
23
|
* what is rendered.
|
24
24
|
*/
|
25
|
-
getViewport() {
|
25
|
+
getViewport() {
|
26
|
+
return this.viewport;
|
27
|
+
}
|
26
28
|
setDraftMode(_draftMode) { }
|
27
29
|
flushPath() {
|
28
30
|
if (!this.currentPaths) {
|
@@ -136,8 +136,8 @@ class CanvasRenderer extends AbstractRenderer_1.default {
|
|
136
136
|
// Approximate the curve if small enough.
|
137
137
|
const delta1 = p2.minus(p1);
|
138
138
|
const delta2 = p3.minus(p2);
|
139
|
-
if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist
|
140
|
-
|
139
|
+
if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist &&
|
140
|
+
delta2.magnitudeSquared() < this.minSquareCurveApproxDist) {
|
141
141
|
this.ctx.lineTo(p3.x, p3.y);
|
142
142
|
}
|
143
143
|
else {
|
@@ -230,7 +230,8 @@ class CanvasRenderer extends AbstractRenderer_1.default {
|
|
230
230
|
}
|
231
231
|
}
|
232
232
|
// If exiting an object with a too-small-to-draw bounding box,
|
233
|
-
if (this.ignoreObjectsAboveLevel !== null &&
|
233
|
+
if (this.ignoreObjectsAboveLevel !== null &&
|
234
|
+
this.getNestingLevel() <= this.ignoreObjectsAboveLevel) {
|
234
235
|
this.ignoreObjectsAboveLevel = null;
|
235
236
|
this.ignoringObject = false;
|
236
237
|
}
|
@@ -104,7 +104,7 @@ class DummyRenderer extends AbstractRenderer_1.default {
|
|
104
104
|
this.renderedPathCount += other.renderedPathCount;
|
105
105
|
this.lastFillStyle = other.lastFillStyle;
|
106
106
|
this.lastPoint = other.lastPoint;
|
107
|
-
this.pointBuffer.push(...other.pointBuffer.map(point => {
|
107
|
+
this.pointBuffer.push(...other.pointBuffer.map((point) => {
|
108
108
|
return transform.transformVec2(point);
|
109
109
|
}));
|
110
110
|
}
|
@@ -126,7 +126,9 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
126
126
|
const style = pathSpec.style;
|
127
127
|
const path = (0, RenderablePathSpec_1.pathFromRenderable)(pathSpec).transformedBy(this.getCanvasToScreenTransform());
|
128
128
|
// Try to extend the previous path, if possible
|
129
|
-
if (this.lastPathString.length === 0 ||
|
129
|
+
if (this.lastPathString.length === 0 ||
|
130
|
+
!this.lastPathStyle ||
|
131
|
+
!(0, RenderingStyle_1.stylesEqual)(this.lastPathStyle, style)) {
|
130
132
|
this.addPathToSVG();
|
131
133
|
this.lastPathStyle = style;
|
132
134
|
this.lastPathString = [];
|
@@ -136,7 +138,9 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
136
138
|
// Apply [elemTransform] to [elem]. Uses both a `matrix` and `.x`, `.y` properties if `setXY` is true.
|
137
139
|
// Otherwise, just uses a `matrix`.
|
138
140
|
transformFrom(elemTransform, elem, inCanvasSpace = false) {
|
139
|
-
const transform = !inCanvasSpace
|
141
|
+
const transform = !inCanvasSpace
|
142
|
+
? this.getCanvasToScreenTransform().rightMul(elemTransform)
|
143
|
+
: elemTransform;
|
140
144
|
if (!transform.eq(math_1.Mat33.identity)) {
|
141
145
|
const matrixString = transform.toCSSMatrix();
|
142
146
|
elem.style.transform = matrixString;
|
@@ -261,15 +265,15 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
261
265
|
containerIDList = containerIDData[0];
|
262
266
|
}
|
263
267
|
}
|
264
|
-
if (containerIDList.length > 0
|
268
|
+
if (containerIDList.length > 0 &&
|
265
269
|
// containerIDList must share a prefix with the last ID list
|
266
270
|
// otherwise, the z order of elements may have been changed from
|
267
271
|
// the original image.
|
268
272
|
// In the case that the z order has been changed, keep the current
|
269
273
|
// element as a child of the root to preserve z order.
|
270
|
-
|
274
|
+
(0, listPrefixMatch_1.default)(this.lastContainerIDList, containerIDList) &&
|
271
275
|
// The component can add at most one more parent than the previous item.
|
272
|
-
|
276
|
+
this.lastContainerIDList.length >= containerIDList.length - 1) {
|
273
277
|
// Select the last
|
274
278
|
const containerID = containerIDList[containerIDList.length - 1];
|
275
279
|
const containerCandidates = this.elem.querySelectorAll(`g#${containerID}`);
|
@@ -278,7 +282,8 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
278
282
|
// If this is the first time we're entering the group, the
|
279
283
|
// group should be empty.
|
280
284
|
// Otherwise, this may be a case that would break z-ordering.
|
281
|
-
if (container.children.length === 0 ||
|
285
|
+
if (container.children.length === 0 ||
|
286
|
+
this.lastContainerIDList.length >= containerIDList.length) {
|
282
287
|
// Move all objectElems to the found container
|
283
288
|
for (const elem of this.objectElems) {
|
284
289
|
elem.remove();
|
@@ -312,15 +317,29 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
312
317
|
}
|
313
318
|
}
|
314
319
|
// Not implemented -- use drawPath instead.
|
315
|
-
unimplementedMessage() {
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
320
|
+
unimplementedMessage() {
|
321
|
+
throw new Error('Not implemenented!');
|
322
|
+
}
|
323
|
+
beginPath(_startPoint) {
|
324
|
+
this.unimplementedMessage();
|
325
|
+
}
|
326
|
+
endPath(_style) {
|
327
|
+
this.unimplementedMessage();
|
328
|
+
}
|
329
|
+
lineTo(_point) {
|
330
|
+
this.unimplementedMessage();
|
331
|
+
}
|
332
|
+
moveTo(_point) {
|
333
|
+
this.unimplementedMessage();
|
334
|
+
}
|
335
|
+
traceCubicBezierCurve(_controlPoint1, _controlPoint2, _endPoint) {
|
336
|
+
this.unimplementedMessage();
|
337
|
+
}
|
338
|
+
traceQuadraticBezierCurve(_controlPoint, _endPoint) {
|
339
|
+
this.unimplementedMessage();
|
340
|
+
}
|
322
341
|
drawPoints(...points) {
|
323
|
-
points.map(point => {
|
342
|
+
points.map((point) => {
|
324
343
|
const elem = document.createElementNS(svgNameSpace, 'circle');
|
325
344
|
elem.setAttribute('cx', `${point.x}`);
|
326
345
|
elem.setAttribute('cy', `${point.y}`);
|
@@ -334,7 +353,8 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
334
353
|
return;
|
335
354
|
}
|
336
355
|
// Don't add multiple copies of the default stylesheet.
|
337
|
-
if (elem.tagName.toLowerCase() === 'style' &&
|
356
|
+
if (elem.tagName.toLowerCase() === 'style' &&
|
357
|
+
elem.getAttribute('id') === exports.renderedStylesheetId) {
|
338
358
|
return;
|
339
359
|
}
|
340
360
|
const elemToDraw = elem.cloneNode(true);
|
@@ -369,9 +389,7 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
369
389
|
let viewBoxComponents;
|
370
390
|
if (useViewBoxForPositioning) {
|
371
391
|
const exportRect = viewport.visibleRect;
|
372
|
-
viewBoxComponents = [
|
373
|
-
exportRect.x, exportRect.y, exportRect.w, exportRect.h,
|
374
|
-
];
|
392
|
+
viewBoxComponents = [exportRect.x, exportRect.y, exportRect.w, exportRect.h];
|
375
393
|
// Replace the viewport with a copy that has a modified transform.
|
376
394
|
// (Avoids modifying the original viewport).
|
377
395
|
viewport = viewport.getTemporaryClone();
|
@@ -383,7 +401,7 @@ class SVGRenderer extends AbstractRenderer_1.default {
|
|
383
401
|
viewBoxComponents = [0, 0, screenRectSize.x, screenRectSize.y];
|
384
402
|
}
|
385
403
|
// rect.x -> size of rect in x direction, rect.y -> size of rect in y direction.
|
386
|
-
result.setAttribute('viewBox', viewBoxComponents.map(part => (0, math_1.toRoundedString)(part)).join(' '));
|
404
|
+
result.setAttribute('viewBox', viewBoxComponents.map((part) => (0, math_1.toRoundedString)(part)).join(' '));
|
387
405
|
result.setAttribute('width', (0, math_1.toRoundedString)(screenRectSize.x));
|
388
406
|
result.setAttribute('height', (0, math_1.toRoundedString)(screenRectSize.y));
|
389
407
|
// Ensure the image can be identified as an SVG if downloaded.
|
@@ -29,36 +29,34 @@ class TextOnlyRenderer extends AbstractRenderer_1.default {
|
|
29
29
|
return [
|
30
30
|
this.localizationTable.pathNodeCount(this.pathCount),
|
31
31
|
...(this.textNodeCount > 0 ? [this.localizationTable.textNodeCount(this.textNodeCount)] : []),
|
32
|
-
...(this.imageNodeCount > 0
|
33
|
-
|
32
|
+
...(this.imageNodeCount > 0
|
33
|
+
? [this.localizationTable.imageNodeCount(this.imageNodeCount)]
|
34
|
+
: []),
|
35
|
+
...this.descriptionBuilder,
|
34
36
|
].join('\n');
|
35
37
|
}
|
36
|
-
beginPath(_startPoint) {
|
37
|
-
}
|
38
|
+
beginPath(_startPoint) { }
|
38
39
|
endPath(_style) {
|
39
40
|
this.pathCount++;
|
40
41
|
}
|
41
|
-
lineTo(_point) {
|
42
|
-
}
|
43
|
-
|
44
|
-
}
|
45
|
-
traceCubicBezierCurve(_p1, _p2, _p3) {
|
46
|
-
}
|
47
|
-
traceQuadraticBezierCurve(_controlPoint, _endPoint) {
|
48
|
-
}
|
42
|
+
lineTo(_point) { }
|
43
|
+
moveTo(_point) { }
|
44
|
+
traceCubicBezierCurve(_p1, _p2, _p3) { }
|
45
|
+
traceQuadraticBezierCurve(_controlPoint, _endPoint) { }
|
49
46
|
drawText(text, _transform, _style) {
|
50
47
|
this.descriptionBuilder.push(this.localizationTable.textNode(text));
|
51
48
|
this.textNodeCount++;
|
52
49
|
}
|
53
50
|
drawImage(image) {
|
54
|
-
const label = image.label
|
51
|
+
const label = image.label
|
52
|
+
? this.localizationTable.imageNode(image.label)
|
53
|
+
: this.localizationTable.unlabeledImageNode;
|
55
54
|
this.descriptionBuilder.push(label);
|
56
55
|
this.imageNodeCount++;
|
57
56
|
}
|
58
57
|
isTooSmallToRender(rect) {
|
59
58
|
return rect.maxDimension < 15 / this.getSizeOfCanvasPixelOnScreen();
|
60
59
|
}
|
61
|
-
drawPoints(..._points) {
|
62
|
-
}
|
60
|
+
drawPoints(..._points) { }
|
63
61
|
}
|
64
62
|
exports.default = TextOnlyRenderer;
|
@@ -1,14 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const isUppercaseLetter = (text) => {
|
4
|
-
return text.toUpperCase() === text
|
5
|
-
&& text.toLowerCase() !== text
|
6
|
-
&& text.length === 1;
|
4
|
+
return text.toUpperCase() === text && text.toLowerCase() !== text && text.length === 1;
|
7
5
|
};
|
8
6
|
const isLowercaseLetter = (text) => {
|
9
|
-
return text.toLowerCase() === text
|
10
|
-
&& text.toUpperCase() !== text
|
11
|
-
&& text.length === 1;
|
7
|
+
return text.toLowerCase() === text && text.toUpperCase() !== text && text.length === 1;
|
12
8
|
};
|
13
9
|
/** Represents a key combination that can trigger a keyboard shortcut. */
|
14
10
|
class KeyBinding {
|
@@ -51,12 +47,10 @@ class KeyBinding {
|
|
51
47
|
const shortcutControlOrMeta = this.controlOrMeta;
|
52
48
|
// Match ctrl/meta if the shortcut doesn't have controlOrMeta specified
|
53
49
|
// (controlOrMeta should match either).
|
54
|
-
const ctrlAndMetaMatches = ctrlKey === this.ctrlKey
|
55
|
-
|
56
|
-
&&
|
57
|
-
|
58
|
-
&& altKey === this.altKey
|
59
|
-
&& (shiftKey === this.shiftKey || this.shiftKey === undefined);
|
50
|
+
const ctrlAndMetaMatches = ctrlKey === this.ctrlKey && metaKey === this.metaKey && !shortcutControlOrMeta;
|
51
|
+
const matches = (ctrlAndMetaMatches || (shortcutControlOrMeta && keyEventHasCtrlOrMeta)) &&
|
52
|
+
altKey === this.altKey &&
|
53
|
+
(shiftKey === this.shiftKey || this.shiftKey === undefined);
|
60
54
|
return matches;
|
61
55
|
}
|
62
56
|
/**
|
@@ -82,8 +82,8 @@ class KeyboardShortcutManager {
|
|
82
82
|
return false;
|
83
83
|
}
|
84
84
|
// Convert the strings to shortcut maps.
|
85
|
-
const shortcutsAsShortcuts = shortcuts.map(shortcut => {
|
86
|
-
if (typeof
|
85
|
+
const shortcutsAsShortcuts = shortcuts.map((shortcut) => {
|
86
|
+
if (typeof shortcut === 'string') {
|
87
87
|
return KeyBinding_1.default.fromString(shortcut);
|
88
88
|
}
|
89
89
|
return shortcut;
|
@@ -5,10 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const Display_1 = require("../rendering/Display");
|
7
7
|
const Editor_1 = __importDefault(require("../Editor"));
|
8
|
+
const getLocalizationTable_1 = __importDefault(require("../localizations/getLocalizationTable"));
|
8
9
|
/** Creates an editor. Should only be used in test files. */
|
9
10
|
exports.default = (settings) => {
|
10
11
|
if (jest === undefined) {
|
11
12
|
throw new Error('Files in the testing/ folder should only be used in tests!');
|
12
13
|
}
|
13
|
-
return new Editor_1.default(document.body, {
|
14
|
+
return new Editor_1.default(document.body, {
|
15
|
+
renderingMode: Display_1.RenderingMode.DummyRenderer,
|
16
|
+
localization: (0, getLocalizationTable_1.default)(['en']),
|
17
|
+
...settings,
|
18
|
+
});
|
14
19
|
};
|
@@ -1,3 +1,6 @@
|
|
1
|
+
interface Options {
|
2
|
+
tag?: string;
|
3
|
+
}
|
1
4
|
/** Returns the first node or element with `textContent` matching `expectedText`. */
|
2
|
-
declare const findNodeWithText: (expectedText: string, parent: Node) => Node | null;
|
5
|
+
declare const findNodeWithText: (expectedText: string, parent: Node, options?: Options) => Node | null;
|
3
6
|
export default findNodeWithText;
|
@@ -1,12 +1,21 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
/** Returns the first node or element with `textContent` matching `expectedText`. */
|
4
|
-
const findNodeWithText = (expectedText, parent) => {
|
4
|
+
const findNodeWithText = (expectedText, parent, options = {}) => {
|
5
|
+
const { tag } = options;
|
5
6
|
if (parent.textContent === expectedText) {
|
6
|
-
|
7
|
+
const matchesTag = (() => {
|
8
|
+
// No tag check necessary?
|
9
|
+
if (!tag)
|
10
|
+
return true;
|
11
|
+
return parent instanceof Element && tag.toUpperCase() === parent.tagName;
|
12
|
+
})();
|
13
|
+
if (matchesTag) {
|
14
|
+
return parent;
|
15
|
+
}
|
7
16
|
}
|
8
17
|
for (const child of parent.childNodes) {
|
9
|
-
const results = findNodeWithText(expectedText, child);
|
18
|
+
const results = findNodeWithText(expectedText, child, options);
|
10
19
|
if (results) {
|
11
20
|
return results;
|
12
21
|
}
|