UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 4.88 kB
import t from"../../../Camera.js";import i from"../../../Viewpoint.js";import e from"../../../core/Error.js";import{isSome as a,isNone as n}from"../../../core/maybe.js";import{onAbort as o,createAbortError as r}from"../../../core/promiseUtils.js";import{whenOnce as s}from"../../../core/reactiveUtils.js";import{applyAll as l}from"../camera/constraintUtils.js";import{applySurfaceCollisionConstraint as c,Mode as h}from"../camera/constraintUtils/surfaceCollision.js";import{State as m}from"./controllers/CameraController.js";import{PointToPointAnimationController as w}from"./controllers/PointToPointAnimationController.js";import{SurfaceCollisionCorrectionController as p}from"./controllers/SurfaceCollisionCorrectionController.js";import{externalToInternal as f}from"../support/cameraUtils.js";import{create as v}from"../support/viewpointUtils.js";class C{constructor(t,i,e){this.target=t,this.options=i,this.view=e,this.state="pending",this._animationController=null,this._promise=new Promise(((t,i)=>{this._resolveCallback=t,this._rejectCallback=i;const e=new AbortController;a(this.options.signal)&&o(this.options.signal,(()=>{this.abort()})),this._abortController=e,this.waitForReady()}))}then(t,i){return this._promise.then(t,i)}catch(t){return this._promise.catch(t)}resolve(t){if("finished"!==this.state)return this.state="finished",this._resolveCallback(t)}reject(t){if("finished"!==this.state)return this.state="finished",this._rejectCallback(t)}abort(t=!1){if(this._abortController.abort(),"wait-for-animation-finish"===this.state)!t&&a(this._animationController)&&this.view.state.cameraController===this._animationController&&this._animationController.active&&this._animationController.stopController();this.reject(r())}async waitForReady(){if(this.state="wait-for-ready",!this.view.ready)try{await s((()=>this.view.ready),this._abortController.signal)}catch(t){return this.reject(t)}this.createViewPoint()}createViewPoint(){"finished"!==this.state&&(this.state="wait-for-viewpoint",this._animationController=this.options.animate?this._getAnimationController():null,v(this.view,this.target,this._abortController.signal).then((t=>{if("finished"===this.state)return;const i=t?this._getCameraFromViewpoint(t):null;if(!n(i))if(this.options.animate){if(n(this._animationController))return;this.startAnimation(i,this._animationController)}else this.view.stateManager.setStateCamera(i.camera,{applyConstraints:!i.isFullySpecified,positionAndOrientationOnly:!0,doNotCancelGoToOperation:!0}),this.resolve()}),(t=>{this.reject(t)})))}_getCameraFromViewpoint(a){const o=!!(this.target instanceof i&&this.target.camera||this.target instanceof t),r=a.camera;if(n(r))return null;if(!this.view.stateManager.isCompatible(r)){const t=r.position,i=t&&t.spatialReference,a=i?i.wkid:"none",n=this.view.spatialReference?.wkid;return this.reject(new e("GotoAnimation:incompatible-spatialreference",`Resulting camera has an incompatible spatial reference (camera: ${a}, view: ${n})`,{camera:r})),null}const s=f(this.view,r);return n(s)?(this.reject(new e("GotoAnimation:invalid-camera","Resulting camera is invalid")),null):{viewpoint:a,camera:s,isFullySpecified:o}}startAnimation(t,i){this.state="wait-for-animation-finish";const o=i.viewAnimation;if(n(o))return void this.reject(new e("GotoAnimation:missing-animation","Unreachable code in view.stateManager"));if(o.update(t.viewpoint,"running"),!i.active||n(i.viewAnimation)||i.viewAnimation.target!==t.viewpoint||this.view.state.cameraController!==i)return this.abort();let r;t.isFullySpecified?(r=new p({view:this.view,desiredCamera:t.camera}),c(this.view,t.camera,h.EYE_AND_CENTER)):l(this.view,t.camera),i.begin(t.camera,this.options);const s=()=>{const e=this.view.state.cameraController;r&&(e&&e.active?e instanceof w&&a(e.viewAnimation)&&e.viewAnimation.target===t.viewpoint&&(this.view.state.cameraController=r):a(i.viewAnimation)&&i.viewAnimation.target===t.viewpoint&&"finished"===i.state&&(this.view.state.cameraController=r))},f=t=>{if(!n(this.view.state))switch(i.state){case m.Finished:switch(this.state){case"pending":case"wait-for-ready":case"wait-for-viewpoint":case"wait-for-animation-finish":this.resolve()}break;case m.Ready:case m.Rejected:case m.Running:case m.Stopped:switch(this.state){case"pending":case"wait-for-ready":case"wait-for-viewpoint":case"wait-for-animation-finish":this.reject(t)}}};o.when(s,(t=>f(t))),i.asyncResult={resolve:()=>f(),reject:t=>f(t)}}_getAnimationController(){let t=null,i=null;const n=this.view.state.cameraController;return n instanceof w&&(n.updateStateFromViewAnimation(),n.active&&(t=n,i=t.viewAnimation)),null!=t||(t=new w({view:this.view,mode:"animation"}),i=t.viewAnimation,this.view.state.switchCameraController(t))?t:(a(i)&&i.stop(),this.reject(new e("GotoAnimation:goto-cannot-interrupt","Cannot start an animation while interacting")),null)}}export{C as GoToOperation};