UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.33 kB
import{clock as t}from"../../../core/clock.js";import{someMap as e}from"../../../core/MapUtils.js";import{removeMaybe as a}from"../../../core/maybe.js";import{createScreenPoint as i}from"../../../core/screenUtils.js";import{DragEventSeparator as o}from"../DragEventSeparator.js";import{InputHandler as r}from"../InputHandler.js";import{DefaultParameters as s}from"./SingleAndDoubleClick.js";import{getPointerId as n,manhattanDistance as u}from"./support.js";class p extends r{constructor(e=s.maximumDoubleClickDelay,a=s.maximumDoubleClickDistance,r=s.maximumDoubleTouchDelay,n=s.maximumDoubleTouchDistance,u=t){super(!1),this._maximumDoubleClickDelay=e,this._maximumDoubleClickDistance=a,this._maximumDoubleTouchDelay=r,this._maximumDoubleTouchDistance=n,this._clock=u,this._doubleTapDragReady=!1,this._doubleTapDragActive=!1,this._dragStartCenter=i(0,0),this._pointerState=new Map,this._doubleTapDrag=this.registerOutgoing("double-tap-drag"),this._dragEventSeparator=new o({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=a(t.doubleTapTimeout)}))}get hasPendingInputs(){return e(this._pointerState,(t=>null!=t.doubleTapTimeout))}_clearPointerDown(t){const e=this._pointerState.get(t);e&&(e.doubleTapTimeout=a(e.doubleTapTimeout),this._pointerState.delete(t),this.refreshHasPendingInputs())}_createDoubleTapDragData(t,e,a){const{button:i,buttons:o,pointer:r,pointers:s,pointerType:n,timestamp:u}=a;return{action:t,delta:e,button:i,buttons:o,pointer:r,pointers:s,pointerType:n,timestamp:u}}_dragStart(t,e){if(!this._doubleTapDragReady||1!==t)return;this._doubleTapDragReady=!1,this._doubleTapDragActive=!0;const{data:a,modifiers:o}=e,{center:r}=a;this._dragStartCenter=r;const s=this._createDoubleTapDragData("begin",i(0,0),a);this._doubleTapDrag.emit(s,void 0,o),e.stopPropagation()}_dragUpdate(t){if(!this._doubleTapDragActive)return;const{data:e,modifiers:a}=t,{center:o}=e,r=i(o.x-this._dragStartCenter.x,o.y-this._dragStartCenter.y),s=this._createDoubleTapDragData("update",r,e);this._doubleTapDrag.emit(s,void 0,a),t.stopPropagation()}_dragEnd(t){if(!this._doubleTapDragActive)return;const{data:e,modifiers:a}=t,{center:o}=e,r=i(o.x-this._dragStartCenter.x,o.y-this._dragStartCenter.y),s=this._createDoubleTapDragData("end",r,e);this._doubleTapDrag.emit(s,void 0,a),this._doubleTapDragActive=!1,t.stopPropagation()}_handlePointerDown(t){const{data:e}=t,a=n(e),i=this._pointerState.get(a),{pointerType:o}=e.native;if(i){const r="touch"===o?this._maximumDoubleTouchDistance:this._maximumDoubleClickDistance;this._clearPointerDown(a),u(i.event.data,e)>r?this._storePointerDown(t):this._doubleTapDragReady=!0}else this._storePointerDown(t)}_handlePointerUp(){this._doubleTapDragReady=!1}_storePointerDown(t){const{data:e}=t,{pointerType:a}=e.native,i=n(e),o="touch"===a?this._maximumDoubleTouchDelay:this._maximumDoubleClickDelay,r=this._clock.setTimeout((()=>this._clearPointerDown(i)),o);this._pointerState.set(i,{event:t,doubleTapTimeout:r}),this.refreshHasPendingInputs()}}export{p as DoubleTapDrag};