UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 8.21 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{_ as e}from"../../../../chunks/tslib.es6.js";import t 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 n}from"../../../../core/maybe.js";import{debounce as a}from"../../../../core/promiseUtils.js";import{initial as l,watch as d,syncAndInitial as c}from"../../../../core/reactiveUtils.js";import{getMetersPerUnitForSR as p}from"../../../../core/unitUtils.js";import{property as h}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/has.js";import"../../../../core/Logger.js";import"../../../../core/RandomLCG.js";import{subclass as m}from"../../../../core/accessorSupport/decorators/subclass.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{mediaKeys as j,KeyBindings as w}from"../../../interactive/keybindings.js";import{acquire as E}from"../../../interactive/snapping/SnappingManagerPool.js";const O=Symbol(),P=Symbol(),S=1,M=10;let H=class extends t{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 e=this.selectedElement;if(!e)return null;const{layer:{source:t}}=this;return t?"hasElement"in t?t.hasElement(e)?e:null:t===e?e:null:null}constructor(e){super(e),this.enabled=!1,this._isEditSourcePointsToggled=!1,this._updatingHandles=new v,this._isOpacityToggled=!1,this._factor=S,this._tool=null,this._object=null,this._createToolAbortController=null,this._onPointerMove=a((async e=>{const t=await this._updatingHandles.addPromise(this._findElementAtScreenPoint(e));this.destroyed||(this.removeHandles(P),t&&t!==this.selectedElement&&(this.view.cursor="pointer",this.addHandles(i((()=>this.view.cursor=null)),P)))})),this._tmpMat2=u(),this._tmpVec2=f()}destroy(){this._createToolAbortController=r(this._createToolAbortController)}initialize(){this.addHandles([o(this._updatingHandles),this._updatingHandles.add((()=>this.enabled),(e=>this._enableDisable(e)),l),this._updatingHandles.add((()=>this._preferredInteractionTool),(e=>this._preferredInteractionToolChanged(e)))])}_enableDisable(e){if(!e)return void this.removeHandles(O);this._dynamicImports();const{view:t}=this,o=new w;o.add(j.undo,(()=>{this._object?.operations?.undo(),this._object?.emit("modified-externally")})),o.add(j.redo,(()=>{this._object?.operations?.redo(),this._object?.emit("modified-externally")})),o.addToggle(j.preserveAspectRatio,(e=>{"transform-3d"===this._tool?.type&&(this._tool.preserveAspectRatio="key-down"===e.type)})),o.addToggle(j.editSourcePoints,(e=>{"reshape-3d"===this._tool?.type&&(this._isEditSourcePointsToggled="key-down"===e.type)})),o.addToggle(j.rotateIncrements,(e=>{"transform-3d"===this._tool?.type&&(this._tool.snapRotation="key-down"===e.type)})),o.add(j.toggleOpacity,(()=>{const e=this._object?.element;e&&(e.opacity*=this._isOpacityToggled?2:.5,this._isOpacityToggled=!this._isOpacityToggled)})),o.add(j.moveUp,(()=>this._move(0,this._factor))),o.add(j.moveDown,(()=>this._move(0,-this._factor))),o.add(j.moveRight,(()=>this._move(this._factor,0))),o.add(j.moveLeft,(()=>this._move(-this._factor,0))),o.addToggle(j.factorModifier,(e=>this._factor="key-down"===e.type?M:S)),this._isOpacityToggled=!1,this.addHandles([o.register(t,b.TOOL),i((()=>{this._isOpacityToggled&&this.selectedElement&&(this.selectedElement.opacity*=2,this._isOpacityToggled=!1)})),t.on("immediate-click",(e=>this._onClick(e)),b.TOOL),t.on("pointer-move",(e=>this._onPointerMove(e).catch((()=>{}))),b.TOOL),this._updatingHandles.add((()=>this._validatedSelectedElement),((e,t)=>{t&&e!==t&&this._isOpacityToggled&&(t.opacity*=2,this._isOpacityToggled=!1),this._selectedElementChanged(e)}),l),i((()=>{t.cursor=null,this._removeTool()}))],O)}async _onClick(e){await this._updatingHandles.addPromise(e.async((async()=>{const t=await this._findElementAtScreenPoint(e);this.destroyed||(t&&e.stopPropagation(),this.selectedElement=t,this.selectedElement&&(this.view.cursor=null))})))}async _selectedElementChanged(e){e?.georeference?this._object?.element!==e&&await this._updatingHandles.addPromise(this._recreateTool()):this._removeTool()}async _recreateTool(){this._createToolAbortController=r(this._createToolAbortController),this._removeTool();const e=this._validatedSelectedElement;if(!e)return;const t=new AbortController;this._createToolAbortController=t;const{ManipulatedObject3DMediaElement:o,ExtentTransformTool:s,ReshapeTool3D:a}=await this._dynamicImports();if(t.signal.aborted)return;const{view:l,layer:p,_toolType:h}=this;switch(this._object=new o({view:l,layer:p,element:e,tool:this._preferredInteractionTool}),h){case"transform-3d":{this._tool=new s({view:l,object:this._object});const e=l.inputManager;e.isModifierKeyDown(j.rotateIncrements.key)&&(this._tool.snapRotation=!0),e.isModifierKeyDown(j.preserveAspectRatio.key)&&(this._tool.preserveAspectRatio=!0)}break;case"reshape-3d":{const e=E(l),{snappingManager:t}=e;this._tool=new a({view:l,object:this._object,enableMidpoints:!1,enableZShape:!1,snappingManager:t,enableMoveObject:!1,autoHideManipulators:!0,enableDeleteVertices:!1,sketchOptions:{tooltips:{enabled:!0,inputEnabled:!0,visibleElements:{area:!1}}}}),this.addHandles([e,d((()=>({editSourcePoints:this.editSourcePoints,operations:this._object?.operations})),(e=>{e.operations instanceof T&&(e.operations.editSourcePoints=e.editSourcePoints)}),c)],this._tool)}}this.addHandles([i((()=>{this._object=n(this._object),this._tool&&(l.tools.remove(this._tool),this._tool=null)}))],this._tool),l.addAndActivateTool(this._tool)}_preferredInteractionToolChanged(e){const{_tool:t}=this;if(!t)return;if(this._toolType!==t.type)return void this._updatingHandles.addPromise(this._recreateTool());const{_object:o}=this;o&&(o.tool=e)}async _dynamicImports(){const[{ManipulatedObject3DMediaElement:e},{ExtentTransformTool:t,ReshapeTool3D:o}]=await Promise.all([import("../../interactive/editingTools/ManipulatedObject3DMediaElement.js"),import("../../interactive/editingTools.js")]);return{ManipulatedObject3DMediaElement:e,ExtentTransformTool:t,ReshapeTool3D:o}}async _findElementAtScreenPoint(e){const t=(await this.view.hitTest(e,{include:[this.layer]})).results[0];return"media"===t?.type?t.element:null}_removeTool(){this._tool&&this.removeHandles(this._tool)}_move(e,t){const{view:o,_object:i}=this,r=i?.operations;if(!r)return;const n=o.overlayPixelSizeInMapUnits(o.pointsOfInterest.focus.location)*p(o.spatialReference)/p(r.data.spatialReference),{_tmpMat2:a,_tmpVec2:l}=this,d=_(a,s(360-this.view.camera.heading)),c=g(l,n*e,n*t);y(c,c,d),r.move(c[0],c[1],0),i.emit("modified-externally")}};e([h({constructOnly:!0})],H.prototype,"view",void 0),e([h({constructOnly:!0})],H.prototype,"layer",void 0),e([h()],H.prototype,"selectedElement",void 0),e([h()],H.prototype,"enabled",void 0),e([h()],H.prototype,"options",void 0),e([h()],H.prototype,"editSourcePoints",null),e([h()],H.prototype,"_isEditSourcePointsToggled",void 0),e([h()],H.prototype,"updating",null),e([h()],H.prototype,"_preferredInteractionTool",null),e([h()],H.prototype,"_validatedSelectedElement",null),H=e([m("esri.views.3d.layers.support.MediaLayerInteraction")],H);export{H as MediaLayerInteraction};