@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 8.31 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as t}from"tslib";import e from"../../../../core/Accessor.js";import{destroyHandle as o,makeHandle as i}from"../../../../core/handleUtils.js";import{deg2rad as s}from"../../../../core/mathUtils.js";import{abortMaybe as r,destroyMaybe as a}from"../../../../core/maybe.js";import{debounce as n}from"../../../../core/promiseUtils.js";import{initial as l,watch as d,syncAndInitial as c}from"../../../../core/reactiveUtils.js";import{getMetersPerUnitForSR as p}from"../../../../core/units.js";import{property as h,subclass as m}from"../../../../core/accessorSupport/decorators.js";import{fromRotation as _}from"../../../../core/libs/gl-matrix-2/math/mat2d.js";import{create as u}from"../../../../core/libs/gl-matrix-2/factories/mat2df64.js";import{set as g,transformMat2d as y}from"../../../../core/libs/gl-matrix-2/math/vec2.js";import{create as f}from"../../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{UpdatingHandles as v}from"../../../../core/support/UpdatingHandles.js";import{ControlPointOperations as T}from"../../interactive/editingTools/media/ControlPointOperations.js";import{ViewEventPriorities as b}from"../../../input/InputManager.js";import{KeyBindings as j,mediaKeys as M}from"../../../interactive/keybindings.js";import{acquire as w}from"../../../interactive/snapping/SnappingManagerPool.js";import{loadAutomaticAreaMeasurementUtils as E}from"../../../support/automaticAreaMeasurementUtils.js";import{loadAutomaticLengthMeasurementUtils as O}from"../../../support/automaticLengthMeasurementUtils.js";const P=Symbol(),S=Symbol(),H=1,A=10;let I=class extends e{get editSourcePoints(){return!!this.options?.reshapeOptions.editSourcePoints!==this._isEditSourcePointsToggled}get updating(){return this._updatingHandles.updating}get _preferredInteractionTool(){return this.options?.tool??"transform"}get _toolType(){switch(this._preferredInteractionTool){case"transform":return"transform-3d";case"reshape":return"reshape-3d"}}get _validatedSelectedElement(){const t=this.selectedElement;if(!t)return null;const{layer:{source:e}}=this;return e?"hasElement"in e?e.hasElement(t)?t:null:e===t?t:null:null}constructor(t){super(t),this.enabled=!1,this._isEditSourcePointsToggled=!1,this._updatingHandles=new v,this._isOpacityToggled=!1,this._factor=H,this._tool=null,this._object=null,this._createToolAbortController=null,this._onPointerMove=n(async t=>{const e=await this._updatingHandles.addPromise(this._findElementAtScreenPoint(t));this.destroyed||(this.removeHandles(S),e&&e!==this.selectedElement&&this.addHandles(this.view.acquireCursor("pointer","high"),S))}),this._tmpMat2=u(),this._tmpVec2=f()}destroy(){this._createToolAbortController=r(this._createToolAbortController)}initialize(){this.addHandles([o(this._updatingHandles),this._updatingHandles.add(()=>this.enabled,t=>this._enableDisable(t),l),this._updatingHandles.add(()=>this._preferredInteractionTool,t=>this._preferredInteractionToolChanged(t))])}_enableDisable(t){if(!t)return void this.removeHandles(P);this._dynamicImports();const{view:e}=this,o=new j;o.add(M.undo,()=>{this._object?.operations?.undo(),this._object?.emit("modified-externally")}),o.add(M.redo,()=>{this._object?.operations?.redo(),this._object?.emit("modified-externally")}),o.addToggle(M.preserveAspectRatio,t=>{"transform-3d"===this._tool?.type&&(this._tool.preserveAspectRatio="key-down"===t.type)}),o.addToggle(M.editSourcePoints,t=>{"reshape-3d"===this._tool?.type&&(this._isEditSourcePointsToggled="key-down"===t.type)}),o.addToggle(M.rotateIncrements,t=>{"transform-3d"===this._tool?.type&&(this._tool.snapRotation="key-down"===t.type)}),o.add(M.toggleOpacity,()=>{const t=this._object?.element;t&&(t.opacity*=this._isOpacityToggled?2:.5,this._isOpacityToggled=!this._isOpacityToggled)}),o.add(M.moveUp,()=>this._move(0,this._factor)),o.add(M.moveDown,()=>this._move(0,-this._factor)),o.add(M.moveRight,()=>this._move(this._factor,0)),o.add(M.moveLeft,()=>this._move(-this._factor,0)),o.addToggle(M.factorModifier,t=>this._factor="key-down"===t.type?A:H),this._isOpacityToggled=!1,this.addHandles([o.register(e,b.TOOL),i(()=>{this._isOpacityToggled&&this.selectedElement&&(this.selectedElement.opacity*=2,this._isOpacityToggled=!1)}),e.on("immediate-click",t=>this._onClick(t),b.TOOL),e.on("pointer-move",t=>this._onPointerMove(t).catch(()=>{}),b.TOOL),this._updatingHandles.add(()=>this._validatedSelectedElement,(t,e)=>{e&&t!==e&&this._isOpacityToggled&&(e.opacity*=2,this._isOpacityToggled=!1),this._selectedElementChanged(t)},l),i(()=>{this.removeHandles(S),this._removeTool()})],P)}async _onClick(t){await this._updatingHandles.addPromise(t.defer(async()=>{const e=await this._findElementAtScreenPoint(t);this.destroyed||(e&&t.stopPropagation(),this.selectedElement=e,this.selectedElement&&this.removeHandles(S))}))}async _selectedElementChanged(t){t?.georeference?this._object?.element!==t&&await this._updatingHandles.addPromise(this._recreateTool()):this._removeTool()}async _recreateTool(){this._createToolAbortController=r(this._createToolAbortController),this._removeTool();const t=this._validatedSelectedElement;if(!t)return;const e=new AbortController;this._createToolAbortController=e;const{ManipulatedObject3DMediaElement:o,ExtentTransformTool:s,ReshapeTool3D:n,automaticAreaMeasurementUtils:l,automaticLengthMeasurementUtils:p}=await this._dynamicImports();if(e.signal.aborted)return;const{view:h,layer:m,_toolType:_}=this;switch(this._object=new o({view:h,layer:m,element:t,tool:this._preferredInteractionTool}),_){case"transform-3d":this._tool=new s({view:h,object:this._object,automaticLengthMeasurementUtils:p}),h.inputManager.isModifierKeyDown(M.rotateIncrements.key)&&(this._tool.snapRotation=!0),h.inputManager.isModifierKeyDown(M.preserveAspectRatio.key)&&(this._tool.preserveAspectRatio=!0);break;case"reshape-3d":{const t=w(h),{snappingManager:e}=t;this._tool=new n({view:h,object:this._object,enableMidpoints:!1,enableZShape:!1,snappingManager:e,enableMoveObject:!1,autoHideManipulators:!0,enableDeleteVertices:!1,sketchOptions:{tooltips:{enabled:!0,inputEnabled:!0,visibleElements:{area:!1}}},automaticAreaMeasurementUtils:l,automaticLengthMeasurementUtils:p}),this.addHandles([t,d(()=>({editSourcePoints:this.editSourcePoints,operations:this._object?.operations}),t=>{t.operations instanceof T&&(t.operations.editSourcePoints=t.editSourcePoints)},c)],this._tool)}}this.addHandles([i(()=>{this._object=a(this._object),this._tool&&(h.tools.remove(this._tool),this._tool=null)})],this._tool),h.addAndActivateTool(this._tool)}_preferredInteractionToolChanged(t){const{_tool:e}=this;if(!e)return;if(this._toolType!==e.type)return void this._updatingHandles.addPromise(this._recreateTool());const{_object:o}=this;o&&(o.tool=t)}async _dynamicImports(){const[{ManipulatedObject3DMediaElement:t},{ExtentTransformTool:e,ReshapeTool3D:o},i,s]=await Promise.all([import("../../interactive/editingTools/ManipulatedObject3DMediaElement.js"),import("../../interactive/editingTools.js"),E(),O()]);return{ManipulatedObject3DMediaElement:t,ExtentTransformTool:e,ReshapeTool3D:o,automaticAreaMeasurementUtils:i,automaticLengthMeasurementUtils:s}}async _findElementAtScreenPoint(t){const e=(await this.view.hitTest(t,{include:[this.layer]})).results[0];return"media"===e?.type?e.element:null}_removeTool(){this._tool&&this.removeHandles(this._tool)}_move(t,e){const{view:o,_object:i}=this,r=i?.operations;if(!r)return;const a=o.overlayPixelSizeInMapUnits(o.pointsOfInterest.focus.location)*p(o.spatialReference)/p(r.data.spatialReference),{_tmpMat2:n,_tmpVec2:l}=this,d=_(n,s(360-this.view.camera.heading)),c=g(l,a*t,a*e);y(c,c,d),r.move(c[0],c[1],0),i.emit("modified-externally")}};t([h({constructOnly:!0})],I.prototype,"view",void 0),t([h({constructOnly:!0})],I.prototype,"layer",void 0),t([h()],I.prototype,"selectedElement",void 0),t([h()],I.prototype,"enabled",void 0),t([h()],I.prototype,"options",void 0),t([h()],I.prototype,"editSourcePoints",null),t([h()],I.prototype,"_isEditSourcePointsToggled",void 0),t([h()],I.prototype,"updating",null),t([h()],I.prototype,"_preferredInteractionTool",null),t([h()],I.prototype,"_validatedSelectedElement",null),I=t([m("esri.views.3d.layers.support.MediaLayerInteraction")],I);export{I as MediaLayerInteraction};