UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.42 kB
import t from"../../core/Collection.js";import{isSome as a}from"../../core/maybe.js";var i;!function(t){t[t.WhenToolEditable=0]="WhenToolEditable",t[t.WhenToolNotEditable=1]="WhenToolNotEditable",t[t.Always=2]="Always"}(i||(i={}));class e{constructor(){this._isToolEditable=!0,this._manipulators=new t,this._resourceContexts={manipulator3D:{}},this._attached=!1}set isToolEditable(t){this._isToolEditable=t}get length(){return this._manipulators.length}add(t,a=i.WhenToolEditable){this.addMany([t],a)}addMany(t,a=i.WhenToolEditable){for(const i of t){const t={manipulator:i,visibilityPredicate:a,attached:!1};this._manipulators.add(t),this._attached&&this._updateManipulatorAttachment(t)}}remove(t){for(let a=0;a<this._manipulators.length;a++)if(this._manipulators.getItemAt(a).manipulator===t){const t=this._manipulators.splice(a,1)[0];this._detachManipulator(t);break}}removeAll(){this._manipulators.forEach((t=>{this._detachManipulator(t)})),this._manipulators.removeAll()}attach(){this._manipulators.forEach((t=>{this._updateManipulatorAttachment(t)})),this._attached=!0}detach(){this._manipulators.forEach((t=>{this._detachManipulator(t)})),this._attached=!1}destroy(){this.detach(),this._manipulators.forEach((({manipulator:t})=>{t.destroy&&t.destroy()})),this._manipulators.destroy(),this._resourceContexts=null}on(t,a){return this._manipulators.on(t,(t=>{a(t)}))}forEach(t){for(const a of this._manipulators.items)t(a)}some(t){return this._manipulators.items.some(t)}toArray(){const t=[];return this.forEach((a=>t.push(a.manipulator))),t}intersect(t,i){let e=null,o=Number.MAX_VALUE;return this._manipulators.forEach((({manipulator:s,attached:r})=>{if(!r||!s.interactive)return;const n=s.intersectionDistance(t,i);a(n)&&n<o&&(o=n,e=s)})),e}_updateManipulatorAttachment(t){this._isManipulatorItemVisible(t)?this._attachManipulator(t):this._detachManipulator(t)}_attachManipulator(t){t.attached||(t.manipulator.attach&&t.manipulator.attach(this._resourceContexts),t.attached=!0)}_detachManipulator(t){if(!t.attached)return;const a=t.manipulator;a.grabbing=!1,a.dragging=!1,a.hovering=!1,a.selected=!1,a.detach&&a.detach(this._resourceContexts),t.attached=!1}_isManipulatorItemVisible(t){return t.visibilityPredicate===i.Always||(this._isToolEditable?t.visibilityPredicate===i.WhenToolEditable:t.visibilityPredicate===i.WhenToolNotEditable)}}export{e as ManipulatorCollection,i as ManipulatorVisibilityPredicate};