@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 8.24 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as t}from"tslib";import e from"../../core/Accessor.js";import{find as o}from"../../core/iteratorUtils.js";import{clamp as r}from"../../core/mathUtils.js";import i from"../../core/ReactiveMap.js";import{createScreenPoint as a}from"../../core/screenUtils.js";import{property as n,subclass as s}from"../../core/accessorSupport/decorators.js";import{areToolManipulatorsEditable as l}from"./interactiveToolUtils.js";import{createScreenPointFromEvent as p}from"../support/screenUtils.js";let u=class extends e{constructor(){super(...arguments),this._pointerLocations=new Map,this._hoveredManipulators=new i,this._grabbedManipulators=new i,this._draggedManipulators=new Map,this._stopDrag=!1,this._externallyDragging=!1,this._revertToNullActiveTool=!1}get cursor(){return this._cursorFromMap(this._grabbedManipulators,"grabbing")??this._cursorFromMap(this._hoveredManipulators,"pointer")}get hasFocusedManipulators(){return this._grabbedManipulators.size>0||this._draggedManipulators.size>0}handleInputEvent(t,e){const o=()=>t.stopPropagation();switch(t.type){case"pointer-move":d(t.pointerType)&&this._pointerLocations.set(t.pointerId,{x:t.x,y:t.y,pointerType:t.pointerType});break;case"drag":this._grabbedManipulators.size>0?this._stopDrag=!0:"start"===t.action?this._externallyDragging=!0:"end"===t.action&&(this._externallyDragging=!1),this._stopDrag&&(o(),"end"===t.action&&(this._stopDrag=!1));break;case"pointer-down":{if(!g(t))break;const r=p(t),i=c(r,t.pointerType,e.tools);if(null==i)break;const a=i.manipulator,n=i.tool;null==a||null==n||!a.interactive||a.grabbable&&a.grabbableForEvent(t)||!a.grabbing||a.dragging||this._releaseManipulatorBeforeDragging(a,t,e),null!=a&&null!=n&&a.interactive&&a.grabbable&&a.grabbableForEvent(t)&&!a.grabbing&&(this._grabbedManipulators.set(t.pointerId,{manipulator:a,tool:n,start:r,pointerType:t.pointerType}),1===this._grabbedManipulators.size&&null==e.activeTool&&(this._revertToNullActiveTool=!0,e.setActiveTool(i.tool)),a.grabbing=!0,a.events.emit("grab-changed",{action:"start",pointerType:t.pointerType,screenPoint:r}),o());break}case"pointer-up":this._draggedManipulators.has(t.pointerId)||this._handlePointerEnd(t,e);break;case"pointer-drag":{if(!g(t))break;const i=this._grabbedManipulators.get(t.pointerId),a=i?.manipulator,n=i?.tool,{activeTool:s}=e;if(null!=s&&!s.multiTouchEnabled&&e.multiTouchActive&&0===this._draggedManipulators.size&&this._grabbedManipulators.size>0){this.clearPointers(s,e,!0);break}if(null==a||null==n)break;const l=p(t);l.x=r(l.x,0,e.view.width),l.y=r(l.y,0,e.view.height);const u=i.start,c=this._draggedManipulators.get(t.pointerId);switch(t.action){case"start":case"update":"update"!==t.action&&1!==this._grabbedManipulators.size||(a.dragging=!0,c?a.events.emit("drag",{action:"update",start:u,screenPoint:l}):a.events.emit("drag",{action:"start",start:u,screenPoint:l,pointerType:t.pointerType}),this._draggedManipulators.set(t.pointerId,{tool:n,manipulator:a,start:u}));break;case"end":a.dragging=!1,c&&a.events.emit("drag",{action:"end",start:u,screenPoint:l}),this._draggedManipulators.delete(t.pointerId),this._handlePointerEnd(t,e)}o();break}case"immediate-click":{const r=p(t),i=c(r,t.pointerType,e.tools);if(!h(t))for(const t of e.tools)if((null==i||i.tool!==t||t.automaticManipulatorSelection)&&t.manipulators){let e=!1;t.manipulators.forEach(({manipulator:t})=>{t.selected&&(t.selected=!1,e=!0)}),e&&t.onManipulatorSelectionChanged&&t.onManipulatorSelectionChanged()}if(null==i)break;const{manipulator:a,tool:n}=i;if(!a.interactive)break;a.selectable&&n.automaticManipulatorSelection&&(a.selected=!a.selected,n.onManipulatorSelectionChanged&&n.onManipulatorSelectionChanged());const s=t.native.shiftKey;a.events.emit("immediate-click",{screenPoint:r,button:t.button,pointerType:t.pointerType,shiftKey:s,stopPropagation:o}),b(a,o);break}case"click":{const r=p(t),i=c(r,t.pointerType,e.tools),a=i?.manipulator;if(null==a||!a.interactive)break;const n=t.native.shiftKey;a.events.emit(t.type,{screenPoint:r,button:t.button,pointerType:t.pointerType,shiftKey:n}),o();break}case"double-click":{const r=p(t),i=c(r,t.pointerType,e.tools),a=null!=i?i.manipulator:null;if(null==a||!a.interactive)break;const n=t.native.shiftKey;a.events.emit("double-click",{screenPoint:r,button:t.button,pointerType:t.pointerType,shiftKey:n,stopPropagation:o}),b(a,o);break}case"immediate-double-click":{const r=p(t),i=c(r,t.pointerType,e.tools),a=null!=i?i.manipulator:null;if(null==a||!a.interactive)break;const n=t.native.shiftKey;a.events.emit("immediate-double-click",{screenPoint:r,button:t.button,pointerType:t.pointerType,shiftKey:n,stopPropagation:o}),"mouse"===t.pointerType&&b(a,o);break}}this._onFocusChange(e.tools)}_releaseManipulatorBeforeDragging(t,e,o){t.grabbing=!1,t.events.emit("grab-changed",{action:"end",pointerType:e.pointerType,screenPoint:p(e)}),this._grabbedManipulators.forEach(({manipulator:e},o)=>{e===t&&this._grabbedManipulators.delete(o)}),this._afterManipulatorRelease(o.setActiveTool)}_handlePointerEnd(t,e){const o=this._grabbedManipulators.get(t.pointerId)?.manipulator;null!=o&&o.grabbing&&(o.grabbing=!1,o.events.emit("grab-changed",{action:"end",pointerType:t.pointerType,screenPoint:p(t)}),this._grabbedManipulators.delete(t.pointerId),this._afterManipulatorRelease(e.setActiveTool))}_onFocusChange(t){this._updateFocusedManipulatorTools(t)}_updateFocusedManipulatorTools(t){const e=new Set,r=new Set;this._grabbedManipulators.forEach(({tool:t})=>e.add(t)),this._hoveredManipulators.forEach(({tool:t})=>r.add(t));for(const i of t){i.hasGrabbedManipulators=e.has(i),i.hasHoveredManipulators=r.has(i);const t=this._grabbedManipulators.values(),a=o(t,({tool:t})=>t===i);i.firstGrabbedManipulator=null!=a?a.manipulator:null}}clearPointers(t,{tools:e,setActiveTool:o},r=!0,i){const a=(e,o)=>!(null!=t&&e!==t||null!=i&&i!==o);this._grabbedManipulators.forEach(({tool:t,manipulator:e,pointerType:o},r)=>{a(t,e)&&(this._grabbedManipulators.delete(r),e.grabbing=!1,e.events.emit("grab-changed",{action:"end",screenPoint:null,pointerType:o}))}),this._draggedManipulators.forEach(({tool:t,manipulator:e},o)=>{a(t,e)&&(this._draggedManipulators.delete(o),e.dragging=!1,e.events.emit("drag",{action:"cancel"}))}),r&&this._hoveredManipulators.forEach(({tool:t,manipulator:e},o)=>{a(t,e)&&(this._hoveredManipulators.delete(o),e.hovering=!1)}),this._afterManipulatorRelease(o),this._onFocusChange(e)}updateHoveredStateFromKnownPointers(t){this._pointerLocations.forEach((e,o)=>{this._updateHoveredStateForPointerAtScreenPosition(a(e.x,e.y),o,e.pointerType,t)})}handleHoverEvent(t,e){const o=t.type;"pointer-up"!==o&&"immediate-click"!==o&&"pointer-move"!==o||!d(t.pointerType)||("pointer-up"!==o&&this._externallyDragging?this._clearHoveredManipulatorStates(t.pointerId):this._updateHoveredStateForPointerAtScreenPosition(p(t),t.pointerId,t.pointerType,e))}_updateHoveredStateForPointerAtScreenPosition(t,e,o,r){let i=c(t,o,r);const a=this._hoveredManipulators.get(e)?.manipulator;null==i||i.manipulator.interactive||(i=null),null!=i&&a===i.manipulator||(null!=a&&(a.hovering=!1),null!=i?(i.manipulator.hovering=!0,this._hoveredManipulators.set(e,i)):this._hoveredManipulators.delete(e),this._onFocusChange(r))}_afterManipulatorRelease(t){0===this._grabbedManipulators.size&&this._revertToNullActiveTool&&(t(null),this._revertToNullActiveTool=!1)}_clearHoveredManipulatorStates(t){this._hoveredManipulators.forEach(({manipulator:e},o)=>{t===o&&(this._hoveredManipulators.delete(t),e.hovering=!1)})}_cursorFromMap(t,e){if(!t?.size)return null;for(const{manipulator:o}of t.values())if(o?.interactive){if(o.grabbing&&o.grabCursor)return o.grabCursor;if(o.cursor)return o.cursor}return e}};function c(t,e,o){for(const r of o){if(null==r.manipulators||!l(r))continue;const o=r.manipulators.intersect(t,e);if(null!=o)return{tool:r,manipulator:o}}return null}function d(t){return"mouse"===t}function g(t){return"mouse"!==t.pointerType||0===t.button}function h(t){return!!t.native.shiftKey}function b(t,e){t?.consumesClicks&&e()}t([n()],u.prototype,"cursor",null),u=t([s("esri.views.interactive.ToolViewManagerManipulatorState")],u);export{u as ToolViewManagerManipulatorState};