UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 3.13 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{clock as t}from"../../../core/clock.js";import{removeMaybe as e}from"../../../core/maybe.js";import{createScreenPoint as r}from"../../../core/screenUtils.js";import{DragEventSeparator as i}from"../DragEventSeparator.js";import{InputHandler as a}from"../InputHandler.js";import{getDoubleClickParameters as o,getPointerId as n,manhattanDistance as s}from"./support.js";class p extends a{constructor(e={},a=t){super(!1),this._clock=a,this._doubleTapDragReady=!1,this._doubleTapDragActive=!1,this._dragStartCenter=r(0,0),this._pointerState=new Map,this._parameters=o(e),this._doubleTapDrag=this.registerOutgoing("double-tap-drag"),this._dragEventSeparator=new i({start:(t,e)=>this._dragStart(t,e),update:(t,e)=>this._dragUpdate(e),end:(t,e)=>this._dragEnd(e)}),this.registerIncoming("drag",(t=>this._dragEventSeparator.handle(t))),this.registerIncoming("pointer-down",(t=>this._handlePointerDown(t))),this.registerIncoming("pointer-up",(()=>this._handlePointerUp()))}onUninstall(){this._pointerState.forEach((t=>{t.doubleTapTimeout=e(t.doubleTapTimeout)}))}get hasPendingInputs(){for(const t of this._pointerState.values())if(null!=t.doubleTapTimeout)return!0;return!1}_clearPointerDown(t){const r=this._pointerState.get(t);r&&(r.doubleTapTimeout=e(r.doubleTapTimeout),this._pointerState.delete(t),this.refreshHasPendingInputs())}_dragStart(t,e){if(!this._doubleTapDragReady||1!==t)return;this._doubleTapDragReady=!1,this._doubleTapDragActive=!0;const{data:i,modifiers:a}=e,{center:o}=i;this._dragStartCenter=o;const n=d("begin",r(0,0),i);this._doubleTapDrag.emit(n,void 0,a),e.stopPropagation()}_dragUpdate(t){if(!this._doubleTapDragActive)return;const{data:e,modifiers:i}=t,{center:a}=e,o=d("update",r(a.x-this._dragStartCenter.x,a.y-this._dragStartCenter.y),e);this._doubleTapDrag.emit(o,void 0,i),t.stopPropagation()}_dragEnd(t){if(!this._doubleTapDragActive)return;const{data:e,modifiers:i}=t,{center:a}=e,o=d("end",r(a.x-this._dragStartCenter.x,a.y-this._dragStartCenter.y),e);this._doubleTapDrag.emit(o,void 0,i),this._doubleTapDragActive=!1,t.stopPropagation()}_handlePointerDown(t){const{data:e}=t,r=n(e),i=this._pointerState.get(r),{pointerType:a}=e.native;if(i){const o="touch"===a?this._parameters.maximumDoubleTouchDistance:this._parameters.maximumDoubleClickDistance;this._clearPointerDown(r),s(i.event.data,e)>o?this._storePointerDown(t):this._doubleTapDragReady=!0}else this._storePointerDown(t)}_handlePointerUp(){this._doubleTapDragReady=!1}_storePointerDown(t){const{data:e}=t,{pointerType:r}=e.native,i=n(e),a="touch"===r?this._parameters.maximumDoubleTouchDelay:this._parameters.maximumDoubleClickDelay,o=this._clock.setTimeout((()=>this._clearPointerDown(i)),a);this._pointerState.set(i,{event:t,doubleTapTimeout:o}),this.refreshHasPendingInputs()}}function d(t,e,r){const{button:i,buttons:a,pointer:o,pointers:n,pointerType:s,timestamp:p}=r;return{action:t,delta:e,button:i,buttons:a,pointer:o,pointers:n,pointerType:s,timestamp:p}}export{p as DoubleTapDrag};