@vertexvis/viewer 1.0.1-canary.9 → 1.0.1-testing.0

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.
Files changed (122) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/{multiElementInteractionHandler-CV_R_zWs.js → multiElementInteractionHandler-DFzC3VJQ.js} +14 -11
  3. package/dist/cjs/multiElementInteractionHandler-DFzC3VJQ.js.map +1 -0
  4. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +20 -11
  5. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  6. package/dist/cjs/vertex-scene-tree.cjs.entry.js +18 -5
  7. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  8. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  9. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +7 -5
  10. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  11. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +6 -6
  12. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  13. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +5 -5
  14. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  15. package/dist/cjs/vertex-viewer.cjs.entry.js +18 -12
  16. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  17. package/dist/cjs/viewer.cjs.js +1 -1
  18. package/dist/collection/components/scene-tree/scene-tree.js +18 -5
  19. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  20. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +20 -11
  21. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  22. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js +8 -6
  23. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js.map +1 -1
  24. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js +7 -7
  25. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  26. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +6 -7
  27. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
  28. package/dist/collection/lib/interactions/baseInteractionHandler.js +12 -9
  29. package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
  30. package/dist/collection/lib/interactions/mouseInteractions.js +17 -11
  31. package/dist/collection/lib/interactions/mouseInteractions.js.map +1 -1
  32. package/dist/components/index.js +1 -1
  33. package/dist/components/{p-COS1Inc5.js → p-BQV-PVa_.js} +2 -2
  34. package/dist/components/p-BQV-PVa_.js.map +1 -0
  35. package/dist/components/p-CAQf9dsL.js +5 -0
  36. package/dist/components/p-CAQf9dsL.js.map +1 -0
  37. package/dist/components/{p-CEXF82El.js → p-CKQId0I1.js} +2 -2
  38. package/dist/components/p-CKQId0I1.js.map +1 -0
  39. package/dist/components/{p-CEHeeaoZ.js → p-CUGGgEIf.js} +2 -2
  40. package/dist/components/{p-CWieLCfP.js → p-CoCastpC.js} +2 -2
  41. package/dist/components/{p-BNHniQXm.js → p-ae0Zapzr.js} +2 -2
  42. package/dist/components/p-ae0Zapzr.js.map +1 -0
  43. package/dist/components/vertex-scene-tree-table-layout.js +1 -1
  44. package/dist/components/vertex-scene-tree.js +1 -1
  45. package/dist/components/vertex-scene-tree.js.map +1 -1
  46. package/dist/components/vertex-viewer-dom-renderer.js +1 -1
  47. package/dist/components/vertex-viewer-pin-group.js +1 -1
  48. package/dist/components/vertex-viewer-pin-label.js +1 -1
  49. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  50. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  51. package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
  52. package/dist/components/vertex-viewer-view-cube.js +1 -1
  53. package/dist/components/vertex-viewer.js +1 -1
  54. package/dist/components/vertex-viewer.js.map +1 -1
  55. package/dist/esm/{controller-zACO6f4n.js → controller-DCFz4xj6.js} +3 -3
  56. package/dist/esm/{controller-zACO6f4n.js.map → controller-DCFz4xj6.js.map} +1 -1
  57. package/dist/esm/index.js +1 -1
  58. package/dist/esm/index.mjs +1 -1
  59. package/dist/esm/loader.js +1 -1
  60. package/dist/esm/loader.mjs +1 -1
  61. package/dist/esm/{multiElementInteractionHandler-CJhrgviV.js → multiElementInteractionHandler-DjlrKVbu.js} +14 -11
  62. package/dist/esm/multiElementInteractionHandler-DjlrKVbu.js.map +1 -0
  63. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +20 -11
  64. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  65. package/dist/esm/vertex-scene-tree.entry.js +19 -6
  66. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  67. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  68. package/dist/esm/vertex-viewer-pin-group.entry.js +8 -6
  69. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  70. package/dist/esm/vertex-viewer-pin-label_2.entry.js +6 -6
  71. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  72. package/dist/esm/vertex-viewer-transform-widget.entry.js +5 -5
  73. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  74. package/dist/esm/vertex-viewer.entry.js +18 -12
  75. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  76. package/dist/esm/viewer.js +1 -1
  77. package/dist/types/components/scene-tree/scene-tree.d.ts +2 -0
  78. package/dist/types/components/scene-tree-table-layout/scene-tree-table-layout.d.ts +2 -0
  79. package/dist/types/components/viewer-pin-group/viewer-pin-group.d.ts +1 -0
  80. package/dist/types/components/viewer-transform-widget/viewer-transform-widget.d.ts +1 -1
  81. package/dist/types/lib/interactions/baseInteractionHandler.d.ts +1 -1
  82. package/dist/types/lib/interactions/mouseInteractions.d.ts +8 -2
  83. package/dist/viewer/index.esm.js +1 -1
  84. package/dist/viewer/p-07214ba9.entry.js +5 -0
  85. package/dist/viewer/p-07214ba9.entry.js.map +1 -0
  86. package/dist/viewer/p-1a463ace.entry.js +5 -0
  87. package/dist/viewer/p-1a463ace.entry.js.map +1 -0
  88. package/dist/viewer/p-9c18d87a.entry.js +5 -0
  89. package/dist/viewer/p-9c18d87a.entry.js.map +1 -0
  90. package/dist/viewer/{p-D4lmv56q.js → p-Dg5Yw3qK.js} +2 -2
  91. package/dist/viewer/{p-D4lmv56q.js.map → p-Dg5Yw3qK.js.map} +1 -1
  92. package/dist/viewer/{p-DkLznn4v.js → p-DwjktKp5.js} +2 -2
  93. package/dist/viewer/p-DwjktKp5.js.map +1 -0
  94. package/dist/viewer/{p-dcaf1cb9.entry.js → p-b8d8d308.entry.js} +2 -2
  95. package/dist/viewer/p-d26d4b99.entry.js +5 -0
  96. package/dist/viewer/{p-76cf5c2a.entry.js.map → p-d26d4b99.entry.js.map} +1 -1
  97. package/dist/viewer/{p-d4d044fc.entry.js → p-daecf887.entry.js} +2 -2
  98. package/dist/viewer/p-daecf887.entry.js.map +1 -0
  99. package/dist/viewer/{p-0cbadaa8.entry.js → p-fe2fdc83.entry.js} +2 -2
  100. package/dist/viewer/p-fe2fdc83.entry.js.map +1 -0
  101. package/dist/viewer/viewer.esm.js +1 -1
  102. package/package.json +7 -7
  103. package/dist/cjs/multiElementInteractionHandler-CV_R_zWs.js.map +0 -1
  104. package/dist/components/p-BNHniQXm.js.map +0 -1
  105. package/dist/components/p-BzhmEGZ5.js +0 -5
  106. package/dist/components/p-BzhmEGZ5.js.map +0 -1
  107. package/dist/components/p-CEXF82El.js.map +0 -1
  108. package/dist/components/p-COS1Inc5.js.map +0 -1
  109. package/dist/esm/multiElementInteractionHandler-CJhrgviV.js.map +0 -1
  110. package/dist/viewer/p-0cbadaa8.entry.js.map +0 -1
  111. package/dist/viewer/p-19c5eeaf.entry.js +0 -5
  112. package/dist/viewer/p-19c5eeaf.entry.js.map +0 -1
  113. package/dist/viewer/p-1a82245e.entry.js +0 -5
  114. package/dist/viewer/p-1a82245e.entry.js.map +0 -1
  115. package/dist/viewer/p-5ccf054e.entry.js +0 -5
  116. package/dist/viewer/p-5ccf054e.entry.js.map +0 -1
  117. package/dist/viewer/p-76cf5c2a.entry.js +0 -5
  118. package/dist/viewer/p-DkLznn4v.js.map +0 -1
  119. package/dist/viewer/p-d4d044fc.entry.js.map +0 -1
  120. /package/dist/components/{p-CEHeeaoZ.js.map → p-CUGGgEIf.js.map} +0 -0
  121. /package/dist/components/{p-CWieLCfP.js.map → p-CoCastpC.js.map} +0 -0
  122. /package/dist/viewer/{p-dcaf1cb9.entry.js.map → p-b8d8d308.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-transform-widget.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n} from '../../lib/types';\nimport { ModifierKey } from '../../lib/types/keys';\nimport { focusInputElement } from './dom';\nimport {\n calculateNewRotationAngle,\n computeHandleDeltaTransform,\n computeInputDeltaTransform,\n computeInputDisplayValue,\n computeInputPosition,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n PointAndPlacement,\n} from './util';\nimport {\n TransformWidgetInput,\n TransformWidgetInputWrapper,\n} from './viewer-transform-widget-components';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * Determines whether the xy-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xyTranslationDisabled = false;\n\n /**\n * Determines whether the xz-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xzTranslationDisabled = false;\n\n /**\n * Determines whether the yz-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yzTranslationDisabled = false;\n\n /**\n * Whether to show inputs beside the widget handles when they are interacted with.\n * Defaults to `true`.\n */\n @Prop()\n public showInputs = true;\n\n /**\n * The unit to show for translation inputs. Defaults to `millimeters`.\n *\n * @see DistanceUnitType\n */\n @Prop()\n public distanceUnit: DistanceUnitType = 'millimeters';\n\n /**\n * The unit to show for rotation inputs. Defaults to `degrees`.\n *\n * @see AngleUnitType\n */\n @Prop()\n public angleUnit: AngleUnitType = 'degrees';\n\n /**\n * The number of decimal places to show in the input. Defaults to `1`.\n */\n @Prop()\n public decimalPlaces = 1;\n\n /**\n * When defined, the widget will snap to the degree of the nearest multiple of\n * the given number when the user is rotating with the widget and holding the\n * key defined by rotationSnapKey. Defaults to undefined.\n */\n @Prop()\n public rotationSnapDegrees?: number;\n\n /**\n * When rotationSnapDegrees is defined, the widget will snap to the degree of the\n * nearest multiple of the given number when the user is rotating with the widget\n * and holding the key defined here. Defaults to the shift key.\n */\n @Prop()\n public rotationSnapKey: ModifierKey = 'shift';\n\n /**\n * Scalar to increase the size of the translation handles of this widget.\n * Values above zero and below three will result in the best visual representation\n * of the handles, and values above three may produce unexpected results.\n *\n * Defaults to `1`.\n */\n @Prop()\n public translationHandleScalar = 1;\n\n /**\n * Scalar to increase the size of the rotation handles of this widget.\n * Values above zero and below three will result in the best visual representation\n * of the handles, and values above three may produce unexpected results.\n *\n * Defaults to `1`.\n */\n @Prop()\n public rotationHandleScalar = 1;\n\n /**\n * Specifies the frequency, in milliseconds, to update the transform while interacting with the widget.\n *\n * This delay is used to group events happening in quick succession and results in smoother\n * widget movement.\n */\n @Prop()\n public interactionThrottle = 75;\n\n /**\n * **EXPERIMENTAL.**\n *\n * Enables Command+Z and Control+Z keybindings to perform an undo of\n * the previous delta transformation.\n *\n * @see `EXPERIMENTAL_undo`\n */\n @Prop()\n public EXPERIMENTAL_undoKeybindings = false;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @State()\n protected inputPosition?: PointAndPlacement;\n\n @State()\n protected inputValue = 0;\n\n @State()\n protected isEndingTransform = false;\n\n @State()\n protected inputShouldFocus = false;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n private dragStartTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private twoAxesSquareColor: Color.Color | string = '#e0e0e0';\n private hoveredColor: Color.Color | string = '#ffff00';\n\n private widget?: TransformWidget;\n private lastDragged?: Drawable;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n private lastInputValue?: number;\n\n private canvasBounds?: DOMRect;\n private inputBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private inputResizeObserver?: ResizeObserver;\n private hostStyleObserver?: MutationObserver;\n private canvasRef?: HTMLCanvasElement;\n private inputWrapperRef?: HTMLDivElement;\n private inputRef?: HTMLInputElement;\n\n private hoveredChangeDisposable?: Disposable;\n\n private interactionTimer?: number;\n private lastMouseEvent?: PointerEvent;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n this.inputResizeObserver = new ResizeObserver(this.handleInputResize);\n this.hostStyleObserver = new MutationObserver(this.handleStyleChange);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.hostStyleObserver.observe(this.hostEl, {\n attributes: true,\n attributeFilter: ['style'],\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n this.handleStyleChange();\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n this.inputResizeObserver?.disconnect();\n this.hostStyleObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n protected componentDidRender(): void {\n if (this.inputShouldFocus && this.inputRef != null) {\n focusInputElement(this.inputRef);\n this.inputShouldFocus = false;\n }\n }\n\n /**\n * **EXPERIMENTAL.**\n *\n * Performs an undo of the most recent set of transform manipulations,\n * categorized by the last pause in interactivity (pointerup on a handle,\n * Enter press on an input, keyup on an input).\n *\n * Note that this *does not* work repeatedly. I.e. only one undo can be\n * performed, and once another set of transform manipulations is performed,\n * the history is lost.\n */\n @Method()\n public async EXPERIMENTAL_undo(): Promise<void> {\n const undoDelta = await this.controller?.EXPERIMENTAL_undoTransform();\n\n if (this.currentTransform != null && undoDelta != null) {\n this.currentTransform = Matrix4.multiply(\n undoDelta,\n this.currentTransform\n );\n\n this.widget?.updateTransform(this.currentTransform);\n\n this.updateInputPosition();\n this.updateInputValue();\n this.lastInputValue = this.inputValue;\n\n this.position = Vector3.fromMatrixPosition(this.currentTransform);\n this.rotation = Euler.fromRotationMatrix(this.currentTransform);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xyTranslationDisabled')\n @Watch('xzTranslationDisabled')\n @Watch('yzTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.widget?.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('translationHandleScalar')\n @Watch('rotationHandleScalar')\n protected handleTransformHandleScalarChanged(): void {\n const effectiveArrowScalar = this.getTranslationScalar();\n const effectiveSquareScalar = this.getRotationScalar();\n\n this.widget?.updateScalars({\n xTranslation: effectiveArrowScalar,\n yTranslation: effectiveArrowScalar,\n zTranslation: effectiveArrowScalar,\n xyTranslation: effectiveSquareScalar,\n xzTranslation: effectiveSquareScalar,\n yzTranslation: effectiveSquareScalar,\n xRotation: effectiveSquareScalar,\n yRotation: effectiveSquareScalar,\n zRotation: effectiveSquareScalar,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation?: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n const rotationToApply = newRotation ?? Euler.create();\n\n this.currentTransform = this.getTransformForNewRotation(rotationToApply);\n this.startingTransform = this.currentTransform;\n\n // If the removal of the previous rotation above results in an identity matrix,\n // clear the transformation on the widget to prevent it from appearing at the origin.\n if (\n newRotation == null &&\n this.currentTransform != null &&\n Matrix4.isIdentity(this.currentTransform)\n ) {\n this.currentTransform = undefined;\n this.startingTransform = this.currentTransform;\n }\n\n this.widget?.updateTransform(this.currentTransform);\n\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.lastDragged = undefined;\n this.inputPosition = undefined;\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n /**\n * @ignore\n */\n @Watch('distanceUnit')\n @Watch('angleUnit')\n @Watch('decimalPlaces')\n protected handleInputFormattingChanged(): void {\n this.updateInputValue();\n this.lastInputValue = this.inputValue;\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n tabindex=\"0\"\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n onKeyDown={this.handleKeyDown}\n />\n\n {this.showInputs && this.inputPosition && this.viewer?.viewport && (\n <TransformWidgetInputWrapper\n ref={(el) => {\n if (el != null) {\n this.inputResizeObserver?.observe(el);\n } else if (this.inputRef != null) {\n this.inputResizeObserver?.unobserve(this.inputRef);\n }\n this.inputWrapperRef = el;\n }}\n bounds={this.inputBounds}\n viewport={this.viewer.viewport}\n point={this.inputPosition.point}\n placement={this.inputPosition.placement}\n displayUnit={this.getDisplayedUnits()}\n >\n <TransformWidgetInput\n ref={(el) => {\n this.inputRef = el;\n }}\n identifier={\n this.dragging?.identifier ?? this.lastDragged?.identifier\n }\n disabled={this.isEndingTransform}\n onChange={this.handleInputChange}\n onIncrement={() => this.handleInputStep(1)}\n onDecrement={() => this.handleInputStep(-1)}\n onBlur={() => {\n this.inputShouldFocus = false;\n }}\n onUndo={\n this.EXPERIMENTAL_undoKeybindings\n ? () => this.EXPERIMENTAL_undo()\n : undefined\n }\n />\n </TransformWidgetInputWrapper>\n )}\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handleInputResize = (): void => {\n if (this.inputWrapperRef != null) {\n const wrapperElement = this.inputWrapperRef;\n\n readDOM(() => {\n this.inputBounds = wrapperElement.getBoundingClientRect();\n });\n }\n };\n\n private handleStyleChange = (): void => {\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.twoAxesSquareColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-two-axes-square-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n\n this.getTransformWidget().updateColors({\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n twoAxesSquare: this.twoAxesSquareColor,\n hovered: this.hoveredColor,\n });\n });\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n if (this.dragging.identifier !== this.lastDragged?.identifier) {\n this.inputValue = 0;\n this.dragStartTransform = this.currentTransform;\n this.updateInputPosition();\n this.updateInputValue();\n }\n this.lastDragged = undefined;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDragWithTimer);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDragWithTimer = async (event: PointerEvent): Promise<void> => {\n if (event != null) {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n this.lastMouseEvent = event;\n }\n\n if (this.interactionTimer == null) {\n this.interactionTimer = window.setTimeout(async () => {\n this.interactionTimer = undefined;\n await this.handleDrag();\n this.lastMouseEvent = undefined;\n }, this.interactionThrottle);\n }\n };\n\n private handleDrag = async (): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null &&\n this.lastMouseEvent != null\n ) {\n // Begin the transform on the first `pointermove` event as opposed to the\n // `pointerdown` to prevent accidental no-op transforms (identity matrix).\n await this.controller?.beginTransform();\n\n const currentCanvas = convertPointToCanvas(\n Point.create(this.lastMouseEvent.clientX, this.lastMouseEvent.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n const angleToUse = calculateNewRotationAngle(\n this.lastMouseEvent,\n this.rotationSnapKey,\n angle,\n this.lastAngle,\n this.getDisplayedAngle(),\n this.rotationSnapDegrees\n );\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angleToUse - this.lastAngle\n );\n\n this.updateInputPosition();\n this.updateInputValue();\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angleToUse;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n this.lastDragged = this.dragging;\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.lastAngle = 0;\n\n this.updateInputPosition();\n this.updateInputValue();\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n this.beginEndTransform();\n\n window.removeEventListener('pointermove', this.handleDragWithTimer);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.completeEndTransform();\n };\n\n private handleInputStep = async (step: number): Promise<void> => {\n if (this.inputValue != null && this.lastInputValue != null) {\n // If modifying angle units, we want to adjust the step to always\n // perform the equivalent of a 1 degree rotation.\n if (this.isModifyingAngleUnits()) {\n const angles = new AngleUnits(this.angleUnit);\n const previous = angles.convertFrom(this.lastInputValue);\n const next = Angle.normalizeRadians(previous + Angle.toRadians(step));\n\n this.inputValue = angles.convertTo(next);\n } else {\n this.inputValue = this.lastInputValue + step;\n }\n await this.updateTransformFromInput(this.inputValue);\n }\n };\n\n private handleInputChange = async (value: number): Promise<void> => {\n await this.updateTransformFromInput(value);\n };\n\n private handleKeyDown = async (event: KeyboardEvent): Promise<void> => {\n const commandOrControlModifier = event.ctrlKey || event.metaKey;\n\n if (\n event.key === 'z' &&\n commandOrControlModifier &&\n this.EXPERIMENTAL_undoKeybindings\n ) {\n event.stopPropagation();\n await this.EXPERIMENTAL_undo();\n }\n };\n\n private updateTransformFromInput = async (value: number): Promise<void> => {\n if (\n this.lastDragged != null &&\n this.currentTransform != null &&\n this.startingTransform != null &&\n this.lastInputValue != null\n ) {\n this.currentTransform = computeInputDeltaTransform(\n this.currentTransform,\n this.lastDragged.identifier,\n value,\n this.lastInputValue,\n this.distanceUnit,\n this.angleUnit\n );\n\n this.updateInputValue();\n this.lastInputValue = value;\n\n await this.controller?.beginTransform();\n this.getTransformWidget().updateTransform(this.currentTransform);\n await this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n this.updateInputPosition();\n await this.controller?.endTransformDebounced(\n this.beginEndTransform,\n this.completeEndTransform\n );\n }\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n this.updateInputPosition();\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeHandleDeltaTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n const effectiveArrowScalar = this.getTranslationScalar();\n const effectiveSquareScalar = this.getRotationScalar();\n\n this.widget = new TransformWidget(canvasRef, {\n colors: {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n twoAxesSquare: this.twoAxesSquareColor,\n hovered: this.hoveredColor,\n },\n scalars: {\n xTranslation: effectiveArrowScalar,\n yTranslation: effectiveArrowScalar,\n zTranslation: effectiveArrowScalar,\n xyTranslation: effectiveSquareScalar,\n xzTranslation: effectiveSquareScalar,\n yzTranslation: effectiveSquareScalar,\n xRotation: effectiveSquareScalar,\n yRotation: effectiveSquareScalar,\n zRotation: effectiveSquareScalar,\n },\n });\n\n if (this.rotation != null) {\n this.currentTransform = this.getTransformForNewRotation(this.rotation);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n\n if (this.position != null) {\n this.currentTransform = this.getTransformForNewPosition(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private updateInputValue = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n const isDraggingTwoAxesTranslation =\n dragging?.identifier === 'xy-translate' ||\n dragging?.identifier === 'xz-translate' ||\n dragging?.identifier === 'yz-translate';\n\n if (\n dragging != null &&\n this.currentTransform != null &&\n this.dragStartTransform != null &&\n !isDraggingTwoAxesTranslation\n ) {\n this.lastInputValue = this.inputValue;\n\n this.inputValue = computeInputDisplayValue(\n dragging.identifier,\n this.currentTransform,\n this.dragStartTransform,\n this.distanceUnit,\n this.angleUnit\n );\n\n if (this.inputRef != null) {\n const definedValue =\n this.getDisplayedDistance() ?? this.getDisplayedAngle() ?? 0;\n const displayValue = `${parseFloat(\n definedValue.toFixed(this.decimalPlaces)\n )}`;\n\n this.inputRef.value = displayValue;\n }\n }\n };\n\n private updateInputPosition = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n\n const isDraggingTwoAxesTranslation =\n dragging?.identifier === 'xy-translate' ||\n dragging?.identifier === 'xz-translate' ||\n dragging?.identifier === 'yz-translate';\n\n if (\n this.showInputs &&\n this.viewer?.frame != null &&\n this.position != null &&\n dragging != null &&\n !isDraggingTwoAxesTranslation\n ) {\n const widget = this.getTransformWidget();\n const widgetBounds = widget.getFullBounds();\n\n this.inputPosition =\n widgetBounds != null\n ? computeInputPosition(\n this.viewer.viewport,\n widgetBounds,\n dragging.points.toArray()\n )\n : undefined;\n } else if (isDraggingTwoAxesTranslation) {\n this.inputPosition = undefined;\n }\n };\n\n private beginEndTransform = (): void => {\n const widget = this.getTransformWidget();\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n xyTranslation: true,\n xzTranslation: true,\n yzTranslation: true,\n });\n\n this.isEndingTransform = true;\n };\n\n private completeEndTransform = (): void => {\n const widget = this.getTransformWidget();\n\n widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n\n this.isEndingTransform = false;\n this.inputShouldFocus = true;\n\n if (this.currentTransform != null) {\n this.position = Vector3.fromMatrixPosition(this.currentTransform);\n this.rotation = Euler.fromRotationMatrix(this.currentTransform);\n }\n };\n\n private isModifyingAngleUnits = (): boolean => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n\n return !!draggingIdentifier?.includes('rotate');\n };\n\n private getTranslationScalar = (): number => {\n if (this.translationHandleScalar > 0) {\n return this.translationHandleScalar;\n }\n console.warn(\n 'Invalid value provided for translation-handle-scalar. Expected a positive value greater than zero.'\n );\n return 1;\n };\n\n private getRotationScalar = (): number => {\n if (this.rotationHandleScalar > 0) {\n return this.rotationHandleScalar;\n }\n console.warn(\n 'Invalid value provided for rotation-handle-scalar. Expected a positive value greater than zero.'\n );\n return 1;\n };\n\n private getDisplayedUnits = (): AngleUnits | DistanceUnits => {\n if (this.isModifyingAngleUnits()) {\n return new AngleUnits(this.angleUnit);\n }\n return new DistanceUnits(this.distanceUnit);\n };\n\n private getDisplayedAngle = (): number | undefined => {\n if (this.isModifyingAngleUnits()) {\n return this.inputValue;\n }\n };\n\n private getDisplayedDistance = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('translate')) {\n return this.inputValue;\n }\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n }\n };\n\n private getTransformForNewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"]}
1
+ {"version":3,"file":"viewer-transform-widget.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n} from '../../lib/types';\nimport { ModifierKey } from '../../lib/types/keys';\nimport { focusInputElement } from './dom';\nimport {\n calculateNewRotationAngle,\n computeHandleDeltaTransform,\n computeInputDeltaTransform,\n computeInputDisplayValue,\n computeInputPosition,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n PointAndPlacement,\n} from './util';\nimport {\n TransformWidgetInput,\n TransformWidgetInputWrapper,\n} from './viewer-transform-widget-components';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * Determines whether the xy-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xyTranslationDisabled = false;\n\n /**\n * Determines whether the xz-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xzTranslationDisabled = false;\n\n /**\n * Determines whether the yz-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yzTranslationDisabled = false;\n\n /**\n * Whether to show inputs beside the widget handles when they are interacted with.\n * Defaults to `true`.\n */\n @Prop()\n public showInputs = true;\n\n /**\n * The unit to show for translation inputs. Defaults to `millimeters`.\n *\n * @see DistanceUnitType\n */\n @Prop()\n public distanceUnit: DistanceUnitType = 'millimeters';\n\n /**\n * The unit to show for rotation inputs. Defaults to `degrees`.\n *\n * @see AngleUnitType\n */\n @Prop()\n public angleUnit: AngleUnitType = 'degrees';\n\n /**\n * The number of decimal places to show in the input. Defaults to `1`.\n */\n @Prop()\n public decimalPlaces = 1;\n\n /**\n * When defined, the widget will snap to the degree of the nearest multiple of\n * the given number when the user is rotating with the widget and holding the\n * key defined by rotationSnapKey. Defaults to undefined.\n */\n @Prop()\n public rotationSnapDegrees?: number;\n\n /**\n * When rotationSnapDegrees is defined, the widget will snap to the degree of the\n * nearest multiple of the given number when the user is rotating with the widget\n * and holding the key defined here. Defaults to the shift key.\n */\n @Prop()\n public rotationSnapKey: ModifierKey = 'shift';\n\n /**\n * Scalar to increase the size of the translation handles of this widget.\n * Values above zero and below three will result in the best visual representation\n * of the handles, and values above three may produce unexpected results.\n *\n * Defaults to `1`.\n */\n @Prop()\n public translationHandleScalar = 1;\n\n /**\n * Scalar to increase the size of the rotation handles of this widget.\n * Values above zero and below three will result in the best visual representation\n * of the handles, and values above three may produce unexpected results.\n *\n * Defaults to `1`.\n */\n @Prop()\n public rotationHandleScalar = 1;\n\n /**\n * Specifies the frequency, in milliseconds, to update the transform while interacting with the widget.\n *\n * This delay is used to group events happening in quick succession and results in smoother\n * widget movement.\n */\n @Prop()\n public interactionThrottle = 75;\n\n /**\n * **EXPERIMENTAL.**\n *\n * Enables Command+Z and Control+Z keybindings to perform an undo of\n * the previous delta transformation.\n *\n * @see `EXPERIMENTAL_undo`\n */\n @Prop()\n public EXPERIMENTAL_undoKeybindings = false;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @State()\n protected inputPosition?: PointAndPlacement;\n\n @State()\n protected inputValue = 0;\n\n @State()\n protected isEndingTransform = false;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n private dragStartTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private twoAxesSquareColor: Color.Color | string = '#e0e0e0';\n private hoveredColor: Color.Color | string = '#ffff00';\n\n private widget?: TransformWidget;\n private lastDragged?: Drawable;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n private lastInputValue?: number;\n\n private canvasBounds?: DOMRect;\n private inputBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private inputResizeObserver?: ResizeObserver;\n private hostStyleObserver?: MutationObserver;\n private canvasRef?: HTMLCanvasElement;\n private inputWrapperRef?: HTMLDivElement;\n private inputRef?: HTMLInputElement;\n private inputShouldFocus = false;\n\n private hoveredChangeDisposable?: Disposable;\n\n private interactionTimer?: number;\n private lastMouseEvent?: PointerEvent;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n this.inputResizeObserver = new ResizeObserver(this.handleInputResize);\n this.hostStyleObserver = new MutationObserver(this.handleStyleChange);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.hostStyleObserver.observe(this.hostEl, {\n attributes: true,\n attributeFilter: ['style'],\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n this.handleStyleChange();\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n this.inputResizeObserver?.disconnect();\n this.hostStyleObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n protected componentDidRender(): void {\n if (this.inputShouldFocus && this.inputRef != null) {\n focusInputElement(this.inputRef);\n this.inputShouldFocus = false;\n }\n }\n\n /**\n * **EXPERIMENTAL.**\n *\n * Performs an undo of the most recent set of transform manipulations,\n * categorized by the last pause in interactivity (pointerup on a handle,\n * Enter press on an input, keyup on an input).\n *\n * Note that this *does not* work repeatedly. I.e. only one undo can be\n * performed, and once another set of transform manipulations is performed,\n * the history is lost.\n */\n @Method()\n public async EXPERIMENTAL_undo(): Promise<void> {\n const undoDelta = await this.controller?.EXPERIMENTAL_undoTransform();\n\n if (this.currentTransform != null && undoDelta != null) {\n this.currentTransform = Matrix4.multiply(\n undoDelta,\n this.currentTransform\n );\n\n this.widget?.updateTransform(this.currentTransform);\n\n this.updateInputPosition();\n this.updateInputValue();\n this.lastInputValue = this.inputValue;\n\n this.position = Vector3.fromMatrixPosition(this.currentTransform);\n this.rotation = Euler.fromRotationMatrix(this.currentTransform);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xyTranslationDisabled')\n @Watch('xzTranslationDisabled')\n @Watch('yzTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.widget?.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('translationHandleScalar')\n @Watch('rotationHandleScalar')\n protected handleTransformHandleScalarChanged(): void {\n const effectiveArrowScalar = this.getTranslationScalar();\n const effectiveSquareScalar = this.getRotationScalar();\n\n this.widget?.updateScalars({\n xTranslation: effectiveArrowScalar,\n yTranslation: effectiveArrowScalar,\n zTranslation: effectiveArrowScalar,\n xyTranslation: effectiveSquareScalar,\n xzTranslation: effectiveSquareScalar,\n yzTranslation: effectiveSquareScalar,\n xRotation: effectiveSquareScalar,\n yRotation: effectiveSquareScalar,\n zRotation: effectiveSquareScalar,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation?: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n const rotationToApply = newRotation ?? Euler.create();\n\n this.currentTransform = this.getTransformForNewRotation(rotationToApply);\n this.startingTransform = this.currentTransform;\n\n // If the removal of the previous rotation above results in an identity matrix,\n // clear the transformation on the widget to prevent it from appearing at the origin.\n if (\n newRotation == null &&\n this.currentTransform != null &&\n Matrix4.isIdentity(this.currentTransform)\n ) {\n this.currentTransform = undefined;\n this.startingTransform = this.currentTransform;\n }\n\n this.widget?.updateTransform(this.currentTransform);\n\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.lastDragged = undefined;\n this.inputPosition = undefined;\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n /**\n * @ignore\n */\n @Watch('distanceUnit')\n @Watch('angleUnit')\n @Watch('decimalPlaces')\n protected handleInputFormattingChanged(): void {\n this.updateInputValue();\n this.lastInputValue = this.inputValue;\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n tabindex=\"0\"\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n onKeyDown={this.handleKeyDown}\n />\n\n {this.showInputs && this.inputPosition && this.viewer?.viewport && (\n <TransformWidgetInputWrapper\n ref={(el) => {\n if (el != null) {\n this.inputResizeObserver?.observe(el);\n } else if (this.inputWrapperRef != null) {\n this.inputResizeObserver?.unobserve(this.inputWrapperRef);\n }\n this.inputWrapperRef = el;\n }}\n bounds={this.inputBounds}\n viewport={this.viewer.viewport}\n point={this.inputPosition.point}\n placement={this.inputPosition.placement}\n displayUnit={this.getDisplayedUnits()}\n >\n <TransformWidgetInput\n ref={(el) => {\n this.inputRef = el;\n }}\n identifier={\n this.dragging?.identifier ?? this.lastDragged?.identifier\n }\n disabled={this.isEndingTransform}\n onChange={this.handleInputChange}\n onIncrement={() => this.handleInputStep(1)}\n onDecrement={() => this.handleInputStep(-1)}\n onBlur={() => {\n this.inputShouldFocus = false;\n }}\n onUndo={\n this.EXPERIMENTAL_undoKeybindings\n ? () => this.EXPERIMENTAL_undo()\n : undefined\n }\n />\n </TransformWidgetInputWrapper>\n )}\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handleInputResize = (): void => {\n if (this.inputWrapperRef != null) {\n const wrapperElement = this.inputWrapperRef;\n\n readDOM(() => {\n this.inputBounds = wrapperElement.getBoundingClientRect();\n });\n }\n };\n\n private handleStyleChange = (): void => {\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.twoAxesSquareColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-two-axes-square-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n\n this.getTransformWidget().updateColors({\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n twoAxesSquare: this.twoAxesSquareColor,\n hovered: this.hoveredColor,\n });\n });\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n if (this.dragging.identifier !== this.lastDragged?.identifier) {\n this.inputValue = 0;\n this.dragStartTransform = this.currentTransform;\n this.updateInputPosition();\n this.updateInputValue();\n }\n this.lastDragged = undefined;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDragWithTimer);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDragWithTimer = async (event: PointerEvent): Promise<void> => {\n if (event != null) {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n this.lastMouseEvent = event;\n }\n\n if (this.interactionTimer == null) {\n this.interactionTimer = window.setTimeout(async () => {\n this.interactionTimer = undefined;\n await this.handleDrag();\n this.lastMouseEvent = undefined;\n }, this.interactionThrottle);\n }\n };\n\n private handleDrag = async (): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null &&\n this.lastMouseEvent != null\n ) {\n // Begin the transform on the first `pointermove` event as opposed to the\n // `pointerdown` to prevent accidental no-op transforms (identity matrix).\n await this.controller?.beginTransform();\n\n const currentCanvas = convertPointToCanvas(\n Point.create(this.lastMouseEvent.clientX, this.lastMouseEvent.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n const angleToUse = calculateNewRotationAngle(\n this.lastMouseEvent,\n this.rotationSnapKey,\n angle,\n this.lastAngle,\n this.getDisplayedAngle(),\n this.rotationSnapDegrees\n );\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angleToUse - this.lastAngle\n );\n\n this.updateInputPosition();\n this.updateInputValue();\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angleToUse;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n this.lastDragged = this.dragging;\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.lastAngle = 0;\n\n this.updateInputPosition();\n this.updateInputValue();\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n this.beginEndTransform();\n\n window.removeEventListener('pointermove', this.handleDragWithTimer);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.completeEndTransform();\n };\n\n private handleInputStep = async (step: number): Promise<void> => {\n if (this.inputValue != null && this.lastInputValue != null) {\n // If modifying angle units, we want to adjust the step to always\n // perform the equivalent of a 1 degree rotation.\n if (this.isModifyingAngleUnits()) {\n const angles = new AngleUnits(this.angleUnit);\n const previous = angles.convertFrom(this.lastInputValue);\n const next = Angle.normalizeRadians(previous + Angle.toRadians(step));\n\n this.inputValue = angles.convertTo(next);\n } else {\n this.inputValue = this.lastInputValue + step;\n }\n await this.updateTransformFromInput(this.inputValue);\n }\n };\n\n private handleInputChange = async (value: number): Promise<void> => {\n await this.updateTransformFromInput(value);\n };\n\n private handleKeyDown = async (event: KeyboardEvent): Promise<void> => {\n const commandOrControlModifier = event.ctrlKey || event.metaKey;\n\n if (\n event.key === 'z' &&\n commandOrControlModifier &&\n this.EXPERIMENTAL_undoKeybindings\n ) {\n event.stopPropagation();\n await this.EXPERIMENTAL_undo();\n }\n };\n\n private updateTransformFromInput = async (value: number): Promise<void> => {\n if (\n this.lastDragged != null &&\n this.currentTransform != null &&\n this.startingTransform != null &&\n this.lastInputValue != null\n ) {\n this.currentTransform = computeInputDeltaTransform(\n this.currentTransform,\n this.lastDragged.identifier,\n value,\n this.lastInputValue,\n this.distanceUnit,\n this.angleUnit\n );\n\n this.updateInputValue();\n this.lastInputValue = value;\n\n await this.controller?.beginTransform();\n this.getTransformWidget().updateTransform(this.currentTransform);\n await this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n this.updateInputPosition();\n await this.controller?.endTransformDebounced(\n this.beginEndTransform,\n this.completeEndTransform\n );\n }\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n this.updateInputPosition();\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeHandleDeltaTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n const effectiveArrowScalar = this.getTranslationScalar();\n const effectiveSquareScalar = this.getRotationScalar();\n\n this.widget = new TransformWidget(canvasRef, {\n colors: {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n twoAxesSquare: this.twoAxesSquareColor,\n hovered: this.hoveredColor,\n },\n scalars: {\n xTranslation: effectiveArrowScalar,\n yTranslation: effectiveArrowScalar,\n zTranslation: effectiveArrowScalar,\n xyTranslation: effectiveSquareScalar,\n xzTranslation: effectiveSquareScalar,\n yzTranslation: effectiveSquareScalar,\n xRotation: effectiveSquareScalar,\n yRotation: effectiveSquareScalar,\n zRotation: effectiveSquareScalar,\n },\n });\n\n if (this.rotation != null) {\n this.currentTransform = this.getTransformForNewRotation(this.rotation);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n\n if (this.position != null) {\n this.currentTransform = this.getTransformForNewPosition(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private updateInputValue = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n const isDraggingTwoAxesTranslation =\n dragging?.identifier === 'xy-translate' ||\n dragging?.identifier === 'xz-translate' ||\n dragging?.identifier === 'yz-translate';\n\n if (\n dragging != null &&\n this.currentTransform != null &&\n this.dragStartTransform != null &&\n !isDraggingTwoAxesTranslation\n ) {\n this.lastInputValue = this.inputValue;\n\n this.inputValue = computeInputDisplayValue(\n dragging.identifier,\n this.currentTransform,\n this.dragStartTransform,\n this.distanceUnit,\n this.angleUnit\n );\n\n if (this.inputRef != null) {\n const definedValue =\n this.getDisplayedDistance() ?? this.getDisplayedAngle() ?? 0;\n const displayValue = `${parseFloat(\n definedValue.toFixed(this.decimalPlaces)\n )}`;\n\n this.inputRef.value = displayValue;\n }\n }\n };\n\n private updateInputPosition = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n\n const isDraggingTwoAxesTranslation =\n dragging?.identifier === 'xy-translate' ||\n dragging?.identifier === 'xz-translate' ||\n dragging?.identifier === 'yz-translate';\n\n if (\n this.showInputs &&\n this.viewer?.frame != null &&\n this.position != null &&\n dragging != null &&\n !isDraggingTwoAxesTranslation\n ) {\n const widget = this.getTransformWidget();\n const widgetBounds = widget.getFullBounds();\n\n this.inputPosition =\n widgetBounds != null\n ? computeInputPosition(\n this.viewer.viewport,\n widgetBounds,\n dragging.points.toArray()\n )\n : undefined;\n } else if (isDraggingTwoAxesTranslation) {\n this.inputPosition = undefined;\n }\n };\n\n private beginEndTransform = (): void => {\n const widget = this.getTransformWidget();\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n xyTranslation: true,\n xzTranslation: true,\n yzTranslation: true,\n });\n\n this.isEndingTransform = true;\n };\n\n private completeEndTransform = (): void => {\n const widget = this.getTransformWidget();\n\n widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n\n xyTranslation: this.xyTranslationDisabled,\n xzTranslation: this.xzTranslationDisabled,\n yzTranslation: this.yzTranslationDisabled,\n });\n\n this.isEndingTransform = false;\n this.inputShouldFocus = true;\n\n if (this.currentTransform != null) {\n this.position = Vector3.fromMatrixPosition(this.currentTransform);\n this.rotation = Euler.fromRotationMatrix(this.currentTransform);\n }\n };\n\n private isModifyingAngleUnits = (): boolean => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n\n return !!draggingIdentifier?.includes('rotate');\n };\n\n private getTranslationScalar = (): number => {\n if (this.translationHandleScalar > 0) {\n return this.translationHandleScalar;\n }\n console.warn(\n 'Invalid value provided for translation-handle-scalar. Expected a positive value greater than zero.'\n );\n return 1;\n };\n\n private getRotationScalar = (): number => {\n if (this.rotationHandleScalar > 0) {\n return this.rotationHandleScalar;\n }\n console.warn(\n 'Invalid value provided for rotation-handle-scalar. Expected a positive value greater than zero.'\n );\n return 1;\n };\n\n private getDisplayedUnits = (): AngleUnits | DistanceUnits => {\n if (this.isModifyingAngleUnits()) {\n return new AngleUnits(this.angleUnit);\n }\n return new DistanceUnits(this.distanceUnit);\n };\n\n private getDisplayedAngle = (): number | undefined => {\n if (this.isModifyingAngleUnits()) {\n return this.inputValue;\n }\n };\n\n private getDisplayedDistance = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('translate')) {\n return this.inputValue;\n }\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n }\n };\n\n private getTransformForNewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"]}
@@ -230,7 +230,7 @@ export class BaseInteractionHandler {
230
230
  this.draggingInteraction = undefined;
231
231
  }
232
232
  }
233
- async handleMouseWheel(event) {
233
+ handleMouseWheel(event) {
234
234
  event.preventDefault();
235
235
  if (this.element != null &&
236
236
  this.interactionApi != null &&
@@ -238,20 +238,23 @@ export class BaseInteractionHandler {
238
238
  const delta = -this.wheelDeltaToPixels(event.deltaY, event.deltaMode) / 10;
239
239
  const rect = this.element.getBoundingClientRect();
240
240
  const point = getMouseClientPosition(event, rect);
241
- if (Math.abs(event.deltaY) < 10) {
241
+ const scrollSize = Math.abs(event.deltaY);
242
+ if (scrollSize < 12) {
242
243
  // For small wheel movements, send a single zoom event.
243
- await this.zoomInteraction.zoomToPoint(point, delta, this.interactionApi);
244
+ void this.zoomInteraction.zoomToPoint(point, delta, this.interactionApi);
244
245
  }
245
246
  else {
246
- // For large wheel movements, divide the delta into 10 equal zoom events.
247
- // This results in a smoother zoom experience for the end user.
248
- for (let index = 1; index <= 10; index++) {
247
+ const divisions = Math.min(10, Math.ceil(scrollSize / 12));
248
+ const zoomDelta = delta / divisions;
249
+ // For larger wheel movements, divide the delta into multiple zoom events with increasing delay
250
+ // which approximates a smooth zoom deceleration curve for the end user.
251
+ for (let i = 1; i <= divisions; i++) {
252
+ const delayMs = i * 5;
249
253
  window.setTimeout(() => {
250
254
  if (this.interactionApi != null) {
251
- const zoomDelta = delta / 10;
252
- this.zoomInteraction.zoomToPoint(point, zoomDelta, this.interactionApi);
255
+ this.zoomInteraction.zoomToPoint(point, zoomDelta, this.interactionApi, delayMs);
253
256
  }
254
- }, index * 5);
257
+ }, delayMs);
255
258
  }
256
259
  }
257
260
  }
@@ -1 +1 @@
1
- {"version":3,"file":"baseInteractionHandler.js","sourceRoot":"","sources":["../../../../../src/lib/interactions/baseInteractionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { ConfigProvider } from '../config';\nimport { getMouseClientPosition } from '../dom';\nimport { InteractionApi } from './interactionApi';\nimport { BaseEvent } from './interactionEvent';\nimport { InteractionHandler } from './interactionHandler';\nimport {\n MouseInteraction,\n PanInteraction,\n PivotInteraction,\n RotateInteraction,\n RotatePointInteraction,\n TwistInteraction,\n ZoomInteraction,\n} from './mouseInteractions';\n\nexport type InteractionType =\n | 'rotate'\n | 'zoom'\n | 'pan'\n | 'twist'\n | 'rotate-point'\n | 'pivot';\n\nconst DEFAULT_FONT_SIZE = 16;\nconst DEFAULT_LINE_HEIGHT = 1.2;\n\nexport abstract class BaseInteractionHandler implements InteractionHandler {\n protected interactionApi?: InteractionApi;\n protected element?: HTMLElement;\n protected downPosition?: Point.Point;\n private downPositionCanvas?: Point.Point;\n private primaryInteraction: MouseInteraction;\n private currentInteraction?: MouseInteraction;\n private draggingInteraction: MouseInteraction | undefined;\n private lastPrimaryRotateInteraction?: MouseInteraction;\n private isDragging = false;\n private lastMoveEvent?: BaseEvent;\n private interactionTimer?: number;\n private keyboardControls = false;\n\n protected disableIndividualInteractions = false;\n\n private computedBodyStyle?: CSSStyleDeclaration;\n\n private primaryInteractionTypeChange = new EventDispatcher<void>();\n\n public constructor(\n protected downEvent: 'mousedown' | 'pointerdown',\n protected upEvent: 'mouseup' | 'pointerup',\n protected moveEvent: 'mousemove' | 'pointermove',\n private rotateInteraction: RotateInteraction,\n private rotatePointInteraction: RotatePointInteraction,\n private zoomInteraction: ZoomInteraction,\n private panInteraction: PanInteraction,\n private twistInteraction: TwistInteraction,\n private pivotInteraction: PivotInteraction,\n private getConfig: ConfigProvider\n ) {\n this.primaryInteraction = rotateInteraction;\n this.handleDownEvent = this.handleDownEvent.bind(this);\n this.handleMouseWheel = this.handleMouseWheel.bind(this);\n this.handleWindowMove = this.handleWindowMove.bind(this);\n this.handleWindowUp = this.handleWindowUp.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.interactionApi = api;\n element.addEventListener(this.downEvent, this.handleDownEvent);\n element.addEventListener('mousedown', this.handleDoubleClick);\n element.addEventListener('wheel', this.handleMouseWheel, {\n passive: false,\n });\n }\n\n public dispose(): void {\n this.element?.removeEventListener(this.downEvent, this.handleDownEvent);\n this.element?.removeEventListener('mousedown', this.handleDoubleClick);\n this.element?.removeEventListener('wheel', this.handleMouseWheel);\n this.element = undefined;\n }\n\n public onPrimaryInteractionTypeChange(listener: Listener<void>): Disposable {\n return this.primaryInteractionTypeChange.on(listener);\n }\n\n public setCurrentInteractionType(type?: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.currentInteraction = this.rotateInteraction;\n break;\n case 'zoom':\n this.currentInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.currentInteraction = this.panInteraction;\n break;\n case 'twist':\n this.currentInteraction = this.twistInteraction;\n break;\n case 'rotate-point':\n this.currentInteraction = this.rotatePointInteraction;\n break;\n case 'pivot':\n this.currentInteraction = this.pivotInteraction;\n break;\n default:\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction) {\n const point = this.draggingInteraction.getPosition();\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n this.interactionApi?.resetLastAngle();\n this.draggingInteraction.setPosition(point);\n }\n }\n\n public getPrimaryInteractionType(): InteractionType {\n return this.primaryInteraction.getType();\n }\n\n public getCurrentInteractionType(): InteractionType {\n return (this.currentInteraction || this.primaryInteraction).getType();\n }\n\n public setPrimaryInteractionType(type: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.primaryInteraction = this.rotateInteraction;\n this.lastPrimaryRotateInteraction = this.rotateInteraction;\n break;\n case 'rotate-point':\n this.primaryInteraction = this.rotatePointInteraction;\n this.lastPrimaryRotateInteraction = this.rotatePointInteraction;\n break;\n case 'zoom':\n this.primaryInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.primaryInteraction = this.panInteraction;\n break;\n case 'pivot':\n this.primaryInteraction = this.pivotInteraction;\n break;\n }\n this.primaryInteractionTypeChange.emit();\n }\n\n public setDefaultKeyboardControls(keyboardControls: boolean): void {\n this.keyboardControls = keyboardControls;\n }\n\n protected handleDownEvent(event: BaseEvent): void {\n // Prevent selection of any text while interacting with the model.\n event.preventDefault();\n\n this.interactionTimer = window.setTimeout(() => {\n this.downPosition = Point.create(event.screenX, event.screenY);\n this.downPositionCanvas = this.getCanvasPosition(event);\n this.interactionTimer = undefined;\n\n // Perform the current movement in the case that the interaction timer elapses\n if (this.lastMoveEvent != null) {\n this.handleWindowMove(this.lastMoveEvent);\n }\n }, this.getConfig().interactions.interactionDelay);\n\n window.addEventListener(this.moveEvent, this.handleWindowMove);\n window.addEventListener(this.upEvent, this.handleWindowUp);\n }\n\n protected handleWindowMove(event: BaseEvent): void {\n if (this.interactionTimer == null) {\n if (this.disableIndividualInteractions) {\n return;\n }\n\n const position = Point.create(event.screenX, event.screenY);\n const pixelThreshold =\n this.interactionApi != null\n ? this.interactionApi.pixelThreshold(this.isTouch(event))\n : 2;\n if (\n this.downPosition != null &&\n Point.distance(position, this.downPosition) >= pixelThreshold &&\n !this.isDragging\n ) {\n this.beginDrag(event);\n this.isDragging = true;\n }\n\n if (this.isDragging) {\n this.drag(event);\n }\n }\n\n this.lastMoveEvent = event;\n }\n\n protected async handleWindowUp(event: BaseEvent): Promise<void> {\n if (this.isDragging) {\n this.endDrag(event);\n this.isDragging = false;\n }\n\n if (this.interactionTimer != null) {\n window.clearTimeout(this.interactionTimer);\n this.interactionTimer = undefined;\n }\n\n window.removeEventListener(this.moveEvent, this.handleWindowMove);\n window.removeEventListener(this.upEvent, this.handleWindowUp);\n this.lastMoveEvent = undefined;\n }\n\n protected async handleDoubleClick(event: BaseEvent): Promise<void> {\n // event.detail is the number of clicks that have happened recently. If the number is 2, then the user double clicked.\n if (\n event.detail === 2 &&\n event.buttons === 4 &&\n this.interactionApi != null\n ) {\n await this.interactionApi.viewAll();\n }\n }\n\n protected beginDrag(event: BaseEvent): void {\n if (this.keyboardControls && event.metaKey && event.shiftKey) {\n this.currentInteraction = this.rotatePointInteraction;\n } else if (this.keyboardControls && event.shiftKey && event.altKey) {\n this.currentInteraction = this.twistInteraction;\n } else if (this.keyboardControls && event.shiftKey) {\n this.currentInteraction = this.zoomInteraction;\n } else if (this.keyboardControls && (event.metaKey || event.ctrlKey)) {\n this.currentInteraction = this.panInteraction;\n } else if (this.keyboardControls && event.altKey) {\n this.currentInteraction = this.rotateInteraction;\n }\n\n if (event.buttons === 1) {\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n } else if (event.buttons === 2) {\n this.draggingInteraction = this.panInteraction;\n } else if (event.buttons === 4) {\n this.draggingInteraction =\n this.lastPrimaryRotateInteraction ?? this.rotateInteraction;\n }\n\n if (\n this.draggingInteraction != null &&\n this.interactionApi != null &&\n this.element != null\n ) {\n // Ensure any scroll wheel interactions have been ended prior to beginning\n // another interaction to prevent the interaction from being ended early.\n this.zoomInteraction.endDrag(event, this.interactionApi);\n\n this.draggingInteraction.beginDrag(\n event,\n this.downPositionCanvas || Point.create(event.clientX, event.clientY),\n this.interactionApi,\n this.element\n );\n }\n }\n\n protected drag(event: BaseEvent): void {\n if (this.keyboardControls && event.altKey && event.shiftKey) {\n this.currentInteraction = this.twistInteraction;\n } else {\n this.currentInteraction = undefined;\n }\n this.draggingInteraction =\n this.currentInteraction ||\n this.draggingInteraction ||\n this.primaryInteraction;\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.drag(event, this.interactionApi);\n }\n }\n\n protected endDrag(event: BaseEvent): void {\n if (\n this.keyboardControls &&\n this.currentInteraction === this.twistInteraction\n ) {\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.endDrag(event, this.interactionApi);\n this.draggingInteraction = undefined;\n }\n }\n\n protected async handleMouseWheel(event: WheelEvent): Promise<void> {\n event.preventDefault();\n\n if (\n this.element != null &&\n this.interactionApi != null &&\n event.buttons !== 4\n ) {\n const delta =\n -this.wheelDeltaToPixels(event.deltaY, event.deltaMode) / 10;\n const rect = this.element.getBoundingClientRect();\n const point = getMouseClientPosition(event, rect);\n\n if (Math.abs(event.deltaY) < 10) {\n // For small wheel movements, send a single zoom event.\n await this.zoomInteraction.zoomToPoint(\n point,\n delta,\n this.interactionApi\n );\n } else {\n // For large wheel movements, divide the delta into 10 equal zoom events.\n // This results in a smoother zoom experience for the end user.\n for (let index = 1; index <= 10; index++) {\n window.setTimeout(() => {\n if (this.interactionApi != null) {\n const zoomDelta = delta / 10;\n this.zoomInteraction.zoomToPoint(\n point,\n zoomDelta,\n this.interactionApi\n );\n }\n }, index * 5);\n }\n }\n }\n }\n\n protected wheelDeltaToPixels(deltaY: number, deltaMode: number): number {\n if (this.computedBodyStyle == null) {\n this.computedBodyStyle = window.getComputedStyle(document.body);\n }\n\n const defaultLineHeight =\n this.computedBodyStyle.getPropertyValue('fontSize') != null &&\n this.computedBodyStyle.getPropertyValue('fontSize') !== '' &&\n !isNaN(parseFloat(this.computedBodyStyle.getPropertyValue('fontSize')))\n ? parseFloat(this.computedBodyStyle.getPropertyValue('fontSize')) *\n DEFAULT_LINE_HEIGHT\n : DEFAULT_FONT_SIZE * DEFAULT_LINE_HEIGHT;\n\n if (deltaMode === 1) {\n // deltaMode 1 corresponds to DOM_DELTA_LINE, which computes deltas in lines\n return this.computedBodyStyle.getPropertyValue('lineHeight') != null &&\n this.computedBodyStyle.getPropertyValue('lineHeight') !== '' &&\n !isNaN(\n parseFloat(this.computedBodyStyle.getPropertyValue('lineHeight'))\n )\n ? deltaY *\n parseFloat(this.computedBodyStyle.getPropertyValue('lineHeight'))\n : deltaY * defaultLineHeight;\n } else if (deltaMode === 2) {\n // deltaMode 2 corresponds to DOM_DELTA_PAGE, which computes deltas in pages\n return this.computedBodyStyle.getPropertyValue('height') != null &&\n this.computedBodyStyle.getPropertyValue('height') !== '' &&\n !isNaN(parseFloat(this.computedBodyStyle.getPropertyValue('height')))\n ? deltaY * parseFloat(this.computedBodyStyle.getPropertyValue('height'))\n : deltaY * window.innerHeight;\n }\n // deltaMode 0 corresponds to DOM_DELTA_PIXEL, which computes deltas in pixels\n return deltaY;\n }\n\n protected getCanvasPosition(event: BaseEvent): Point.Point | undefined {\n const canvasBounds = this.element?.getBoundingClientRect();\n const canvasOffset =\n canvasBounds != null\n ? Point.create(canvasBounds.left, canvasBounds.top)\n : undefined;\n\n return canvasOffset != null\n ? Point.subtract(Point.create(event.clientX, event.clientY), canvasOffset)\n : undefined;\n }\n\n protected isTouch(event: BaseEvent): boolean {\n return window.PointerEvent != null && event instanceof PointerEvent\n ? event.pointerType === 'touch'\n : false;\n }\n}\n"]}
1
+ {"version":3,"file":"baseInteractionHandler.js","sourceRoot":"","sources":["../../../../../src/lib/interactions/baseInteractionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { ConfigProvider } from '../config';\nimport { getMouseClientPosition } from '../dom';\nimport { InteractionApi } from './interactionApi';\nimport { BaseEvent } from './interactionEvent';\nimport { InteractionHandler } from './interactionHandler';\nimport {\n MouseInteraction,\n PanInteraction,\n PivotInteraction,\n RotateInteraction,\n RotatePointInteraction,\n TwistInteraction,\n ZoomInteraction,\n} from './mouseInteractions';\n\nexport type InteractionType =\n | 'rotate'\n | 'zoom'\n | 'pan'\n | 'twist'\n | 'rotate-point'\n | 'pivot';\n\nconst DEFAULT_FONT_SIZE = 16;\nconst DEFAULT_LINE_HEIGHT = 1.2;\n\nexport abstract class BaseInteractionHandler implements InteractionHandler {\n protected interactionApi?: InteractionApi;\n protected element?: HTMLElement;\n protected downPosition?: Point.Point;\n private downPositionCanvas?: Point.Point;\n private primaryInteraction: MouseInteraction;\n private currentInteraction?: MouseInteraction;\n private draggingInteraction: MouseInteraction | undefined;\n private lastPrimaryRotateInteraction?: MouseInteraction;\n private isDragging = false;\n private lastMoveEvent?: BaseEvent;\n private interactionTimer?: number;\n private keyboardControls = false;\n\n protected disableIndividualInteractions = false;\n\n private computedBodyStyle?: CSSStyleDeclaration;\n\n private primaryInteractionTypeChange = new EventDispatcher<void>();\n\n public constructor(\n protected downEvent: 'mousedown' | 'pointerdown',\n protected upEvent: 'mouseup' | 'pointerup',\n protected moveEvent: 'mousemove' | 'pointermove',\n private rotateInteraction: RotateInteraction,\n private rotatePointInteraction: RotatePointInteraction,\n private zoomInteraction: ZoomInteraction,\n private panInteraction: PanInteraction,\n private twistInteraction: TwistInteraction,\n private pivotInteraction: PivotInteraction,\n private getConfig: ConfigProvider\n ) {\n this.primaryInteraction = rotateInteraction;\n this.handleDownEvent = this.handleDownEvent.bind(this);\n this.handleMouseWheel = this.handleMouseWheel.bind(this);\n this.handleWindowMove = this.handleWindowMove.bind(this);\n this.handleWindowUp = this.handleWindowUp.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.interactionApi = api;\n element.addEventListener(this.downEvent, this.handleDownEvent);\n element.addEventListener('mousedown', this.handleDoubleClick);\n element.addEventListener('wheel', this.handleMouseWheel, {\n passive: false,\n });\n }\n\n public dispose(): void {\n this.element?.removeEventListener(this.downEvent, this.handleDownEvent);\n this.element?.removeEventListener('mousedown', this.handleDoubleClick);\n this.element?.removeEventListener('wheel', this.handleMouseWheel);\n this.element = undefined;\n }\n\n public onPrimaryInteractionTypeChange(listener: Listener<void>): Disposable {\n return this.primaryInteractionTypeChange.on(listener);\n }\n\n public setCurrentInteractionType(type?: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.currentInteraction = this.rotateInteraction;\n break;\n case 'zoom':\n this.currentInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.currentInteraction = this.panInteraction;\n break;\n case 'twist':\n this.currentInteraction = this.twistInteraction;\n break;\n case 'rotate-point':\n this.currentInteraction = this.rotatePointInteraction;\n break;\n case 'pivot':\n this.currentInteraction = this.pivotInteraction;\n break;\n default:\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction) {\n const point = this.draggingInteraction.getPosition();\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n this.interactionApi?.resetLastAngle();\n this.draggingInteraction.setPosition(point);\n }\n }\n\n public getPrimaryInteractionType(): InteractionType {\n return this.primaryInteraction.getType();\n }\n\n public getCurrentInteractionType(): InteractionType {\n return (this.currentInteraction || this.primaryInteraction).getType();\n }\n\n public setPrimaryInteractionType(type: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.primaryInteraction = this.rotateInteraction;\n this.lastPrimaryRotateInteraction = this.rotateInteraction;\n break;\n case 'rotate-point':\n this.primaryInteraction = this.rotatePointInteraction;\n this.lastPrimaryRotateInteraction = this.rotatePointInteraction;\n break;\n case 'zoom':\n this.primaryInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.primaryInteraction = this.panInteraction;\n break;\n case 'pivot':\n this.primaryInteraction = this.pivotInteraction;\n break;\n }\n this.primaryInteractionTypeChange.emit();\n }\n\n public setDefaultKeyboardControls(keyboardControls: boolean): void {\n this.keyboardControls = keyboardControls;\n }\n\n protected handleDownEvent(event: BaseEvent): void {\n // Prevent selection of any text while interacting with the model.\n event.preventDefault();\n\n this.interactionTimer = window.setTimeout(() => {\n this.downPosition = Point.create(event.screenX, event.screenY);\n this.downPositionCanvas = this.getCanvasPosition(event);\n this.interactionTimer = undefined;\n\n // Perform the current movement in the case that the interaction timer elapses\n if (this.lastMoveEvent != null) {\n this.handleWindowMove(this.lastMoveEvent);\n }\n }, this.getConfig().interactions.interactionDelay);\n\n window.addEventListener(this.moveEvent, this.handleWindowMove);\n window.addEventListener(this.upEvent, this.handleWindowUp);\n }\n\n protected handleWindowMove(event: BaseEvent): void {\n if (this.interactionTimer == null) {\n if (this.disableIndividualInteractions) {\n return;\n }\n\n const position = Point.create(event.screenX, event.screenY);\n const pixelThreshold =\n this.interactionApi != null\n ? this.interactionApi.pixelThreshold(this.isTouch(event))\n : 2;\n if (\n this.downPosition != null &&\n Point.distance(position, this.downPosition) >= pixelThreshold &&\n !this.isDragging\n ) {\n this.beginDrag(event);\n this.isDragging = true;\n }\n\n if (this.isDragging) {\n this.drag(event);\n }\n }\n\n this.lastMoveEvent = event;\n }\n\n protected async handleWindowUp(event: BaseEvent): Promise<void> {\n if (this.isDragging) {\n this.endDrag(event);\n this.isDragging = false;\n }\n\n if (this.interactionTimer != null) {\n window.clearTimeout(this.interactionTimer);\n this.interactionTimer = undefined;\n }\n\n window.removeEventListener(this.moveEvent, this.handleWindowMove);\n window.removeEventListener(this.upEvent, this.handleWindowUp);\n this.lastMoveEvent = undefined;\n }\n\n protected async handleDoubleClick(event: BaseEvent): Promise<void> {\n // event.detail is the number of clicks that have happened recently. If the number is 2, then the user double clicked.\n if (\n event.detail === 2 &&\n event.buttons === 4 &&\n this.interactionApi != null\n ) {\n await this.interactionApi.viewAll();\n }\n }\n\n protected beginDrag(event: BaseEvent): void {\n if (this.keyboardControls && event.metaKey && event.shiftKey) {\n this.currentInteraction = this.rotatePointInteraction;\n } else if (this.keyboardControls && event.shiftKey && event.altKey) {\n this.currentInteraction = this.twistInteraction;\n } else if (this.keyboardControls && event.shiftKey) {\n this.currentInteraction = this.zoomInteraction;\n } else if (this.keyboardControls && (event.metaKey || event.ctrlKey)) {\n this.currentInteraction = this.panInteraction;\n } else if (this.keyboardControls && event.altKey) {\n this.currentInteraction = this.rotateInteraction;\n }\n\n if (event.buttons === 1) {\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n } else if (event.buttons === 2) {\n this.draggingInteraction = this.panInteraction;\n } else if (event.buttons === 4) {\n this.draggingInteraction =\n this.lastPrimaryRotateInteraction ?? this.rotateInteraction;\n }\n\n if (\n this.draggingInteraction != null &&\n this.interactionApi != null &&\n this.element != null\n ) {\n // Ensure any scroll wheel interactions have been ended prior to beginning\n // another interaction to prevent the interaction from being ended early.\n this.zoomInteraction.endDrag(event, this.interactionApi);\n\n this.draggingInteraction.beginDrag(\n event,\n this.downPositionCanvas || Point.create(event.clientX, event.clientY),\n this.interactionApi,\n this.element\n );\n }\n }\n\n protected drag(event: BaseEvent): void {\n if (this.keyboardControls && event.altKey && event.shiftKey) {\n this.currentInteraction = this.twistInteraction;\n } else {\n this.currentInteraction = undefined;\n }\n this.draggingInteraction =\n this.currentInteraction ||\n this.draggingInteraction ||\n this.primaryInteraction;\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.drag(event, this.interactionApi);\n }\n }\n\n protected endDrag(event: BaseEvent): void {\n if (\n this.keyboardControls &&\n this.currentInteraction === this.twistInteraction\n ) {\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.endDrag(event, this.interactionApi);\n this.draggingInteraction = undefined;\n }\n }\n\n protected handleMouseWheel(event: WheelEvent): void {\n event.preventDefault();\n\n if (\n this.element != null &&\n this.interactionApi != null &&\n event.buttons !== 4\n ) {\n const delta =\n -this.wheelDeltaToPixels(event.deltaY, event.deltaMode) / 10;\n const rect = this.element.getBoundingClientRect();\n const point = getMouseClientPosition(event, rect);\n const scrollSize = Math.abs(event.deltaY);\n\n if (scrollSize < 12) {\n // For small wheel movements, send a single zoom event.\n void this.zoomInteraction.zoomToPoint(\n point,\n delta,\n this.interactionApi\n );\n } else {\n const divisions = Math.min(10, Math.ceil(scrollSize / 12));\n const zoomDelta = delta / divisions;\n // For larger wheel movements, divide the delta into multiple zoom events with increasing delay\n // which approximates a smooth zoom deceleration curve for the end user.\n for (let i = 1; i <= divisions; i++) {\n const delayMs = i * 5;\n window.setTimeout(() => {\n if (this.interactionApi != null) {\n this.zoomInteraction.zoomToPoint(\n point,\n zoomDelta,\n this.interactionApi,\n delayMs\n );\n }\n }, delayMs);\n }\n }\n }\n }\n\n protected wheelDeltaToPixels(deltaY: number, deltaMode: number): number {\n if (this.computedBodyStyle == null) {\n this.computedBodyStyle = window.getComputedStyle(document.body);\n }\n\n const defaultLineHeight =\n this.computedBodyStyle.getPropertyValue('fontSize') != null &&\n this.computedBodyStyle.getPropertyValue('fontSize') !== '' &&\n !isNaN(parseFloat(this.computedBodyStyle.getPropertyValue('fontSize')))\n ? parseFloat(this.computedBodyStyle.getPropertyValue('fontSize')) *\n DEFAULT_LINE_HEIGHT\n : DEFAULT_FONT_SIZE * DEFAULT_LINE_HEIGHT;\n\n if (deltaMode === 1) {\n // deltaMode 1 corresponds to DOM_DELTA_LINE, which computes deltas in lines\n return this.computedBodyStyle.getPropertyValue('lineHeight') != null &&\n this.computedBodyStyle.getPropertyValue('lineHeight') !== '' &&\n !isNaN(\n parseFloat(this.computedBodyStyle.getPropertyValue('lineHeight'))\n )\n ? deltaY *\n parseFloat(this.computedBodyStyle.getPropertyValue('lineHeight'))\n : deltaY * defaultLineHeight;\n } else if (deltaMode === 2) {\n // deltaMode 2 corresponds to DOM_DELTA_PAGE, which computes deltas in pages\n return this.computedBodyStyle.getPropertyValue('height') != null &&\n this.computedBodyStyle.getPropertyValue('height') !== '' &&\n !isNaN(parseFloat(this.computedBodyStyle.getPropertyValue('height')))\n ? deltaY * parseFloat(this.computedBodyStyle.getPropertyValue('height'))\n : deltaY * window.innerHeight;\n }\n // deltaMode 0 corresponds to DOM_DELTA_PIXEL, which computes deltas in pixels\n return deltaY;\n }\n\n protected getCanvasPosition(event: BaseEvent): Point.Point | undefined {\n const canvasBounds = this.element?.getBoundingClientRect();\n const canvasOffset =\n canvasBounds != null\n ? Point.create(canvasBounds.left, canvasBounds.top)\n : undefined;\n\n return canvasOffset != null\n ? Point.subtract(Point.create(event.clientX, event.clientY), canvasOffset)\n : undefined;\n }\n\n protected isTouch(event: BaseEvent): boolean {\n return window.PointerEvent != null && event instanceof PointerEvent\n ? event.pointerType === 'touch'\n : false;\n }\n}\n"]}
@@ -108,11 +108,11 @@ export class ZoomInteraction extends MouseInteraction {
108
108
  this.didTransformBegin = false;
109
109
  this.startPt = undefined;
110
110
  }
111
- async zoom(delta, api) {
112
- await this.operateWithTimer(api, () => api.zoomCamera(this.getDirectionalDelta(delta)));
111
+ async zoom(delta, api, extraDelayMs) {
112
+ await this.operateWithTimer(api, () => api.zoomCamera(this.getDirectionalDelta(delta)), extraDelayMs);
113
113
  }
114
- async zoomToPoint(pt, delta, api) {
115
- await this.operateWithTimer(api, () => api.zoomCameraToPoint(pt, this.getDirectionalDelta(delta)));
114
+ async zoomToPoint(pt, delta, api, extraDelayMs) {
115
+ await this.operateWithTimer(api, () => api.zoomCameraToPoint(pt, this.getDirectionalDelta(delta)), extraDelayMs);
116
116
  }
117
117
  async beginInteraction(api) {
118
118
  this.didTransformBegin = true;
@@ -122,23 +122,29 @@ export class ZoomInteraction extends MouseInteraction {
122
122
  this.didTransformBegin = false;
123
123
  await api.endInteraction();
124
124
  }
125
- resetInteractionTimer(api) {
125
+ resetInteractionTimer(api, extraDelayMs) {
126
126
  this.stopInteractionTimer();
127
- this.startInteractionTimer(api);
127
+ this.startInteractionTimer(api, extraDelayMs);
128
128
  }
129
129
  getDirectionalDelta(delta) {
130
130
  return this.interactionConfigProvider().reverseMouseWheelDirection
131
131
  ? -delta
132
132
  : delta;
133
133
  }
134
+ /**
135
+ * if this value gets too low, can cause animation jitter in certain scenarios
136
+ */
134
137
  getInteractionDelay() {
135
138
  return this.interactionConfigProvider().mouseWheelInteractionEndDebounce;
136
139
  }
137
- startInteractionTimer(api) {
140
+ /**
141
+ * uses a configured interaction delay, but certain interactions like wheel zoom benefit from extra delay
142
+ */
143
+ startInteractionTimer(api, extraDelayMs = 0) {
138
144
  this.interactionTimer = window.setTimeout(async () => {
139
145
  this.interactionTimer = undefined;
140
146
  await this.endInteraction(api);
141
- }, this.getInteractionDelay());
147
+ }, extraDelayMs + this.getInteractionDelay());
142
148
  }
143
149
  stopInteractionTimer() {
144
150
  if (this.interactionTimer != null) {
@@ -146,12 +152,12 @@ export class ZoomInteraction extends MouseInteraction {
146
152
  this.interactionTimer = undefined;
147
153
  }
148
154
  }
149
- async operateWithTimer(api, f) {
155
+ async operateWithTimer(api, f, extraDelayMs) {
150
156
  if (!this.didTransformBegin) {
151
157
  await this.beginInteraction(api);
152
158
  }
153
- this.resetInteractionTimer(api);
154
- f();
159
+ this.resetInteractionTimer(api, extraDelayMs);
160
+ await f();
155
161
  }
156
162
  }
157
163
  export class PanInteraction extends MouseInteraction {