UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.64 kB
import{clock as e}from"../../../core/clock.js";import{someMap as t}from"../../../core/MapUtils.js";import{removeMaybe as i}from"../../../core/maybe.js";import{InputHandler as o}from"../InputHandler.js";import{manhattanDistance as n,getPointerId as s}from"./support.js";const l={maximumDoubleClickDelay:250,maximumDoubleClickDistance:10,maximumDoubleTouchDelay:350,maximumDoubleTouchDistance:35};class m extends o{constructor(t=l.maximumDoubleClickDelay,i=l.maximumDoubleClickDistance,o=l.maximumDoubleTouchDelay,n=l.maximumDoubleTouchDistance,s=e){super(!1),this._maximumDoubleClickDelay=t,this._maximumDoubleClickDistance=i,this._maximumDoubleTouchDelay=o,this._maximumDoubleTouchDistance=n,this._clock=s,this._pointerState=new Map,this._click=this.registerOutgoing("click"),this._doubleClick=this.registerOutgoing("double-click"),this.registerIncoming("immediate-click",this._handleImmediateClick.bind(this)),this.registerIncoming("pointer-down",this._handlePointerDown.bind(this))}onUninstall(){this._pointerState.forEach((e=>e.doubleClickTimer=i(e.doubleClickTimer)))}get hasPendingInputs(){return t(this._pointerState,(e=>null!=e.doubleClickTimer))}_clearDoubleClickTimer(e,t){const o=this._pointerState.get(e);o&&(o.doubleClickTimer=i(o.doubleClickTimer),t&&this._click.emit(o.event.data,void 0,o.event.modifiers),this._pointerState.delete(e),this.refreshHasPendingInputs())}_doubleClickTimeoutExceeded(e){const t=this._pointerState.get(e);1===t.pointerDownCount&&this._click.emit(t.event.data,void 0,t.event.modifiers),t.doubleClickTimer=null,this._pointerState.delete(e),this.refreshHasPendingInputs()}_getPointerId(e){const{pointerId:t,pointerType:i,button:o}=e.native;return"mouse"===i?`${t}:${o}`:`${i}`}_handleImmediateClick(e){const t=e.data,{pointerType:i}=t.native,o=this._getPointerId(t);if(!this._pointerState.has(o))return void this._startClick(e);const s=this._pointerState.get(o),{data:l,modifiers:m}=s.event,c="touch"===i?this._maximumDoubleTouchDistance:this._maximumDoubleClickDistance;n(l,t)>c?(this._clearDoubleClickTimer(o,!0),this._startClick(e)):(this._clearDoubleClickTimer(o,!1),2===s.pointerDownCount&&this._doubleClick.emit(l,void 0,m))}_handlePointerDown(e){const t=s(e.data),i=this._pointerState.get(t);i&&(i.pointerDownCount+=1)}_startClick(e){const{data:t}=e,{native:{pointerType:i}}=t,o=s(t),n="touch"===i?this._maximumDoubleTouchDelay:this._maximumDoubleClickDelay,l=this._clock.setTimeout((()=>this._doubleClickTimeoutExceeded(o)),n),m=1;this._pointerState.set(o,{event:e,doubleClickTimer:l,pointerDownCount:m}),this.refreshHasPendingInputs()}}export{l as DefaultParameters,m as SingleAndDoubleClick};