@tldraw/editor 4.3.0-canary.c7096a59bf3b → 4.3.0-canary.cb6779b4f066
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist-cjs/index.d.ts +446 -120
- package/dist-cjs/index.js +8 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/components/ErrorBoundary.js.map +1 -1
- package/dist-cjs/lib/components/GeometryDebuggingView.js +1 -17
- package/dist-cjs/lib/components/GeometryDebuggingView.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +4 -5
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/constants.js +1 -3
- package/dist-cjs/lib/constants.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +342 -280
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -23
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js +12 -3
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -1
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +5 -6
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +591 -0
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +1 -1
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/RBushIndex.js +144 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/RBushIndex.js.map +7 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +181 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -22
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +31 -23
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js +1 -1
- package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js.map +2 -2
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +3 -3
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
- package/dist-cjs/lib/exports/parseCss.js +1 -1
- package/dist-cjs/lib/exports/parseCss.js.map +2 -2
- package/dist-cjs/lib/globals/environment.js +45 -9
- package/dist-cjs/lib/globals/environment.js.map +2 -2
- package/dist-cjs/lib/hooks/useCoarsePointer.js +14 -29
- package/dist-cjs/lib/hooks/useCoarsePointer.js.map +2 -2
- package/dist-cjs/lib/hooks/useEvent.js +1 -1
- package/dist-cjs/lib/hooks/useEvent.js.map +2 -2
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
- package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
- package/dist-cjs/lib/hooks/useStateAttribute.js +4 -1
- package/dist-cjs/lib/hooks/useStateAttribute.js.map +2 -2
- package/dist-cjs/lib/hooks/useTransform.js.map +1 -1
- package/dist-cjs/lib/hooks/useZoomCss.js +4 -8
- package/dist-cjs/lib/hooks/useZoomCss.js.map +2 -2
- package/dist-cjs/lib/options.js +6 -1
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +3 -0
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +1 -0
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/utils/rotation.js +1 -1
- package/dist-cjs/lib/utils/rotation.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +446 -120
- package/dist-esm/index.mjs +9 -2
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/components/ErrorBoundary.mjs.map +1 -1
- package/dist-esm/lib/components/GeometryDebuggingView.mjs +1 -17
- package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +4 -5
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/constants.mjs +1 -3
- package/dist-esm/lib/constants.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +343 -283
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -23
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +13 -4
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -1
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +5 -6
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +573 -0
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +1 -1
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SpatialIndexManager/RBushIndex.mjs +114 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/RBushIndex.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +161 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -22
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +31 -23
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs +1 -1
- package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +3 -3
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
- package/dist-esm/lib/exports/parseCss.mjs +1 -1
- package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
- package/dist-esm/lib/globals/environment.mjs +45 -9
- package/dist-esm/lib/globals/environment.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCoarsePointer.mjs +15 -30
- package/dist-esm/lib/hooks/useCoarsePointer.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEvent.mjs +1 -1
- package/dist-esm/lib/hooks/useEvent.mjs.map +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useGestureEvents.mjs +1 -1
- package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
- package/dist-esm/lib/hooks/useStateAttribute.mjs +4 -1
- package/dist-esm/lib/hooks/useStateAttribute.mjs.map +2 -2
- package/dist-esm/lib/hooks/useTransform.mjs.map +1 -1
- package/dist-esm/lib/hooks/useZoomCss.mjs +4 -8
- package/dist-esm/lib/hooks/useZoomCss.mjs.map +2 -2
- package/dist-esm/lib/options.mjs +6 -1
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +3 -0
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +1 -0
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/utils/rotation.mjs +1 -1
- package/dist-esm/lib/utils/rotation.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +14 -12
- package/package.json +21 -17
- package/src/index.ts +5 -1
- package/src/lib/components/ErrorBoundary.tsx +1 -1
- package/src/lib/components/GeometryDebuggingView.tsx +1 -19
- package/src/lib/components/default-components/DefaultCanvas.tsx +4 -8
- package/src/lib/config/TLUserPreferences.test.ts +40 -0
- package/src/lib/constants.ts +0 -2
- package/src/lib/editor/Editor.test.ts +140 -0
- package/src/lib/editor/Editor.ts +448 -326
- package/src/lib/editor/derivations/notVisibleShapes.ts +21 -33
- package/src/lib/editor/derivations/parentsToChildren.ts +18 -7
- package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +17 -31
- package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +129 -79
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +10 -6
- package/src/lib/editor/managers/InputsManager/InputsManager.ts +566 -0
- package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +0 -4
- package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +12 -0
- package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
- package/src/lib/editor/managers/SpatialIndexManager/RBushIndex.ts +144 -0
- package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +215 -0
- package/src/lib/editor/managers/TickManager/TickManager.test.ts +40 -107
- package/src/lib/editor/managers/TickManager/TickManager.ts +2 -32
- package/src/lib/editor/shapes/ShapeUtil.ts +67 -24
- package/src/lib/editor/shapes/group/DashedOutlineBox.tsx +1 -1
- package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +3 -3
- package/src/lib/exports/parseCss.test.ts +1 -0
- package/src/lib/exports/parseCss.ts +1 -1
- package/src/lib/globals/environment.ts +65 -10
- package/src/lib/hooks/useCoarsePointer.ts +16 -59
- package/src/lib/hooks/useEvent.tsx +1 -1
- package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -1
- package/src/lib/hooks/useGestureEvents.ts +2 -2
- package/src/lib/hooks/usePassThroughMouseOverEvents.ts +1 -1
- package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -1
- package/src/lib/hooks/useScreenBounds.ts +1 -1
- package/src/lib/hooks/useStateAttribute.ts +4 -1
- package/src/lib/hooks/useTransform.ts +1 -1
- package/src/lib/hooks/useZoomCss.ts +3 -8
- package/src/lib/options.ts +32 -0
- package/src/lib/primitives/Box.ts +9 -0
- package/src/lib/primitives/geometry/Geometry2d.ts +1 -0
- package/src/lib/utils/rotation.ts +1 -1
- package/src/version.ts +3 -3
|
@@ -104,7 +104,6 @@ var import_assets = require("../utils/assets");
|
|
|
104
104
|
var import_debug_flags = require("../utils/debug-flags");
|
|
105
105
|
var import_deepLinks = require("../utils/deepLinks");
|
|
106
106
|
var import_getIncrementedName = require("../utils/getIncrementedName");
|
|
107
|
-
var import_keyboard = require("../utils/keyboard");
|
|
108
107
|
var import_reorderShapes = require("../utils/reorderShapes");
|
|
109
108
|
var import_rotation = require("../utils/rotation");
|
|
110
109
|
var import_bindingsIndex = require("./derivations/bindingsIndex");
|
|
@@ -116,14 +115,16 @@ var import_EdgeScrollManager = require("./managers/EdgeScrollManager/EdgeScrollM
|
|
|
116
115
|
var import_FocusManager = require("./managers/FocusManager/FocusManager");
|
|
117
116
|
var import_FontManager = require("./managers/FontManager/FontManager");
|
|
118
117
|
var import_HistoryManager = require("./managers/HistoryManager/HistoryManager");
|
|
118
|
+
var import_InputsManager = require("./managers/InputsManager/InputsManager");
|
|
119
119
|
var import_ScribbleManager = require("./managers/ScribbleManager/ScribbleManager");
|
|
120
120
|
var import_SnapManager = require("./managers/SnapManager/SnapManager");
|
|
121
|
+
var import_SpatialIndexManager = require("./managers/SpatialIndexManager/SpatialIndexManager");
|
|
121
122
|
var import_TextManager = require("./managers/TextManager/TextManager");
|
|
122
123
|
var import_TickManager = require("./managers/TickManager/TickManager");
|
|
123
124
|
var import_UserPreferencesManager = require("./managers/UserPreferencesManager/UserPreferencesManager");
|
|
124
125
|
var import_RootState = require("./tools/RootState");
|
|
125
|
-
var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec,
|
|
126
|
-
class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed],
|
|
126
|
+
var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getEfficientZoomLevel_dec, __getAboveDebouncedZoomThreshold_dec, _getDebouncedZoomLevel_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _canRedo_dec, _canUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
|
|
127
|
+
class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _canUndo_dec = [import_state.computed], _canRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getDebouncedZoomLevel_dec = [import_state.computed], __getAboveDebouncedZoomThreshold_dec = [import_state.computed], _getEfficientZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], _getNotVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
|
|
127
128
|
constructor({
|
|
128
129
|
store,
|
|
129
130
|
user,
|
|
@@ -159,7 +160,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
159
160
|
*/
|
|
160
161
|
__publicField(this, "root");
|
|
161
162
|
/**
|
|
162
|
-
* A set of functions to call when the
|
|
163
|
+
* A set of functions to call when the editor is disposed.
|
|
163
164
|
*
|
|
164
165
|
* @public
|
|
165
166
|
*/
|
|
@@ -170,14 +171,24 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
170
171
|
* @public
|
|
171
172
|
*/
|
|
172
173
|
__publicField(this, "isDisposed", false);
|
|
173
|
-
/**
|
|
174
|
+
/**
|
|
175
|
+
* A manager for the editor's tick events.
|
|
176
|
+
*
|
|
177
|
+
* @internal */
|
|
174
178
|
__publicField(this, "_tickManager");
|
|
175
179
|
/**
|
|
176
|
-
* A manager for the
|
|
180
|
+
* A manager for the editor's input state.
|
|
181
|
+
*
|
|
182
|
+
* @public
|
|
183
|
+
*/
|
|
184
|
+
__publicField(this, "inputs");
|
|
185
|
+
/**
|
|
186
|
+
* A manager for the editor's snapping feature.
|
|
177
187
|
*
|
|
178
188
|
* @public
|
|
179
189
|
*/
|
|
180
190
|
__publicField(this, "snaps");
|
|
191
|
+
__publicField(this, "_spatialIndex");
|
|
181
192
|
/**
|
|
182
193
|
* A manager for the any asynchronous events and making sure they're
|
|
183
194
|
* cleaned up upon disposal.
|
|
@@ -255,7 +266,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
255
266
|
__publicField(this, "bindingUtils");
|
|
256
267
|
/* --------------------- History -------------------- */
|
|
257
268
|
/**
|
|
258
|
-
* A manager for the
|
|
269
|
+
* A manager for the editor's history.
|
|
259
270
|
*
|
|
260
271
|
* @readonly
|
|
261
272
|
*/
|
|
@@ -270,6 +281,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
270
281
|
// Rich text editor
|
|
271
282
|
__publicField(this, "_currentRichTextEditor", (0, import_state.atom)("rich text editor", null));
|
|
272
283
|
__publicField(this, "_textOptions");
|
|
284
|
+
__publicField(this, "_debouncedZoomLevel", (0, import_state.atom)("debounced zoom level", 1));
|
|
273
285
|
__publicField(this, "_cameraOptions", (0, import_state.atom)("camera options", import_constants.DEFAULT_CAMERA_OPTIONS));
|
|
274
286
|
/** @internal */
|
|
275
287
|
__publicField(this, "_viewportAnimation", null);
|
|
@@ -293,6 +305,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
293
305
|
/* --------------------- Shapes --------------------- */
|
|
294
306
|
__publicField(this, "_shapeGeometryCaches", {});
|
|
295
307
|
__publicField(this, "_notVisibleShapes", (0, import_notVisibleShapes.notVisibleShapes)(this));
|
|
308
|
+
__publicField(this, "_culledShapesCache", null);
|
|
296
309
|
// Parents and children
|
|
297
310
|
/**
|
|
298
311
|
* A cache of parents to children.
|
|
@@ -320,54 +333,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
320
333
|
tldraw: null,
|
|
321
334
|
excalidraw: null
|
|
322
335
|
});
|
|
323
|
-
/* --------------------- Events --------------------- */
|
|
324
|
-
/**
|
|
325
|
-
* The app's current input state.
|
|
326
|
-
*
|
|
327
|
-
* @public
|
|
328
|
-
*/
|
|
329
|
-
__publicField(this, "inputs", {
|
|
330
|
-
/** The most recent pointer down's position in the current page space. */
|
|
331
|
-
originPagePoint: new import_Vec.Vec(),
|
|
332
|
-
/** The most recent pointer down's position in screen space. */
|
|
333
|
-
originScreenPoint: new import_Vec.Vec(),
|
|
334
|
-
/** The previous pointer position in the current page space. */
|
|
335
|
-
previousPagePoint: new import_Vec.Vec(),
|
|
336
|
-
/** The previous pointer position in screen space. */
|
|
337
|
-
previousScreenPoint: new import_Vec.Vec(),
|
|
338
|
-
/** The most recent pointer position in the current page space. */
|
|
339
|
-
currentPagePoint: new import_Vec.Vec(),
|
|
340
|
-
/** The most recent pointer position in screen space. */
|
|
341
|
-
currentScreenPoint: new import_Vec.Vec(),
|
|
342
|
-
/** A set containing the currently pressed keys. */
|
|
343
|
-
keys: /* @__PURE__ */ new Set(),
|
|
344
|
-
/** A set containing the currently pressed buttons. */
|
|
345
|
-
buttons: /* @__PURE__ */ new Set(),
|
|
346
|
-
/** Whether the input is from a pe. */
|
|
347
|
-
isPen: false,
|
|
348
|
-
/** Whether the shift key is currently pressed. */
|
|
349
|
-
shiftKey: false,
|
|
350
|
-
/** Whether the meta key is currently pressed. */
|
|
351
|
-
metaKey: false,
|
|
352
|
-
/** Whether the control or command key is currently pressed. */
|
|
353
|
-
ctrlKey: false,
|
|
354
|
-
/** Whether the alt or option key is currently pressed. */
|
|
355
|
-
altKey: false,
|
|
356
|
-
/** Whether the user is dragging. */
|
|
357
|
-
isDragging: false,
|
|
358
|
-
/** Whether the user is pointing. */
|
|
359
|
-
isPointing: false,
|
|
360
|
-
/** Whether the user is pinching. */
|
|
361
|
-
isPinching: false,
|
|
362
|
-
/** Whether the user is editing. */
|
|
363
|
-
isEditing: false,
|
|
364
|
-
/** Whether the user is panning. */
|
|
365
|
-
isPanning: false,
|
|
366
|
-
/** Whether the user is spacebar panning. */
|
|
367
|
-
isSpacebarPanning: false,
|
|
368
|
-
/** Velocity of mouse pointer, in pixels per millisecond */
|
|
369
|
-
pointerVelocity: new import_Vec.Vec()
|
|
370
|
-
});
|
|
371
336
|
/**
|
|
372
337
|
* A manager for recording multiple click events.
|
|
373
338
|
*
|
|
@@ -391,8 +356,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
391
356
|
/** @internal */
|
|
392
357
|
__publicField(this, "_restoreToolId", "select");
|
|
393
358
|
/** @internal */
|
|
394
|
-
__publicField(this, "_pinchStart", 1);
|
|
395
|
-
/** @internal */
|
|
396
359
|
__publicField(this, "_didPinch", false);
|
|
397
360
|
/** @internal */
|
|
398
361
|
__publicField(this, "_selectedShapeIdsAtPointerDown", []);
|
|
@@ -418,6 +381,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
418
381
|
}
|
|
419
382
|
});
|
|
420
383
|
this.snaps = new import_SnapManager.SnapManager(this);
|
|
384
|
+
this._spatialIndex = new import_SpatialIndexManager.SpatialIndexManager(this);
|
|
385
|
+
this.disposables.add(() => this._spatialIndex.dispose());
|
|
421
386
|
this.disposables.add(this.timers.dispose);
|
|
422
387
|
this._cameraOptions.set({ ...import_constants.DEFAULT_CAMERA_OPTIONS, ...cameraOptions });
|
|
423
388
|
this._textOptions = (0, import_state.atom)("text options", textOptions ?? null);
|
|
@@ -428,6 +393,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
428
393
|
this.disposables.add(() => this.textMeasure.dispose());
|
|
429
394
|
this.fonts = new import_FontManager.FontManager(this, fontAssetUrls);
|
|
430
395
|
this._tickManager = new import_TickManager.TickManager(this);
|
|
396
|
+
this.inputs = new import_InputsManager.InputsManager(this);
|
|
431
397
|
class NewRoot extends import_RootState.RootState {
|
|
432
398
|
static initial = initialState ?? "";
|
|
433
399
|
}
|
|
@@ -894,9 +860,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
894
860
|
this.history.undo();
|
|
895
861
|
return this;
|
|
896
862
|
}
|
|
897
|
-
|
|
863
|
+
canUndo() {
|
|
898
864
|
return this.history.getNumUndos() > 0;
|
|
899
865
|
}
|
|
866
|
+
getCanUndo() {
|
|
867
|
+
return this.canUndo();
|
|
868
|
+
}
|
|
900
869
|
/**
|
|
901
870
|
* Redo to the next mark.
|
|
902
871
|
*
|
|
@@ -913,13 +882,16 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
913
882
|
this.history.redo();
|
|
914
883
|
return this;
|
|
915
884
|
}
|
|
885
|
+
canRedo() {
|
|
886
|
+
return this.history.getNumRedos() > 0;
|
|
887
|
+
}
|
|
888
|
+
getCanRedo() {
|
|
889
|
+
return this.canRedo();
|
|
890
|
+
}
|
|
916
891
|
clearHistory() {
|
|
917
892
|
this.history.clear();
|
|
918
893
|
return this;
|
|
919
894
|
}
|
|
920
|
-
getCanRedo() {
|
|
921
|
-
return this.history.getNumRedos() > 0;
|
|
922
|
-
}
|
|
923
895
|
/**
|
|
924
896
|
* Create a new "mark", or stopping point, in the undo redo history. Creating a mark will clear
|
|
925
897
|
* any redos. You typically want to do this just before a user interaction begins or is handled.
|
|
@@ -1074,7 +1046,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1074
1046
|
}),
|
|
1075
1047
|
selectionCount: this.getSelectedShapes().length,
|
|
1076
1048
|
editingShape: editingShapeId ? this.getShape(editingShapeId) : void 0,
|
|
1077
|
-
inputs: this.inputs,
|
|
1049
|
+
inputs: this.inputs.toJson(),
|
|
1078
1050
|
pageState: this.getCurrentPageState(),
|
|
1079
1051
|
instanceState: this.getInstanceState(),
|
|
1080
1052
|
collaboratorCount: this.getCollaboratorsOnCurrentPage().length
|
|
@@ -1095,7 +1067,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1095
1067
|
* we're in a transaction that's about to be rolled back due to the same error we're currently
|
|
1096
1068
|
* reporting.
|
|
1097
1069
|
*
|
|
1098
|
-
* Instead, to listen to changes to this value, you need to listen to
|
|
1070
|
+
* Instead, to listen to changes to this value, you need to listen to editor's `crash` event.
|
|
1099
1071
|
*
|
|
1100
1072
|
* @internal
|
|
1101
1073
|
*/
|
|
@@ -1746,6 +1718,28 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1746
1718
|
const editingShapeId = this.getEditingShapeId();
|
|
1747
1719
|
return editingShapeId ? this.getShape(editingShapeId) : void 0;
|
|
1748
1720
|
}
|
|
1721
|
+
/**
|
|
1722
|
+
* Whether the shape can be edited.
|
|
1723
|
+
*
|
|
1724
|
+
* @param shape - The shape (or shape id) to check if it can be edited.
|
|
1725
|
+
* @param info - The info about the edit start.
|
|
1726
|
+
*
|
|
1727
|
+
* @public
|
|
1728
|
+
* @returns true if the shape can be edited, false otherwise.
|
|
1729
|
+
*/
|
|
1730
|
+
canEditShape(shape, info) {
|
|
1731
|
+
const id = typeof shape === "string" ? shape : shape?.id ?? null;
|
|
1732
|
+
if (!id) return false;
|
|
1733
|
+
if (id === this.getEditingShapeId()) return false;
|
|
1734
|
+
const _shape = this.getShape(id);
|
|
1735
|
+
if (!_shape) return false;
|
|
1736
|
+
const util = this.getShapeUtil(_shape);
|
|
1737
|
+
const _info = info ?? { type: "unknown" };
|
|
1738
|
+
if (!util.canEdit(_shape, _info)) return false;
|
|
1739
|
+
if (this.getIsReadonly() && !util.canEditInReadonly(_shape)) return false;
|
|
1740
|
+
if (this.isShapeOrAncestorLocked(_shape) && !util.canEditWhileLocked(_shape)) return false;
|
|
1741
|
+
return true;
|
|
1742
|
+
}
|
|
1749
1743
|
/**
|
|
1750
1744
|
* Set the current editing shape.
|
|
1751
1745
|
*
|
|
@@ -1761,42 +1755,42 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1761
1755
|
*/
|
|
1762
1756
|
setEditingShape(shape) {
|
|
1763
1757
|
const id = typeof shape === "string" ? shape : shape?.id ?? null;
|
|
1764
|
-
|
|
1765
|
-
const prevEditingShapeId = this.getEditingShapeId();
|
|
1766
|
-
if (id !== prevEditingShapeId) {
|
|
1767
|
-
if (id) {
|
|
1768
|
-
const shape2 = this.getShape(id);
|
|
1769
|
-
if (shape2 && this.getShapeUtil(shape2).canEdit(shape2)) {
|
|
1770
|
-
this.run(
|
|
1771
|
-
() => {
|
|
1772
|
-
this._updateCurrentPageState({ editingShapeId: id });
|
|
1773
|
-
if (prevEditingShapeId) {
|
|
1774
|
-
const prevEditingShape = this.getShape(prevEditingShapeId);
|
|
1775
|
-
if (prevEditingShape) {
|
|
1776
|
-
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
this.getShapeUtil(shape2).onEditStart?.(shape2);
|
|
1780
|
-
},
|
|
1781
|
-
{ history: "ignore" }
|
|
1782
|
-
);
|
|
1783
|
-
return this;
|
|
1784
|
-
}
|
|
1785
|
-
}
|
|
1758
|
+
if (!id) {
|
|
1786
1759
|
this.run(
|
|
1787
1760
|
() => {
|
|
1788
|
-
this.
|
|
1789
|
-
this._currentRichTextEditor.set(null);
|
|
1761
|
+
const prevEditingShapeId = this.getEditingShapeId();
|
|
1790
1762
|
if (prevEditingShapeId) {
|
|
1791
1763
|
const prevEditingShape = this.getShape(prevEditingShapeId);
|
|
1792
1764
|
if (prevEditingShape) {
|
|
1793
1765
|
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
|
|
1794
1766
|
}
|
|
1795
1767
|
}
|
|
1768
|
+
this._updateCurrentPageState({ editingShapeId: null });
|
|
1769
|
+
this._currentRichTextEditor.set(null);
|
|
1796
1770
|
},
|
|
1797
1771
|
{ history: "ignore" }
|
|
1798
1772
|
);
|
|
1773
|
+
return this;
|
|
1799
1774
|
}
|
|
1775
|
+
if (!this.canEditShape(id)) return this;
|
|
1776
|
+
this.run(
|
|
1777
|
+
() => {
|
|
1778
|
+
const prevEditingShapeId = this.getEditingShapeId();
|
|
1779
|
+
if (prevEditingShapeId) {
|
|
1780
|
+
const prevEditingShape = this.getShape(prevEditingShapeId);
|
|
1781
|
+
if (prevEditingShape) {
|
|
1782
|
+
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
this._updateCurrentPageState({ editingShapeId: null });
|
|
1786
|
+
this._currentRichTextEditor.set(null);
|
|
1787
|
+
this.select(id);
|
|
1788
|
+
this._updateCurrentPageState({ editingShapeId: id });
|
|
1789
|
+
const nextEditingShape = this.getShape(id);
|
|
1790
|
+
this.getShapeUtil(nextEditingShape).onEditStart?.(nextEditingShape);
|
|
1791
|
+
},
|
|
1792
|
+
{ history: "ignore" }
|
|
1793
|
+
);
|
|
1800
1794
|
return this;
|
|
1801
1795
|
}
|
|
1802
1796
|
getRichTextEditor() {
|
|
@@ -1929,6 +1923,25 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1929
1923
|
getCroppingShapeId() {
|
|
1930
1924
|
return this.getCurrentPageState().croppingShapeId;
|
|
1931
1925
|
}
|
|
1926
|
+
/**
|
|
1927
|
+
* Whether the shape can be cropped.
|
|
1928
|
+
*
|
|
1929
|
+
* @param shape - The shape (or shape id) to check if it can be cropped.
|
|
1930
|
+
*
|
|
1931
|
+
* @public
|
|
1932
|
+
* @returns true if the shape can be cropped, false otherwise.
|
|
1933
|
+
*/
|
|
1934
|
+
canCropShape(shape) {
|
|
1935
|
+
if (!shape) return false;
|
|
1936
|
+
const id = typeof shape === "string" ? shape : shape?.id ?? null;
|
|
1937
|
+
if (!id) return false;
|
|
1938
|
+
const _shape = this.getShape(id);
|
|
1939
|
+
if (!_shape) return false;
|
|
1940
|
+
const util = this.getShapeUtil(_shape);
|
|
1941
|
+
if (!util.canCrop(_shape)) return false;
|
|
1942
|
+
if (this.isShapeOrAncestorLocked(_shape)) return false;
|
|
1943
|
+
return true;
|
|
1944
|
+
}
|
|
1932
1945
|
/**
|
|
1933
1946
|
* Set the current cropping shape.
|
|
1934
1947
|
*
|
|
@@ -1950,12 +1963,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1950
1963
|
() => {
|
|
1951
1964
|
if (!id) {
|
|
1952
1965
|
this.updateCurrentPageState({ croppingShapeId: null });
|
|
1953
|
-
} else {
|
|
1954
|
-
|
|
1955
|
-
const util = this.getShapeUtil(shape2);
|
|
1956
|
-
if (shape2 && util.canCrop(shape2)) {
|
|
1957
|
-
this.updateCurrentPageState({ croppingShapeId: id });
|
|
1958
|
-
}
|
|
1966
|
+
} else if (this.canCropShape(id)) {
|
|
1967
|
+
this.updateCurrentPageState({ croppingShapeId: id });
|
|
1959
1968
|
}
|
|
1960
1969
|
},
|
|
1961
1970
|
{ history: "ignore" }
|
|
@@ -2030,6 +2039,22 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2030
2039
|
getZoomLevel() {
|
|
2031
2040
|
return this.getCamera().z;
|
|
2032
2041
|
}
|
|
2042
|
+
getDebouncedZoomLevel() {
|
|
2043
|
+
if (this.options.debouncedZoom) {
|
|
2044
|
+
if (this.getCameraState() === "idle") {
|
|
2045
|
+
return this.getZoomLevel();
|
|
2046
|
+
} else {
|
|
2047
|
+
return this._debouncedZoomLevel.get();
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
return this.getZoomLevel();
|
|
2051
|
+
}
|
|
2052
|
+
_getAboveDebouncedZoomThreshold() {
|
|
2053
|
+
return this.getCurrentPageShapeIds().size > this.options.debouncedZoomThreshold;
|
|
2054
|
+
}
|
|
2055
|
+
getEfficientZoomLevel() {
|
|
2056
|
+
return this._getAboveDebouncedZoomThreshold() ? this.getDebouncedZoomLevel() : this.getZoomLevel();
|
|
2057
|
+
}
|
|
2033
2058
|
/**
|
|
2034
2059
|
* Get the camera's initial or reset zoom level.
|
|
2035
2060
|
*
|
|
@@ -2275,7 +2300,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2275
2300
|
},
|
|
2276
2301
|
{ history: "ignore" }
|
|
2277
2302
|
);
|
|
2278
|
-
const
|
|
2303
|
+
const currentScreenPoint = this.inputs.getCurrentScreenPoint();
|
|
2304
|
+
const currentPagePoint = this.inputs.getCurrentPagePoint();
|
|
2279
2305
|
if (currentScreenPoint.x / z - x !== currentPagePoint.x || currentScreenPoint.y / z - y !== currentPagePoint.y) {
|
|
2280
2306
|
this.updatePointer({
|
|
2281
2307
|
immediate: opts?.immediate,
|
|
@@ -2410,7 +2436,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2410
2436
|
* ```ts
|
|
2411
2437
|
* editor.zoomIn()
|
|
2412
2438
|
* editor.zoomIn(editor.getViewportScreenCenter(), { animation: { duration: 200 } })
|
|
2413
|
-
* editor.zoomIn(editor.inputs.
|
|
2439
|
+
* editor.zoomIn(editor.inputs.getCurrentScreenPoint(), { animation: { duration: 200 } })
|
|
2414
2440
|
* ```
|
|
2415
2441
|
*
|
|
2416
2442
|
* @param point - The screen point to zoom in on. Defaults to the screen center
|
|
@@ -2451,7 +2477,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2451
2477
|
* ```ts
|
|
2452
2478
|
* editor.zoomOut()
|
|
2453
2479
|
* editor.zoomOut(editor.getViewportScreenCenter(), { animation: { duration: 120 } })
|
|
2454
|
-
* editor.zoomOut(editor.inputs.
|
|
2480
|
+
* editor.zoomOut(editor.inputs.getCurrentScreenPoint(), { animation: { duration: 120 } })
|
|
2455
2481
|
* ```
|
|
2456
2482
|
*
|
|
2457
2483
|
* @param point - The point to zoom out on. Defaults to the viewport screen center.
|
|
@@ -2503,10 +2529,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2503
2529
|
if (isLocked && !opts?.force) return this;
|
|
2504
2530
|
const selectionPageBounds = this.getSelectionPageBounds();
|
|
2505
2531
|
if (selectionPageBounds) {
|
|
2506
|
-
this.
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
}
|
|
2532
|
+
const currentZoom = this.getZoomLevel();
|
|
2533
|
+
if (Math.abs(currentZoom - 1) < 0.01) {
|
|
2534
|
+
this.zoomToBounds(selectionPageBounds, opts);
|
|
2535
|
+
} else {
|
|
2536
|
+
this.zoomToBounds(selectionPageBounds, {
|
|
2537
|
+
targetZoom: 1,
|
|
2538
|
+
...opts
|
|
2539
|
+
});
|
|
2540
|
+
}
|
|
2510
2541
|
}
|
|
2511
2542
|
return this;
|
|
2512
2543
|
}
|
|
@@ -2546,7 +2577,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2546
2577
|
const cameraOptions = this._cameraOptions.__unsafe__getWithoutCapture();
|
|
2547
2578
|
if (cameraOptions.isLocked && !opts?.force) return this;
|
|
2548
2579
|
const viewportScreenBounds = this.getViewportScreenBounds();
|
|
2549
|
-
const inset = opts?.inset ?? Math.min(
|
|
2580
|
+
const inset = opts?.inset ?? Math.min(this.options.zoomToFitPadding, viewportScreenBounds.width * 0.28);
|
|
2550
2581
|
const baseZoom = this.getBaseZoom();
|
|
2551
2582
|
const zoomMin = cameraOptions.zoomSteps[0];
|
|
2552
2583
|
const zoomMax = (0, import_utils.last)(cameraOptions.zoomSteps);
|
|
@@ -2784,7 +2815,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2784
2815
|
this._setCamera(import_Vec.Vec.From({ ...this.getCamera() }));
|
|
2785
2816
|
}
|
|
2786
2817
|
}
|
|
2787
|
-
this._tickCameraState();
|
|
2788
2818
|
return this;
|
|
2789
2819
|
}
|
|
2790
2820
|
getViewportScreenBounds() {
|
|
@@ -3064,6 +3094,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3064
3094
|
this._cameraStateTimeoutRemaining = this.options.cameraMovingTimeoutMs;
|
|
3065
3095
|
if (this._cameraState.__unsafe__getWithoutCapture() !== "idle") return;
|
|
3066
3096
|
this._cameraState.set("moving");
|
|
3097
|
+
this._debouncedZoomLevel.set((0, import_state.unsafe__withoutCapture)(() => this.getCamera().z));
|
|
3067
3098
|
this.on("tick", this._decayCameraStateTimeout);
|
|
3068
3099
|
}
|
|
3069
3100
|
/**
|
|
@@ -3816,14 +3847,29 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3816
3847
|
const notVisibleShapes2 = this.getNotVisibleShapes();
|
|
3817
3848
|
const selectedShapeIds = this.getSelectedShapeIds();
|
|
3818
3849
|
const editingId = this.getEditingShapeId();
|
|
3819
|
-
const
|
|
3850
|
+
const nextValue = new Set(notVisibleShapes2);
|
|
3820
3851
|
if (editingId) {
|
|
3821
|
-
|
|
3852
|
+
nextValue.delete(editingId);
|
|
3822
3853
|
}
|
|
3823
3854
|
selectedShapeIds.forEach((id) => {
|
|
3824
|
-
|
|
3855
|
+
nextValue.delete(id);
|
|
3825
3856
|
});
|
|
3826
|
-
|
|
3857
|
+
const prevValue = this._culledShapesCache;
|
|
3858
|
+
if (prevValue) {
|
|
3859
|
+
if (prevValue.size !== nextValue.size) {
|
|
3860
|
+
this._culledShapesCache = nextValue;
|
|
3861
|
+
return nextValue;
|
|
3862
|
+
}
|
|
3863
|
+
for (const id of prevValue) {
|
|
3864
|
+
if (!nextValue.has(id)) {
|
|
3865
|
+
this._culledShapesCache = nextValue;
|
|
3866
|
+
return nextValue;
|
|
3867
|
+
}
|
|
3868
|
+
}
|
|
3869
|
+
return prevValue;
|
|
3870
|
+
}
|
|
3871
|
+
this._culledShapesCache = nextValue;
|
|
3872
|
+
return nextValue;
|
|
3827
3873
|
}
|
|
3828
3874
|
getCurrentPageBounds() {
|
|
3829
3875
|
let commonBounds;
|
|
@@ -3873,7 +3919,10 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3873
3919
|
let inHollowSmallestAreaHit = null;
|
|
3874
3920
|
let inMarginClosestToEdgeDistance = Infinity;
|
|
3875
3921
|
let inMarginClosestToEdgeHit = null;
|
|
3922
|
+
const searchMargin = Math.max(innerMargin, outerMargin, this.options.hitTestMargin / zoomLevel);
|
|
3923
|
+
const candidateIds = this._spatialIndex.getShapeIdsAtPoint(point, searchMargin);
|
|
3876
3924
|
const shapesToCheck = (opts.renderingOnly ? this.getCurrentPageRenderingShapesSorted() : this.getCurrentPageShapesSorted()).filter((shape) => {
|
|
3925
|
+
if (!candidateIds.has(shape.id) && !this.isShapeOfType(shape, "frame")) return false;
|
|
3877
3926
|
if (shape.isLocked && !hitLocked || this.isShapeHidden(shape) || this.isShapeOfType(shape, "group"))
|
|
3878
3927
|
return false;
|
|
3879
3928
|
const pageMask = this.getShapeMask(shape);
|
|
@@ -3980,7 +4029,33 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3980
4029
|
* @public
|
|
3981
4030
|
*/
|
|
3982
4031
|
getShapesAtPoint(point, opts = {}) {
|
|
3983
|
-
|
|
4032
|
+
const margin = opts.margin ?? 0;
|
|
4033
|
+
const candidateIds = this._spatialIndex.getShapeIdsAtPoint(point, margin);
|
|
4034
|
+
return this.getCurrentPageShapesSorted().filter((shape) => {
|
|
4035
|
+
if (this.isShapeHidden(shape)) return false;
|
|
4036
|
+
if (!candidateIds.has(shape.id) && !this.isShapeOfType(shape, "frame")) return false;
|
|
4037
|
+
return this.isPointInShape(shape, point, opts);
|
|
4038
|
+
}).reverse();
|
|
4039
|
+
}
|
|
4040
|
+
/**
|
|
4041
|
+
* Get shape IDs within the given bounds.
|
|
4042
|
+
*
|
|
4043
|
+
* Note: Uses shape page bounds only. Frames with labels outside their bounds
|
|
4044
|
+
* may not be included even if the label is within the search bounds.
|
|
4045
|
+
*
|
|
4046
|
+
* Note: Results are unordered. If you need z-order, combine with sorted shapes:
|
|
4047
|
+
* ```ts
|
|
4048
|
+
* const candidates = editor.getShapeIdsInsideBounds(bounds)
|
|
4049
|
+
* const sorted = editor.getCurrentPageShapesSorted().filter(s => candidates.has(s.id))
|
|
4050
|
+
* ```
|
|
4051
|
+
*
|
|
4052
|
+
* @param bounds - The bounds to search within.
|
|
4053
|
+
* @returns Unordered set of shape IDs within the given bounds.
|
|
4054
|
+
*
|
|
4055
|
+
* @internal
|
|
4056
|
+
*/
|
|
4057
|
+
getShapeIdsInsideBounds(bounds) {
|
|
4058
|
+
return this._spatialIndex.getShapeIdsInsideBounds(bounds);
|
|
3984
4059
|
}
|
|
3985
4060
|
/**
|
|
3986
4061
|
* Test whether a point (in the current page space) will will a shape. This method takes into account masks,
|
|
@@ -5663,8 +5738,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
5663
5738
|
isAspectRatioLocked: options.isAspectRatioLocked
|
|
5664
5739
|
});
|
|
5665
5740
|
if (Math.sign(scale.x) * Math.sign(scale.y) < 0) {
|
|
5666
|
-
|
|
5667
|
-
rotation
|
|
5741
|
+
const parentRotation = this.getShapeParentTransform(id).rotation();
|
|
5742
|
+
const rotation = -options.initialShape.rotation - 2 * parentRotation;
|
|
5668
5743
|
this.updateShapes([{ id, type, rotation }]);
|
|
5669
5744
|
}
|
|
5670
5745
|
const preScaleShapePageCenter = import_Mat.Mat.applyToPoint(
|
|
@@ -5677,9 +5752,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
5677
5752
|
scale,
|
|
5678
5753
|
options.scaleAxisRotation
|
|
5679
5754
|
);
|
|
5680
|
-
const pageBounds = this.getShapePageBounds(id);
|
|
5681
5755
|
const pageTransform = this.getShapePageTransform(id);
|
|
5682
|
-
const
|
|
5756
|
+
const currentLocalBounds = this.getShapeGeometry(id).bounds;
|
|
5757
|
+
const currentPageCenter = import_Mat.Mat.applyToPoint(pageTransform, currentLocalBounds.center);
|
|
5683
5758
|
const shapePageTransformOrigin = pageTransform.point();
|
|
5684
5759
|
if (!currentPageCenter || !shapePageTransformOrigin) return this;
|
|
5685
5760
|
const pageDelta = import_Vec.Vec.Sub(postScaleShapePageCenter, currentPageCenter);
|
|
@@ -5965,7 +6040,11 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
5965
6040
|
)
|
|
5966
6041
|
);
|
|
5967
6042
|
const sortedShapeIds = shapesToGroup.sort(import_utils.sortByIndex).map((s) => s.id);
|
|
5968
|
-
const
|
|
6043
|
+
const childBounds = (0, import_utils.compact)(shapesToGroup.map((shape) => this.getShapePageBounds(shape)));
|
|
6044
|
+
const pageBounds = import_Box.Box.Common(childBounds);
|
|
6045
|
+
if (!pageBounds.isValid()) {
|
|
6046
|
+
throw Error(`Editor.groupShapes: group bounds are invalid (NaN).`);
|
|
6047
|
+
}
|
|
5969
6048
|
const { x, y } = pageBounds.point;
|
|
5970
6049
|
const parentId = this.findCommonAncestor(shapesToGroup) ?? this.getCurrentPageId();
|
|
5971
6050
|
if (this.getCurrentToolId() !== "select") return this;
|
|
@@ -6655,6 +6734,25 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
6655
6734
|
}
|
|
6656
6735
|
}
|
|
6657
6736
|
}
|
|
6737
|
+
if (point) {
|
|
6738
|
+
const shapesById = new Map(shapes.map((shape) => [shape.id, shape]));
|
|
6739
|
+
const rootShapesFromContent = (0, import_utils.compact)(rootShapeIds.map((id) => shapesById.get(id)));
|
|
6740
|
+
if (rootShapesFromContent.length > 0) {
|
|
6741
|
+
const targetParent = this.getShapeAtPoint(point, {
|
|
6742
|
+
hitInside: true,
|
|
6743
|
+
hitFrameInside: true,
|
|
6744
|
+
hitLocked: true,
|
|
6745
|
+
filter: (shape) => {
|
|
6746
|
+
const util = this.getShapeUtil(shape);
|
|
6747
|
+
if (!util.canReceiveNewChildrenOfType) return false;
|
|
6748
|
+
return rootShapesFromContent.every(
|
|
6749
|
+
(rootShape) => util.canReceiveNewChildrenOfType(shape, rootShape.type)
|
|
6750
|
+
);
|
|
6751
|
+
}
|
|
6752
|
+
});
|
|
6753
|
+
pasteParentId = targetParent ? targetParent.id : currentPageId;
|
|
6754
|
+
}
|
|
6755
|
+
}
|
|
6658
6756
|
let isDuplicating = false;
|
|
6659
6757
|
if (!(0, import_tlschema.isPageId)(pasteParentId)) {
|
|
6660
6758
|
const parent = this.getShape(pasteParentId);
|
|
@@ -6899,60 +6997,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
6899
6997
|
height
|
|
6900
6998
|
};
|
|
6901
6999
|
}
|
|
6902
|
-
|
|
6903
|
-
* Update the input points from a pointer, pinch, or wheel event.
|
|
6904
|
-
*
|
|
6905
|
-
* @param info - The event info.
|
|
6906
|
-
*/
|
|
6907
|
-
_updateInputsFromEvent(info) {
|
|
6908
|
-
const {
|
|
6909
|
-
pointerVelocity,
|
|
6910
|
-
previousScreenPoint,
|
|
6911
|
-
previousPagePoint,
|
|
6912
|
-
currentScreenPoint,
|
|
6913
|
-
currentPagePoint,
|
|
6914
|
-
originScreenPoint,
|
|
6915
|
-
originPagePoint
|
|
6916
|
-
} = this.inputs;
|
|
6917
|
-
const { screenBounds } = this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID);
|
|
6918
|
-
const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
|
|
6919
|
-
const sx = info.point.x - screenBounds.x;
|
|
6920
|
-
const sy = info.point.y - screenBounds.y;
|
|
6921
|
-
const sz = info.point.z ?? 0.5;
|
|
6922
|
-
previousScreenPoint.setTo(currentScreenPoint);
|
|
6923
|
-
previousPagePoint.setTo(currentPagePoint);
|
|
6924
|
-
currentScreenPoint.set(sx, sy);
|
|
6925
|
-
const nx = sx / cz - cx;
|
|
6926
|
-
const ny = sy / cz - cy;
|
|
6927
|
-
if (isFinite(nx) && isFinite(ny)) {
|
|
6928
|
-
currentPagePoint.set(nx, ny, sz);
|
|
6929
|
-
}
|
|
6930
|
-
this.inputs.isPen = info.type === "pointer" && info.isPen;
|
|
6931
|
-
if (info.name === "pointer_down" || this.inputs.isPinching) {
|
|
6932
|
-
pointerVelocity.set(0, 0);
|
|
6933
|
-
originScreenPoint.setTo(currentScreenPoint);
|
|
6934
|
-
originPagePoint.setTo(currentPagePoint);
|
|
6935
|
-
}
|
|
6936
|
-
this.run(
|
|
6937
|
-
() => {
|
|
6938
|
-
this.store.put([
|
|
6939
|
-
{
|
|
6940
|
-
id: import_tlschema.TLPOINTER_ID,
|
|
6941
|
-
typeName: "pointer",
|
|
6942
|
-
x: currentPagePoint.x,
|
|
6943
|
-
y: currentPagePoint.y,
|
|
6944
|
-
lastActivityTimestamp: (
|
|
6945
|
-
// If our pointer moved only because we're following some other user, then don't
|
|
6946
|
-
// update our last activity timestamp; otherwise, update it to the current timestamp.
|
|
6947
|
-
info.type === "pointer" && info.pointerId === import_constants.INTERNAL_POINTER_IDS.CAMERA_MOVE ? this.store.unsafeGetWithoutCapture(import_tlschema.TLPOINTER_ID)?.lastActivityTimestamp ?? this._tickManager.now : this._tickManager.now
|
|
6948
|
-
),
|
|
6949
|
-
meta: {}
|
|
6950
|
-
}
|
|
6951
|
-
]);
|
|
6952
|
-
},
|
|
6953
|
-
{ history: "ignore" }
|
|
6954
|
-
);
|
|
6955
|
-
}
|
|
7000
|
+
/* --------------------- Events --------------------- */
|
|
6956
7001
|
/**
|
|
6957
7002
|
* Dispatch a cancel event.
|
|
6958
7003
|
*
|
|
@@ -7017,18 +7062,19 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7017
7062
|
point: options?.point ?? // weird but true: what `inputs` calls screen-space is actually viewport space. so
|
|
7018
7063
|
// we need to convert back into true screen space first. we should fix this...
|
|
7019
7064
|
import_Vec.Vec.Add(
|
|
7020
|
-
this.inputs.
|
|
7065
|
+
this.inputs.getCurrentScreenPoint(),
|
|
7021
7066
|
this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID).screenBounds
|
|
7022
7067
|
),
|
|
7023
7068
|
pointerId: options?.pointerId ?? 0,
|
|
7024
7069
|
button: options?.button ?? 0,
|
|
7025
|
-
isPen: options?.isPen ?? this.inputs.
|
|
7026
|
-
shiftKey: options?.shiftKey ?? this.inputs.
|
|
7027
|
-
altKey: options?.altKey ?? this.inputs.
|
|
7028
|
-
ctrlKey: options?.ctrlKey ?? this.inputs.
|
|
7029
|
-
metaKey: options?.metaKey ?? this.inputs.
|
|
7030
|
-
accelKey:
|
|
7070
|
+
isPen: options?.isPen ?? this.inputs.getIsPen(),
|
|
7071
|
+
shiftKey: options?.shiftKey ?? this.inputs.getShiftKey(),
|
|
7072
|
+
altKey: options?.altKey ?? this.inputs.getAltKey(),
|
|
7073
|
+
ctrlKey: options?.ctrlKey ?? this.inputs.getCtrlKey(),
|
|
7074
|
+
metaKey: options?.metaKey ?? this.inputs.getMetaKey(),
|
|
7075
|
+
accelKey: false
|
|
7031
7076
|
};
|
|
7077
|
+
event.accelKey = options?.accelKey ?? this.inputs.getAccelKey();
|
|
7032
7078
|
if (options?.immediate) {
|
|
7033
7079
|
this._flushEventForTick(event);
|
|
7034
7080
|
} else {
|
|
@@ -7344,58 +7390,58 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7344
7390
|
this._clickManager.cancelDoubleClickTimeout();
|
|
7345
7391
|
}
|
|
7346
7392
|
_setShiftKeyTimeout() {
|
|
7347
|
-
this.inputs.
|
|
7393
|
+
this.inputs.setShiftKey(false);
|
|
7348
7394
|
this.dispatch({
|
|
7349
7395
|
type: "keyboard",
|
|
7350
7396
|
name: "key_up",
|
|
7351
7397
|
key: "Shift",
|
|
7352
|
-
shiftKey: this.inputs.
|
|
7353
|
-
ctrlKey: this.inputs.
|
|
7354
|
-
altKey: this.inputs.
|
|
7355
|
-
metaKey: this.inputs.
|
|
7356
|
-
accelKey:
|
|
7398
|
+
shiftKey: this.inputs.getShiftKey(),
|
|
7399
|
+
ctrlKey: this.inputs.getCtrlKey(),
|
|
7400
|
+
altKey: this.inputs.getAltKey(),
|
|
7401
|
+
metaKey: this.inputs.getMetaKey(),
|
|
7402
|
+
accelKey: this.inputs.getAccelKey(),
|
|
7357
7403
|
code: "ShiftLeft"
|
|
7358
7404
|
});
|
|
7359
7405
|
}
|
|
7360
7406
|
_setAltKeyTimeout() {
|
|
7361
|
-
this.inputs.
|
|
7407
|
+
this.inputs.setAltKey(false);
|
|
7362
7408
|
this.dispatch({
|
|
7363
7409
|
type: "keyboard",
|
|
7364
7410
|
name: "key_up",
|
|
7365
7411
|
key: "Alt",
|
|
7366
|
-
shiftKey: this.inputs.
|
|
7367
|
-
ctrlKey: this.inputs.
|
|
7368
|
-
altKey: this.inputs.
|
|
7369
|
-
metaKey: this.inputs.
|
|
7370
|
-
accelKey:
|
|
7412
|
+
shiftKey: this.inputs.getShiftKey(),
|
|
7413
|
+
ctrlKey: this.inputs.getCtrlKey(),
|
|
7414
|
+
altKey: this.inputs.getAltKey(),
|
|
7415
|
+
metaKey: this.inputs.getMetaKey(),
|
|
7416
|
+
accelKey: this.inputs.getAccelKey(),
|
|
7371
7417
|
code: "AltLeft"
|
|
7372
7418
|
});
|
|
7373
7419
|
}
|
|
7374
7420
|
_setCtrlKeyTimeout() {
|
|
7375
|
-
this.inputs.
|
|
7421
|
+
this.inputs.setCtrlKey(false);
|
|
7376
7422
|
this.dispatch({
|
|
7377
7423
|
type: "keyboard",
|
|
7378
7424
|
name: "key_up",
|
|
7379
7425
|
key: "Ctrl",
|
|
7380
|
-
shiftKey: this.inputs.
|
|
7381
|
-
ctrlKey: this.inputs.
|
|
7382
|
-
altKey: this.inputs.
|
|
7383
|
-
metaKey: this.inputs.
|
|
7384
|
-
accelKey:
|
|
7426
|
+
shiftKey: this.inputs.getShiftKey(),
|
|
7427
|
+
ctrlKey: this.inputs.getCtrlKey(),
|
|
7428
|
+
altKey: this.inputs.getAltKey(),
|
|
7429
|
+
metaKey: this.inputs.getMetaKey(),
|
|
7430
|
+
accelKey: this.inputs.getAccelKey(),
|
|
7385
7431
|
code: "ControlLeft"
|
|
7386
7432
|
});
|
|
7387
7433
|
}
|
|
7388
7434
|
_setMetaKeyTimeout() {
|
|
7389
|
-
this.inputs.
|
|
7435
|
+
this.inputs.setMetaKey(false);
|
|
7390
7436
|
this.dispatch({
|
|
7391
7437
|
type: "keyboard",
|
|
7392
7438
|
name: "key_up",
|
|
7393
7439
|
key: "Meta",
|
|
7394
|
-
shiftKey: this.inputs.
|
|
7395
|
-
ctrlKey: this.inputs.
|
|
7396
|
-
altKey: this.inputs.
|
|
7397
|
-
metaKey: this.inputs.
|
|
7398
|
-
accelKey:
|
|
7440
|
+
shiftKey: this.inputs.getShiftKey(),
|
|
7441
|
+
ctrlKey: this.inputs.getCtrlKey(),
|
|
7442
|
+
altKey: this.inputs.getAltKey(),
|
|
7443
|
+
metaKey: this.inputs.getMetaKey(),
|
|
7444
|
+
accelKey: this.inputs.getAccelKey(),
|
|
7399
7445
|
code: "MetaLeft"
|
|
7400
7446
|
});
|
|
7401
7447
|
}
|
|
@@ -7466,48 +7512,47 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7466
7512
|
const { type } = info;
|
|
7467
7513
|
if (info.type === "misc") {
|
|
7468
7514
|
if (info.name === "cancel" || info.name === "complete") {
|
|
7469
|
-
this.inputs.
|
|
7470
|
-
if (this.inputs.
|
|
7471
|
-
this.inputs.
|
|
7472
|
-
this.inputs.
|
|
7515
|
+
this.inputs.setIsDragging(false);
|
|
7516
|
+
if (this.inputs.getIsPanning()) {
|
|
7517
|
+
this.inputs.setIsPanning(false);
|
|
7518
|
+
this.inputs.setIsSpacebarPanning(false);
|
|
7473
7519
|
this.setCursor({ type: this._prevCursor, rotation: 0 });
|
|
7474
7520
|
}
|
|
7475
7521
|
}
|
|
7476
|
-
this.emit("event", info);
|
|
7477
7522
|
this.root.handleEvent(info);
|
|
7523
|
+
this.emit("event", info);
|
|
7478
7524
|
return;
|
|
7479
7525
|
}
|
|
7480
7526
|
if (info.shiftKey) {
|
|
7481
7527
|
clearTimeout(this._shiftKeyTimeout);
|
|
7482
7528
|
this._shiftKeyTimeout = -1;
|
|
7483
|
-
inputs.
|
|
7484
|
-
} else if (!info.shiftKey && inputs.
|
|
7529
|
+
inputs.setShiftKey(true);
|
|
7530
|
+
} else if (!info.shiftKey && inputs.getShiftKey() && this._shiftKeyTimeout === -1) {
|
|
7485
7531
|
this._shiftKeyTimeout = this.timers.setTimeout(this._setShiftKeyTimeout, 150);
|
|
7486
7532
|
}
|
|
7487
7533
|
if (info.altKey) {
|
|
7488
7534
|
clearTimeout(this._altKeyTimeout);
|
|
7489
7535
|
this._altKeyTimeout = -1;
|
|
7490
|
-
inputs.
|
|
7491
|
-
} else if (!info.altKey && inputs.
|
|
7536
|
+
inputs.setAltKey(true);
|
|
7537
|
+
} else if (!info.altKey && inputs.getAltKey() && this._altKeyTimeout === -1) {
|
|
7492
7538
|
this._altKeyTimeout = this.timers.setTimeout(this._setAltKeyTimeout, 150);
|
|
7493
7539
|
}
|
|
7494
7540
|
if (info.ctrlKey) {
|
|
7495
7541
|
clearTimeout(this._ctrlKeyTimeout);
|
|
7496
7542
|
this._ctrlKeyTimeout = -1;
|
|
7497
|
-
inputs.
|
|
7498
|
-
} else if (!info.ctrlKey && inputs.
|
|
7543
|
+
inputs.setCtrlKey(true);
|
|
7544
|
+
} else if (!info.ctrlKey && inputs.getCtrlKey() && this._ctrlKeyTimeout === -1) {
|
|
7499
7545
|
this._ctrlKeyTimeout = this.timers.setTimeout(this._setCtrlKeyTimeout, 150);
|
|
7500
7546
|
}
|
|
7501
7547
|
if (info.metaKey) {
|
|
7502
7548
|
clearTimeout(this._metaKeyTimeout);
|
|
7503
7549
|
this._metaKeyTimeout = -1;
|
|
7504
|
-
inputs.
|
|
7505
|
-
} else if (!info.metaKey && inputs.
|
|
7550
|
+
inputs.setMetaKey(true);
|
|
7551
|
+
} else if (!info.metaKey && inputs.getMetaKey() && this._metaKeyTimeout === -1) {
|
|
7506
7552
|
this._metaKeyTimeout = this.timers.setTimeout(this._setMetaKeyTimeout, 150);
|
|
7507
7553
|
}
|
|
7508
|
-
|
|
7509
|
-
|
|
7510
|
-
inputs.isDragging = false;
|
|
7554
|
+
if (!inputs.getIsPointing()) {
|
|
7555
|
+
inputs.setIsDragging(false);
|
|
7511
7556
|
}
|
|
7512
7557
|
const instanceState = this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID);
|
|
7513
7558
|
const pageState = this.store.get(this._getCurrentPageStateId());
|
|
@@ -7516,23 +7561,23 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7516
7561
|
case "pinch": {
|
|
7517
7562
|
if (cameraOptions.isLocked) return;
|
|
7518
7563
|
clearTimeout(this._longPressTimeout);
|
|
7519
|
-
this.
|
|
7564
|
+
this.inputs.updateFromEvent(info);
|
|
7520
7565
|
switch (info.name) {
|
|
7521
7566
|
case "pinch_start": {
|
|
7522
|
-
if (inputs.
|
|
7523
|
-
if (!inputs.
|
|
7524
|
-
this._pinchStart = this.getCamera().z;
|
|
7567
|
+
if (inputs.getIsPinching()) return;
|
|
7568
|
+
if (!inputs.getIsEditing()) {
|
|
7525
7569
|
if (!this._selectedShapeIdsAtPointerDown.length) {
|
|
7526
7570
|
this._selectedShapeIdsAtPointerDown = [...pageState.selectedShapeIds];
|
|
7527
7571
|
}
|
|
7528
7572
|
this._didPinch = true;
|
|
7529
|
-
inputs.
|
|
7573
|
+
inputs.setIsPinching(true);
|
|
7530
7574
|
this.interrupt();
|
|
7531
7575
|
}
|
|
7576
|
+
this.emit("event", info);
|
|
7532
7577
|
return;
|
|
7533
7578
|
}
|
|
7534
7579
|
case "pinch": {
|
|
7535
|
-
if (!inputs.
|
|
7580
|
+
if (!inputs.getIsPinching()) return;
|
|
7536
7581
|
const {
|
|
7537
7582
|
point: { z = 1 },
|
|
7538
7583
|
delta: { x: dx, y: dy }
|
|
@@ -7556,11 +7601,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7556
7601
|
),
|
|
7557
7602
|
{ immediate: true }
|
|
7558
7603
|
);
|
|
7604
|
+
this.emit("event", info);
|
|
7559
7605
|
return;
|
|
7560
7606
|
}
|
|
7561
7607
|
case "pinch_end": {
|
|
7562
|
-
if (!inputs.
|
|
7563
|
-
inputs.
|
|
7608
|
+
if (!inputs.getIsPinching()) return this;
|
|
7609
|
+
inputs.setIsPinching(false);
|
|
7564
7610
|
const { _selectedShapeIdsAtPointerDown: shapesToReselect } = this;
|
|
7565
7611
|
this.setSelectedShapes(this._selectedShapeIdsAtPointerDown);
|
|
7566
7612
|
this._selectedShapeIdsAtPointerDown = [];
|
|
@@ -7574,13 +7620,14 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7574
7620
|
});
|
|
7575
7621
|
}
|
|
7576
7622
|
}
|
|
7623
|
+
this.emit("event", info);
|
|
7577
7624
|
return;
|
|
7578
7625
|
}
|
|
7579
7626
|
}
|
|
7580
7627
|
}
|
|
7581
7628
|
case "wheel": {
|
|
7582
7629
|
if (cameraOptions.isLocked) return;
|
|
7583
|
-
this.
|
|
7630
|
+
this.inputs.updateFromEvent(info);
|
|
7584
7631
|
const { panSpeed, zoomSpeed } = cameraOptions;
|
|
7585
7632
|
let wheelBehavior = cameraOptions.wheelBehavior;
|
|
7586
7633
|
const inputMode = this.user.getUserPreferences().inputMode;
|
|
@@ -7598,7 +7645,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7598
7645
|
if (info.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
|
|
7599
7646
|
switch (behavior) {
|
|
7600
7647
|
case "zoom": {
|
|
7601
|
-
const { x, y } = this.inputs.
|
|
7648
|
+
const { x, y } = this.inputs.getCurrentScreenPoint();
|
|
7602
7649
|
let delta = dz;
|
|
7603
7650
|
if (wheelBehavior === "zoom") {
|
|
7604
7651
|
if (Math.abs(dy) > 10) {
|
|
@@ -7612,6 +7659,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7612
7659
|
immediate: true
|
|
7613
7660
|
});
|
|
7614
7661
|
this.maybeTrackPerformance("Zooming");
|
|
7662
|
+
this.root.handleEvent(info);
|
|
7663
|
+
this.emit("event", info);
|
|
7615
7664
|
return;
|
|
7616
7665
|
}
|
|
7617
7666
|
case "pan": {
|
|
@@ -7619,6 +7668,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7619
7668
|
immediate: true
|
|
7620
7669
|
});
|
|
7621
7670
|
this.maybeTrackPerformance("Panning");
|
|
7671
|
+
this.root.handleEvent(info);
|
|
7672
|
+
this.emit("event", info);
|
|
7622
7673
|
return;
|
|
7623
7674
|
}
|
|
7624
7675
|
}
|
|
@@ -7626,14 +7677,14 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7626
7677
|
break;
|
|
7627
7678
|
}
|
|
7628
7679
|
case "pointer": {
|
|
7629
|
-
if (inputs.
|
|
7630
|
-
this.
|
|
7680
|
+
if (inputs.getIsPinching()) return;
|
|
7681
|
+
this.inputs.updateFromEvent(info);
|
|
7631
7682
|
const { isPen } = info;
|
|
7632
7683
|
const { isPenMode } = instanceState;
|
|
7633
7684
|
switch (info.name) {
|
|
7634
7685
|
case "pointer_down": {
|
|
7635
7686
|
if (isPenMode && !isPen) return;
|
|
7636
|
-
if (!this.inputs.
|
|
7687
|
+
if (!this.inputs.getIsPanning()) {
|
|
7637
7688
|
this._longPressTimeout = this.timers.setTimeout(() => {
|
|
7638
7689
|
const vsb = this.getViewportScreenBounds();
|
|
7639
7690
|
this.dispatch({
|
|
@@ -7642,7 +7693,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7642
7693
|
// viewport bounds, and will be again when this event is handled...
|
|
7643
7694
|
// so we need to counter-adjust from the stored value so that the
|
|
7644
7695
|
// new value is set correctly.
|
|
7645
|
-
point: this.inputs.
|
|
7696
|
+
point: this.inputs.getOriginScreenPoint().clone().addXY(vsb.x, vsb.y),
|
|
7646
7697
|
name: "long_press"
|
|
7647
7698
|
});
|
|
7648
7699
|
}, this.options.longPressDurationMs);
|
|
@@ -7650,21 +7701,21 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7650
7701
|
this._selectedShapeIdsAtPointerDown = this.getSelectedShapeIds();
|
|
7651
7702
|
if (info.button === import_constants.LEFT_MOUSE_BUTTON) this.capturedPointerId = info.pointerId;
|
|
7652
7703
|
inputs.buttons.add(info.button);
|
|
7653
|
-
inputs.
|
|
7654
|
-
inputs.
|
|
7704
|
+
inputs.setIsPointing(true);
|
|
7705
|
+
inputs.setIsDragging(false);
|
|
7655
7706
|
if (!isPenMode && isPen) this.updateInstanceState({ isPenMode: true });
|
|
7656
7707
|
if (info.button === import_constants.STYLUS_ERASER_BUTTON) {
|
|
7657
7708
|
this._restoreToolId = this.getCurrentToolId();
|
|
7658
7709
|
this.complete();
|
|
7659
7710
|
this.setCurrentTool("eraser");
|
|
7660
7711
|
} else if (info.button === import_constants.MIDDLE_MOUSE_BUTTON) {
|
|
7661
|
-
if (!this.inputs.
|
|
7712
|
+
if (!this.inputs.getIsPanning()) {
|
|
7662
7713
|
this._prevCursor = this.getInstanceState().cursor.type;
|
|
7663
7714
|
}
|
|
7664
|
-
this.inputs.
|
|
7715
|
+
this.inputs.setIsPanning(true);
|
|
7665
7716
|
clearTimeout(this._longPressTimeout);
|
|
7666
7717
|
}
|
|
7667
|
-
if (this.inputs.
|
|
7718
|
+
if (this.inputs.getIsPanning()) {
|
|
7668
7719
|
this.stopCameraAnimation();
|
|
7669
7720
|
this.setCursor({ type: "grabbing", rotation: 0 });
|
|
7670
7721
|
return this;
|
|
@@ -7674,8 +7725,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7674
7725
|
case "pointer_move": {
|
|
7675
7726
|
if (!isPen && isPenMode) return;
|
|
7676
7727
|
const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
|
|
7677
|
-
if (this.inputs.
|
|
7678
|
-
const
|
|
7728
|
+
if (this.inputs.getIsPanning() && this.inputs.getIsPointing()) {
|
|
7729
|
+
const currentScreenPoint = this.inputs.getCurrentScreenPoint();
|
|
7730
|
+
const previousScreenPoint = this.inputs.getPreviousScreenPoint();
|
|
7679
7731
|
const offset = import_Vec.Vec.Sub(currentScreenPoint, previousScreenPoint);
|
|
7680
7732
|
this.setCamera(new import_Vec.Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
|
|
7681
7733
|
immediate: true
|
|
@@ -7683,15 +7735,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7683
7735
|
this.maybeTrackPerformance("Panning");
|
|
7684
7736
|
return;
|
|
7685
7737
|
}
|
|
7686
|
-
if (inputs.
|
|
7687
|
-
inputs.
|
|
7738
|
+
if (inputs.getIsPointing() && !inputs.getIsDragging() && import_Vec.Vec.Dist2(inputs.getOriginPagePoint(), inputs.getCurrentPagePoint()) * this.getZoomLevel() > (instanceState.isCoarsePointer ? this.options.coarseDragDistanceSquared : this.options.dragDistanceSquared) / cz) {
|
|
7739
|
+
inputs.setIsDragging(true);
|
|
7688
7740
|
clearTimeout(this._longPressTimeout);
|
|
7689
7741
|
}
|
|
7690
7742
|
break;
|
|
7691
7743
|
}
|
|
7692
7744
|
case "pointer_up": {
|
|
7693
|
-
inputs.
|
|
7694
|
-
inputs.
|
|
7745
|
+
inputs.setIsDragging(false);
|
|
7746
|
+
inputs.setIsPointing(false);
|
|
7695
7747
|
clearTimeout(this._longPressTimeout);
|
|
7696
7748
|
inputs.buttons.delete(info.button);
|
|
7697
7749
|
if (instanceState.isPenMode && !isPen) return;
|
|
@@ -7699,12 +7751,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7699
7751
|
this.capturedPointerId = null;
|
|
7700
7752
|
info.button = 0;
|
|
7701
7753
|
}
|
|
7702
|
-
if (inputs.
|
|
7754
|
+
if (inputs.getIsPanning()) {
|
|
7703
7755
|
if (!inputs.keys.has("Space")) {
|
|
7704
|
-
inputs.
|
|
7705
|
-
inputs.
|
|
7756
|
+
inputs.setIsPanning(false);
|
|
7757
|
+
inputs.setIsSpacebarPanning(false);
|
|
7706
7758
|
}
|
|
7707
|
-
const slideDirection = this.inputs.
|
|
7759
|
+
const slideDirection = this.inputs.getPointerVelocity();
|
|
7708
7760
|
const slideSpeed = Math.min(2, slideDirection.len());
|
|
7709
7761
|
switch (info.button) {
|
|
7710
7762
|
case import_constants.LEFT_MOUSE_BUTTON: {
|
|
@@ -7741,51 +7793,58 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7741
7793
|
switch (info.name) {
|
|
7742
7794
|
case "key_down": {
|
|
7743
7795
|
inputs.keys.add(info.code);
|
|
7744
|
-
if (
|
|
7745
|
-
if (!
|
|
7746
|
-
this.
|
|
7747
|
-
|
|
7748
|
-
this.inputs.isPanning = true;
|
|
7749
|
-
this.inputs.isSpacebarPanning = true;
|
|
7750
|
-
clearTimeout(this._longPressTimeout);
|
|
7751
|
-
this.setCursor({ type: this.inputs.isPointing ? "grabbing" : "grab", rotation: 0 });
|
|
7752
|
-
}
|
|
7753
|
-
if (this.inputs.isSpacebarPanning) {
|
|
7754
|
-
let offset;
|
|
7755
|
-
switch (info.code) {
|
|
7756
|
-
case "ArrowUp": {
|
|
7757
|
-
offset = new import_Vec.Vec(0, -1);
|
|
7758
|
-
break;
|
|
7759
|
-
}
|
|
7760
|
-
case "ArrowRight": {
|
|
7761
|
-
offset = new import_Vec.Vec(1, 0);
|
|
7762
|
-
break;
|
|
7796
|
+
if (this.options.spacebarPanning) {
|
|
7797
|
+
if (info.code === "Space" && !info.ctrlKey) {
|
|
7798
|
+
if (!this.inputs.getIsPanning()) {
|
|
7799
|
+
this._prevCursor = instanceState.cursor.type;
|
|
7763
7800
|
}
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
7801
|
+
this.inputs.setIsPanning(true);
|
|
7802
|
+
this.inputs.setIsSpacebarPanning(true);
|
|
7803
|
+
clearTimeout(this._longPressTimeout);
|
|
7804
|
+
this.setCursor({
|
|
7805
|
+
type: this.inputs.getIsPointing() ? "grabbing" : "grab",
|
|
7806
|
+
rotation: 0
|
|
7807
|
+
});
|
|
7808
|
+
}
|
|
7809
|
+
if (this.inputs.getIsSpacebarPanning()) {
|
|
7810
|
+
let offset;
|
|
7811
|
+
switch (info.code) {
|
|
7812
|
+
case "ArrowUp": {
|
|
7813
|
+
offset = new import_Vec.Vec(0, -1);
|
|
7814
|
+
break;
|
|
7815
|
+
}
|
|
7816
|
+
case "ArrowRight": {
|
|
7817
|
+
offset = new import_Vec.Vec(1, 0);
|
|
7818
|
+
break;
|
|
7819
|
+
}
|
|
7820
|
+
case "ArrowDown": {
|
|
7821
|
+
offset = new import_Vec.Vec(0, 1);
|
|
7822
|
+
break;
|
|
7823
|
+
}
|
|
7824
|
+
case "ArrowLeft": {
|
|
7825
|
+
offset = new import_Vec.Vec(-1, 0);
|
|
7826
|
+
break;
|
|
7827
|
+
}
|
|
7767
7828
|
}
|
|
7768
|
-
|
|
7769
|
-
|
|
7770
|
-
|
|
7829
|
+
if (offset) {
|
|
7830
|
+
const bounds = this.getViewportPageBounds();
|
|
7831
|
+
const next = bounds.clone().translate(offset.mulV({ x: bounds.w, y: bounds.h }));
|
|
7832
|
+
this._animateToViewport(next, { animation: { duration: 320 } });
|
|
7771
7833
|
}
|
|
7772
7834
|
}
|
|
7773
|
-
if (offset) {
|
|
7774
|
-
const bounds = this.getViewportPageBounds();
|
|
7775
|
-
const next = bounds.clone().translate(offset.mulV({ x: bounds.w, y: bounds.h }));
|
|
7776
|
-
this._animateToViewport(next, { animation: { duration: 320 } });
|
|
7777
|
-
}
|
|
7778
7835
|
}
|
|
7779
7836
|
break;
|
|
7780
7837
|
}
|
|
7781
7838
|
case "key_up": {
|
|
7782
7839
|
inputs.keys.delete(info.code);
|
|
7783
|
-
if (
|
|
7784
|
-
if (
|
|
7785
|
-
|
|
7786
|
-
|
|
7787
|
-
|
|
7788
|
-
|
|
7840
|
+
if (this.options.spacebarPanning) {
|
|
7841
|
+
if (info.code === "Space") {
|
|
7842
|
+
if (this.inputs.buttons.has(import_constants.MIDDLE_MOUSE_BUTTON)) {
|
|
7843
|
+
} else {
|
|
7844
|
+
this.inputs.setIsPanning(false);
|
|
7845
|
+
this.inputs.setIsSpacebarPanning(false);
|
|
7846
|
+
this.setCursor({ type: this._prevCursor, rotation: 0 });
|
|
7847
|
+
}
|
|
7789
7848
|
}
|
|
7790
7849
|
}
|
|
7791
7850
|
break;
|
|
@@ -7838,8 +7897,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
7838
7897
|
}
|
|
7839
7898
|
_init = __decoratorStart(_a);
|
|
7840
7899
|
__decorateElement(_init, 1, "getIsShapeHiddenCache", _getIsShapeHiddenCache_dec, Editor);
|
|
7841
|
-
__decorateElement(_init, 1, "
|
|
7842
|
-
__decorateElement(_init, 1, "
|
|
7900
|
+
__decorateElement(_init, 1, "canUndo", _canUndo_dec, Editor);
|
|
7901
|
+
__decorateElement(_init, 1, "canRedo", _canRedo_dec, Editor);
|
|
7843
7902
|
__decorateElement(_init, 1, "getPath", _getPath_dec, Editor);
|
|
7844
7903
|
__decorateElement(_init, 1, "getCurrentTool", _getCurrentTool_dec, Editor);
|
|
7845
7904
|
__decorateElement(_init, 1, "getCurrentToolId", _getCurrentToolId_dec, Editor);
|
|
@@ -7874,6 +7933,9 @@ __decorateElement(_init, 1, "getCamera", _getCamera_dec, Editor);
|
|
|
7874
7933
|
__decorateElement(_init, 1, "getViewportPageBoundsForFollowing", _getViewportPageBoundsForFollowing_dec, Editor);
|
|
7875
7934
|
__decorateElement(_init, 1, "getCameraForFollowing", _getCameraForFollowing_dec, Editor);
|
|
7876
7935
|
__decorateElement(_init, 1, "getZoomLevel", _getZoomLevel_dec, Editor);
|
|
7936
|
+
__decorateElement(_init, 1, "getDebouncedZoomLevel", _getDebouncedZoomLevel_dec, Editor);
|
|
7937
|
+
__decorateElement(_init, 1, "_getAboveDebouncedZoomThreshold", __getAboveDebouncedZoomThreshold_dec, Editor);
|
|
7938
|
+
__decorateElement(_init, 1, "getEfficientZoomLevel", _getEfficientZoomLevel_dec, Editor);
|
|
7877
7939
|
__decorateElement(_init, 1, "getViewportScreenBounds", _getViewportScreenBounds_dec, Editor);
|
|
7878
7940
|
__decorateElement(_init, 1, "getViewportScreenCenter", _getViewportScreenCenter_dec, Editor);
|
|
7879
7941
|
__decorateElement(_init, 1, "getViewportPageBounds", _getViewportPageBounds_dec, Editor);
|