@projectstorm/react-canvas-core
Version:
25 lines • 25.8 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["projectstorm/react-canvas-core"]=t():e["projectstorm/react-canvas-core"]=t()}(self,(()=>(()=>{"use strict";var e={n:t=>{var i=t&&t.__esModule?()=>t.default:()=>t;return e.d(i,{a:i}),i},d:(t,i)=>{for(var s in i)e.o(i,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{AbstractDisplacementState:()=>ae,AbstractFactory:()=>U,AbstractModelFactory:()=>X,AbstractReactFactory:()=>z,Action:()=>d,ActionEventBus:()=>v,BaseEntity:()=>B,BaseModel:()=>R,BaseObserver:()=>o,BasePositionModel:()=>j,CanvasEngine:()=>w,CanvasModel:()=>F,CanvasWidget:()=>G,DefaultState:()=>pe,DeleteItemsAction:()=>x,DragCanvasState:()=>ce,FactoryBank:()=>l,InputType:()=>h,LayerModel:()=>Q,MoveItemsState:()=>ge,PanAndZoomCanvasAction:()=>y,PeformanceWidget:()=>se,SelectingState:()=>de,SelectionBoxLayerFactory:()=>ie,SelectionBoxState:()=>he,SelectionBoxWidget:()=>te,SelectionLayerModel:()=>ee,SmartLayerWidget:()=>H,State:()=>re,StateMachine:()=>L,Toolkit:()=>n,TransformLayerWidget:()=>q,ZoomCanvasAction:()=>m});const i=require("lodash/debounce");var s=e.n(i);class n{static UID(){return n.TESTING?(n.TESTING_UID++,`${n.TESTING_UID}`):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))}static closest(e,t){return Element.prototype.closest||(Element.prototype.closest=function(e){var t=this;do{if(Element.prototype.matches.call(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null}),e.closest(t)}}n.TESTING=!1,n.TESTING_UID=0;class o{constructor(){this.listeners={}}fireEventInternal(e,t,i){this.iterateListeners((s=>{if(!e&&!i.firing)return!1;s[t]&&s[t](i)}))}fireEvent(e,t){e=Object.assign({firing:!0,stopPropagation:()=>{e.firing=!1}},e),this.fireEventInternal(!0,"eventWillFire",Object.assign(Object.assign({},e),{function:t})),this.fireEventInternal(!1,t,e),this.fireEventInternal(!0,"eventDidFire",Object.assign(Object.assign({},e),{function:t}))}iterateListeners(e){for(let t in this.listeners){if(!1===e(this.listeners[t]))return}}getListenerHandle(e){for(let t in this.listeners)if(this.listeners[t]===e)return{id:t,listener:e,deregister:()=>{delete this.listeners[t]}}}registerListener(e){const t=n.UID();return this.listeners[t]=e,{id:t,listener:e,deregister:()=>{delete this.listeners[t]}}}deregisterListener(e){if("object"==typeof e)return e.deregister(),!0;const t=this.getListenerHandle(e);return!!t&&(t.deregister(),!0)}}const r=require("lodash/values");var a=e.n(r);class l extends o{constructor(){super(),this.factories={}}getFactories(){return a()(this.factories)}clearFactories(){for(let e in this.factories)this.deregisterFactory(e)}getFactory(e){if(!this.factories[e])throw new Error(`Cannot find factory with type [${e}]`);return this.factories[e]}registerFactory(e){e.setFactoryBank(this),this.factories[e.getType()]=e,this.fireEvent({factory:e},"factoryAdded")}deregisterFactory(e){const t=this.factories[e];t.setFactoryBank(null),delete this.factories[e],this.fireEvent({factory:t},"factoryRemoved")}}const c=require("@projectstorm/geometry");var h;!function(e){e.MOUSE_DOWN="mouse-down",e.MOUSE_UP="mouse-up",e.MOUSE_MOVE="mouse-move",e.MOUSE_WHEEL="mouse-wheel",e.KEY_DOWN="key-down",e.KEY_UP="key-up",e.TOUCH_START="touch-start",e.TOUCH_END="touch-end",e.TOUCH_MOVE="touch-move"}(h||(h={}));class d{constructor(e){this.options=e,this.id=n.UID()}setEngine(e){this.engine=e}}const g=require("lodash/filter");var p=e.n(g);const u=require("lodash/keys");var f=e.n(u);class v{constructor(e){this.actions={},this.engine=e,this.keys={}}getKeys(){return f()(this.keys)}registerAction(e){return e.setEngine(this.engine),this.actions[e.id]=e,()=>{this.deregisterAction(e)}}deregisterAction(e){e.setEngine(null),delete this.actions[e.id]}getActionsForType(e){return p()(this.actions,(t=>t.options.type===e))}getModelForEvent(e){return e.model?e.model:this.engine.getMouseElement(e.event)}getActionsForEvent(e){const{event:t}=e;return"mousedown"===t.type?this.getActionsForType(h.MOUSE_DOWN):"mouseup"===t.type?this.getActionsForType(h.MOUSE_UP):"keydown"===t.type?(this.keys[t.key.toLowerCase()]=!0,this.getActionsForType(h.KEY_DOWN)):"keyup"===t.type?(delete this.keys[t.key.toLowerCase()],this.getActionsForType(h.KEY_UP)):"mousemove"===t.type?this.getActionsForType(h.MOUSE_MOVE):"wheel"===t.type?this.getActionsForType(h.MOUSE_WHEEL):"touchstart"===t.type?this.getActionsForType(h.TOUCH_START):"touchend"===t.type?this.getActionsForType(h.TOUCH_END):"touchmove"===t.type?this.getActionsForType(h.TOUCH_MOVE):[]}fireAction(e){const t=this.getActionsForEvent(e);for(let i of t)i.options.fire(e)}}class y extends d{constructor(e={}){super({type:h.MOUSE_WHEEL,fire:t=>{const{event:i}=t;for(let e of this.engine.getModel().getLayers())e.allowRepaint(!1);const s=this.engine.getModel();if(i.stopPropagation(),i.ctrlKey){const t=this.engine.getModel().getZoomLevel()/100;let n=e.inverseZoom?i.deltaY:-i.deltaY;n/=3,s.getZoomLevel()+n>10&&s.setZoomLevel(s.getZoomLevel()+n);const o=s.getZoomLevel()/100,r=i.currentTarget.getBoundingClientRect(),a=r.width,l=r.height,c=a*o-a*t,h=l*o-l*t,d=i.clientX-r.left,g=i.clientY-r.top,p=(d-s.getOffsetX())/t/a,u=(g-s.getOffsetY())/t/l;s.setOffset(s.getOffsetX()-c*p,s.getOffsetY()-h*u)}else{let t=e.inverseZoom?-i.deltaY:i.deltaY,n=e.inverseZoom?-i.deltaX:i.deltaX;s.setOffset(s.getOffsetX()-n,s.getOffsetY()-t)}this.engine.repaintCanvas();for(let e of this.engine.getModel().getLayers())e.allowRepaint(!0)}})}}class m extends d{constructor(e={}){super({type:h.MOUSE_WHEEL,fire:t=>{const{event:i}=t;for(let e of this.engine.getModel().getLayers())e.allowRepaint(!1);const s=this.engine.getModel();i.stopPropagation();const n=this.engine.getModel().getZoomLevel()/100;let o=e.inverseZoom?-i.deltaY:i.deltaY;i.ctrlKey&&o%1!=0?o/=3:o/=60,s.getZoomLevel()+o>10&&s.setZoomLevel(s.getZoomLevel()+o);const r=s.getZoomLevel()/100,a=i.currentTarget.getBoundingClientRect(),l=a.width,c=a.height,h=l*r-l*n,d=c*r-c*n,g=i.clientX-a.left,p=i.clientY-a.top,u=(g-s.getOffsetX())/n/l,f=(p-s.getOffsetY())/n/c;s.setOffset(s.getOffsetX()-h*u,s.getOffsetY()-d*f),this.engine.repaintCanvas();for(let e of this.engine.getModel().getLayers())e.allowRepaint(!0)}})}}const E=require("lodash/forEach");var S=e.n(E);const M=require("lodash/isEqual");var O=e.n(M);class x extends d{constructor(e={}){const t=e.keyCodes||[46,8],i=Object.assign({ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1},e.modifiers);super({type:h.KEY_DOWN,fire:e=>{const{keyCode:s,ctrlKey:n,shiftKey:o,altKey:r,metaKey:a}=e.event;-1!==t.indexOf(s)&&O()({ctrlKey:n,shiftKey:o,altKey:r,metaKey:a},i)&&(S()(this.engine.getModel().getSelectedEntities(),(e=>{e.isLocked()||e.remove()})),this.engine.repaintCanvas())}})}}const A=require("lodash/last");var C=e.n(A);class L extends o{constructor(e){super(),this.engine=e,this.stateStack=[]}getCurrentState(){return this.currentState}pushState(e){this.stateStack.push(e),this.setState(e)}popState(){this.stateStack.pop(),this.setState(C()(this.stateStack))}setState(e){e.setEngine(this.engine),this.currentState&&this.currentState.deactivated(e);const t=this.currentState;this.currentState=e,this.currentState&&(this.currentState.activated(t),this.fireEvent({newState:e},"stateChanged"))}}class w extends o{constructor(e={}){super(),this.model=null,this.eventBus=new v(this),this.stateMachine=new L(this),this.layerFactories=new l,this.registerFactoryBank(this.layerFactories),this.options=Object.assign({registerDefaultDeleteItemsAction:!0,registerDefaultZoomCanvasAction:!0,repaintDebounceMs:0},e),!0===this.options.registerDefaultZoomCanvasAction?this.eventBus.registerAction(new m):!0===this.options.registerDefaultPanAndZoomCanvasAction&&this.eventBus.registerAction(new y),!0===this.options.registerDefaultDeleteItemsAction&&this.eventBus.registerAction(new x)}getStateMachine(){return this.stateMachine}getRelativeMousePoint(e){const t=this.getRelativePoint(e.clientX,e.clientY);return new c.Point((t.x-this.model.getOffsetX())/(this.model.getZoomLevel()/100),(t.y-this.model.getOffsetY())/(this.model.getZoomLevel()/100))}getRelativePoint(e,t){const i=this.canvas.getBoundingClientRect();return new c.Point(e-i.left,t-i.top)}registerFactoryBank(e){e.registerListener({factoryAdded:e=>{e.factory.setDiagramEngine(this)},factoryRemoved:e=>{e.factory.setDiagramEngine(null)}})}getActionEventBus(){return this.eventBus}getLayerFactories(){return this.layerFactories}getFactoryForLayer(e){return"string"==typeof e?this.layerFactories.getFactory(e):this.layerFactories.getFactory(e.getType())}setModel(e){this.model=e,this.canvas&&requestAnimationFrame((()=>{this.repaintCanvas()}))}getModel(){return this.model}repaintCanvas(e){const{repaintDebounceMs:t}=this.options,i=()=>{this.iterateListeners((e=>{e.repaintCanvas&&e.repaintCanvas()}))};let n=i;if(t>0&&(n=s()(i,t)),e)return new Promise((e=>{const t=this.registerListener({rendered:()=>{e(),t.deregister()}});n()}));n()}setCanvas(e){this.canvas!==e&&(this.canvas=e,e&&this.fireEvent({},"canvasReady"))}getCanvas(){return this.canvas}getMouseElement(e){return null}zoomToFit(){const e=this.canvas.clientWidth/this.canvas.scrollWidth,t=this.canvas.clientHeight/this.canvas.scrollHeight,i=e<t?e:t;this.model.setZoomLevel(this.model.getZoomLevel()*i),this.model.setOffset(0,0),this.repaintCanvas()}}const D=require("lodash/flatMap");var b=e.n(D);const T=require("lodash/map");var Y=e.n(T);const k=require("lodash/cloneDeep");var P=e.n(k);class B extends o{constructor(e={}){super(),this.options=Object.assign({id:n.UID()},e)}getOptions(){return this.options}getID(){return this.options.id}doClone(e={},t){}clone(e={}){if(e[this.options.id])return e[this.options.id];let t=P()(this);return t.options=Object.assign(Object.assign({},this.options),{id:n.UID()}),t.clearListeners(),e[this.options.id]=t,this.doClone(e,t),t}clearListeners(){this.listeners={}}deserialize(e){this.options.id=e.data.id,this.options.locked=e.data.locked}serialize(){return{id:this.options.id,locked:this.options.locked}}fireEvent(e,t){super.fireEvent(Object.assign({entity:this},e),t)}isLocked(){return this.options.locked}setLocked(e=!0){this.options.locked=e,this.fireEvent({locked:e},"lockChanged")}}class F extends B{constructor(e={}){super(Object.assign({zoom:100,gridSize:0,offsetX:0,offsetY:0},e)),this.layers=[]}getSelectionEntities(){return b()(this.layers,(e=>e.getSelectionEntities()))}getSelectedEntities(){return p()(this.getSelectionEntities(),(e=>e.isSelected()))}clearSelection(){S()(this.getSelectedEntities(),(e=>{e.setSelected(!1)}))}getModels(){return b()(this.layers,(e=>a()(e.getModels())))}addLayer(e){e.setParent(this),e.registerListener({entityRemoved:e=>{}}),this.layers.push(e)}removeLayer(e){const t=this.layers.indexOf(e);return-1!==t&&(this.layers.splice(t,1),!0)}getLayers(){return this.layers}setGridSize(e=0){this.options.gridSize=e,this.fireEvent({size:e},"gridUpdated")}getGridPosition(e){return 0===this.options.gridSize?e:this.options.gridSize*Math.floor((e+this.options.gridSize/2)/this.options.gridSize)}deserializeModel(e,t){const i={},s={},n={},o={data:e,engine:t,registerModel:e=>{i[e.getID()]=e,n[e.getID()]&&n[e.getID()](e)},getModel:e=>i[e]?Promise.resolve(i[e]):(s[e]||(s[e]=new Promise((t=>{n[e]=t}))),s[e])};this.deserialize(o)}deserialize(e){super.deserialize(e),this.options.offsetX=e.data.offsetX,this.options.offsetY=e.data.offsetY,this.options.zoom=e.data.zoom,this.options.gridSize=e.data.gridSize,S()(e.data.layers,(t=>{const i=e.engine.getFactoryForLayer(t.type).generateModel({initialConfig:t});i.deserialize(Object.assign(Object.assign({},e),{data:t})),this.addLayer(i)}))}serialize(){return Object.assign(Object.assign({},super.serialize()),{offsetX:this.options.offsetX,offsetY:this.options.offsetY,zoom:this.options.zoom,gridSize:this.options.gridSize,layers:Y()(this.layers,(e=>e.serialize()))})}setZoomLevel(e){this.options.zoom=e,this.fireEvent({zoom:e},"zoomUpdated")}setOffset(e,t){this.options.offsetX=e,this.options.offsetY=t,this.fireEvent({offsetX:e,offsetY:t},"offsetUpdated")}setOffsetX(e){this.setOffset(e,this.options.offsetY)}setOffsetY(e){this.setOffset(this.options.offsetX,e)}getOffsetY(){return this.options.offsetY}getOffsetX(){return this.options.offsetX}getZoomLevel(){return this.options.zoom}}class U{constructor(e){this.type=e}setDiagramEngine(e){this.engine=e}setFactoryBank(e){this.bank=e}getType(){return this.type}}class X extends U{}class z extends X{}class R extends B{constructor(e){super(e)}performanceTune(){return!0}getParentCanvasModel(){return this.parent?this.parent instanceof F?this.parent:this.parent instanceof R?this.parent.getParentCanvasModel():null:null}getParent(){return this.parent}setParent(e){this.parent=e}getSelectionEntities(){return[this]}serialize(){return Object.assign(Object.assign({},super.serialize()),{type:this.options.type,selected:this.options.selected,extras:this.options.extras})}deserialize(e){super.deserialize(e),this.options.extras=e.data.extras,this.options.selected=e.data.selected}getType(){return this.options.type}isSelected(){return this.options.selected}isLocked(){return!!super.isLocked()||!!this.parent&&this.parent.isLocked()}setSelected(e=!0){this.options.selected!==e&&(this.options.selected=e,this.fireEvent({isSelected:e},"selectionChanged"))}remove(){this.fireEvent({},"entityRemoved")}}class j extends R{constructor(e){super(e),this.position=e.position||new c.Point(0,0)}setPosition(e,t){e instanceof c.Point?this.position=e:this.position=new c.Point(e,t),this.fireEvent({},"positionChanged")}getBoundingBox(){return c.Rectangle.fromPointAndSize(this.position,0,0)}deserialize(e){super.deserialize(e),this.position=new c.Point(e.data.x,e.data.y)}serialize(){return Object.assign(Object.assign({},super.serialize()),{x:this.position.x,y:this.position.y})}getPosition(){return this.position}getX(){return this.position.x}getY(){return this.position.y}}const _=require("react"),I=require("@emotion/styled");var W=e.n(I);const K=require("@emotion/react");var Z,N;!function(e){const t=K.css`
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
pointer-events: none;
transform-origin: 0 0;
width: 100%;
height: 100%;
overflow: visible;
`;e.DivLayer=W().div`
${t}
`,e.SvgLayer=W().svg`
${t}
`}(Z||(Z={}));class q extends _.Component{constructor(e){super(e),this.state={}}getTransform(){const e=this.props.layer.getParent();return`\n\t\t\ttranslate(\n\t\t\t\t${e.getOffsetX()}px,\n\t\t\t\t${e.getOffsetY()}px)\n\t\t\tscale(\n\t\t\t\t${e.getZoomLevel()/100}\n\t\t\t)\n \t`}getTransformStyle(){return this.props.layer.getOptions().transformed?{transform:this.getTransform()}:{}}render(){return this.props.layer.getOptions().isSvg?_.createElement(Z.SvgLayer,{style:this.getTransformStyle()},this.props.children):_.createElement(Z.DivLayer,{style:this.getTransformStyle()},this.props.children)}}class H extends _.Component{shouldComponentUpdate(){return this.props.layer.isRepaintEnabled()}render(){return this.props.engine.getFactoryForLayer(this.props.layer).generateReactWidget({model:this.props.layer})}}!function(e){e.Canvas=W().div`
position: relative;
cursor: move;
overflow: hidden;
`}(N||(N={}));class G extends _.Component{constructor(e){super(e),this.ref=_.createRef(),this.state={action:null,diagramEngineListener:null}}componentWillUnmount(){this.props.engine.deregisterListener(this.canvasListener),this.props.engine.setCanvas(null),document.removeEventListener("keyup",this.keyUp),document.removeEventListener("keydown",this.keyDown)}registerCanvas(){this.props.engine.setCanvas(this.ref.current),this.props.engine.iterateListeners((e=>{e.rendered&&e.rendered()}))}componentDidUpdate(){this.registerCanvas()}componentDidMount(){this.canvasListener=this.props.engine.registerListener({repaintCanvas:()=>{this.forceUpdate()}}),this.keyDown=e=>{this.props.engine.getActionEventBus().fireAction({event:e})},this.keyUp=e=>{this.props.engine.getActionEventBus().fireAction({event:e})},document.addEventListener("keyup",this.keyUp),document.addEventListener("keydown",this.keyDown),this.registerCanvas()}render(){const e=this.props.engine.getModel();return _.createElement(N.Canvas,{className:this.props.className,ref:this.ref,onWheel:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onMouseDown:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onMouseUp:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onMouseMove:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onTouchStart:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onTouchEnd:e=>{this.props.engine.getActionEventBus().fireAction({event:e})},onTouchMove:e=>{this.props.engine.getActionEventBus().fireAction({event:e})}},e.getLayers().map((e=>_.createElement(q,{layer:e,key:e.getID()},_.createElement(H,{layer:e,engine:this.props.engine,key:e.getID()})))))}}const V=require("lodash/mapValues");var $,J=e.n(V);class Q extends R{constructor(e={}){super(e),this.models={},this.repaintEnabled=!0}deserialize(e){super.deserialize(e),this.options.isSvg=!!e.data.isSvg,this.options.transformed=!!e.data.transformed,S()(e.data.models,(t=>{const i=this.getChildModelFactoryBank(e.engine).getFactory(t.type).generateModel({initialConfig:t});i.deserialize(Object.assign(Object.assign({},e),{data:t})),this.addModel(i)}))}serialize(){return Object.assign(Object.assign({},super.serialize()),{isSvg:this.options.isSvg,transformed:this.options.transformed,models:J()(this.models,(e=>e.serialize()))})}isRepaintEnabled(){return this.repaintEnabled}allowRepaint(e=!0){this.repaintEnabled=e}remove(){this.parent&&this.parent.removeLayer(this),super.remove()}addModel(e){e.setParent(this),this.models[e.getID()]=e}getSelectionEntities(){return b()(this.models,(e=>e.getSelectionEntities()))}getModels(){return this.models}getModel(e){return this.models[e]}removeModel(e){const t="string"==typeof e?e:e.getID();return!!this.models[t]&&(delete this.models[t],!0)}}class ee extends Q{constructor(){super({transformed:!1,isSvg:!1,type:"selection"})}setBox(e){this.box=e}getChildModelFactoryBank(){return null}}!function(e){e.Container=W().div`
position: absolute;
background-color: rgba(0, 192, 255, 0.2);
border: solid 2px rgb(0, 192, 255);
`}($||($={}));class te extends _.Component{render(){const{rect:e}=this.props;return e?_.createElement($.Container,{style:{top:e.top,left:e.left,width:e.width,height:e.height}}):null}}class ie extends z{constructor(){super("selection")}generateModel(e){return new ee}generateReactWidget(e){return _.createElement(te,{rect:e.model.box})}}class se extends _.Component{shouldComponentUpdate(e,t,i){return!this.props.model.performanceTune()||(this.props.model!==e.model||!O()(this.props.serialized,e.serialized))}render(){return this.props.children()}}const ne=require("lodash/intersection");var oe=e.n(ne);class re{constructor(e){this.actions=[],this.keys=[],this.childStates=[],this.options=e}setEngine(e){this.engine=e}getOptions(){return this.options}eject(){this.engine.getStateMachine().popState()}transitionWithEvent(e,t){this.engine.getStateMachine().pushState(e),this.engine.getActionEventBus().fireAction(t)}registerAction(e){this.actions.push(e)}tryActivateParentState(e){return this.keys.length>0&&!this.isKeysFullfilled(e)&&(this.eject(),!0)}tryActivateChildState(e){const t=this.findStateToActivate(e);return!!t&&(this.engine.getStateMachine().pushState(t),!0)}findStateToActivate(e){for(let t of this.childStates)if(t.isKeysFullfilled(e))return t;return null}isKeysFullfilled(e){return oe()(this.keys,e).length===this.keys.length}activated(e){const t=this.engine.getActionEventBus().getKeys();if(!this.tryActivateParentState(t)&&!this.tryActivateChildState(t)){this.handler1=this.engine.getActionEventBus().registerAction(new d({type:h.KEY_DOWN,fire:()=>{this.tryActivateChildState(this.engine.getActionEventBus().getKeys())}})),this.handler2=this.engine.getActionEventBus().registerAction(new d({type:h.KEY_UP,fire:()=>{this.tryActivateParentState(this.engine.getActionEventBus().getKeys())}}));for(let e of this.actions)this.engine.getActionEventBus().registerAction(e)}}deactivated(e){this.handler1&&this.handler1(),this.handler2&&this.handler2();for(let e of this.actions)this.engine.getActionEventBus().deregisterAction(e)}}class ae extends re{constructor(e){super(e),this.registerAction(new d({type:h.MOUSE_DOWN,fire:e=>{const{clientX:t,clientY:i}=e.event;this.handleMoveStart(t,i)}})),this.registerAction(new d({type:h.MOUSE_MOVE,fire:e=>{const{event:t}=e;if(0===t.buttons)return void this.eject();const{clientX:i,clientY:s}=t;this.handleMove(i,s,t)}})),this.registerAction(new d({type:h.MOUSE_UP,fire:()=>this.handleMoveEnd()})),this.registerAction(new d({type:h.TOUCH_START,fire:e=>{const{clientX:t,clientY:i}=e.event.touches[0];this.handleMoveStart(t,i)}})),this.registerAction(new d({type:h.TOUCH_MOVE,fire:e=>{const{event:t}=e,{clientX:i,clientY:s}=t.touches[0];this.handleMove(i,s,t)}})),this.registerAction(new d({type:h.TOUCH_END,fire:()=>this.handleMoveEnd()}))}handleMoveStart(e,t){this.initialX=e,this.initialY=t;const i=this.engine.getRelativePoint(e,t);this.initialXRelative=i.x,this.initialYRelative=i.y}handleMove(e,t,i){this.fireMouseMoved({displacementX:e-this.initialX,displacementY:t-this.initialY,virtualDisplacementX:(e-this.initialX)/(this.engine.getModel().getZoomLevel()/100),virtualDisplacementY:(t-this.initialY)/(this.engine.getModel().getZoomLevel()/100),event:i})}handleMoveEnd(){this.eject()}}var le=function(e,t,i,s){return new(i||(i=Promise))((function(n,o){function r(e){try{l(s.next(e))}catch(e){o(e)}}function a(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}l((s=s.apply(e,t||[])).next())}))};class ce extends ae{constructor(e={}){super({name:"drag-canvas"}),this.config=Object.assign({allowDrag:!0},e)}activated(e){const t=Object.create(null,{activated:{get:()=>super.activated}});return le(this,void 0,void 0,(function*(){t.activated.call(this,e),this.engine.getModel().clearSelection(),yield this.engine.repaintCanvas(!0);for(let e of this.engine.getModel().getLayers())e.allowRepaint(!1);this.initialCanvasX=this.engine.getModel().getOffsetX(),this.initialCanvasY=this.engine.getModel().getOffsetY()}))}deactivated(e){super.deactivated(e);for(let e of this.engine.getModel().getLayers())e.allowRepaint(!0)}fireMouseMoved(e){this.config.allowDrag&&(this.engine.getModel().setOffset(this.initialCanvasX+e.displacementX,this.initialCanvasY+e.displacementY),this.engine.repaintCanvas())}}class he extends ae{constructor(){super({name:"selection-box"})}activated(e){super.activated(e),this.layer=new ee,this.engine.getModel().addLayer(this.layer)}deactivated(e){super.deactivated(e),this.layer.remove(),this.engine.repaintCanvas()}getBoxDimensions(e){let t;if("touches"in e.event){const i=e.event.touches[0];t=this.engine.getRelativePoint(i.clientX,i.clientY)}else t=this.engine.getRelativePoint(e.event.clientX,e.event.clientY);return{left:t.x>this.initialXRelative?this.initialXRelative:t.x,top:t.y>this.initialYRelative?this.initialYRelative:t.y,width:Math.abs(t.x-this.initialXRelative),height:Math.abs(t.y-this.initialYRelative),right:t.x<this.initialXRelative?this.initialXRelative:t.x,bottom:t.y<this.initialYRelative?this.initialYRelative:t.y}}fireMouseMoved(e){this.layer.setBox(this.getBoxDimensions(e));const t=this.engine.getRelativeMousePoint({clientX:this.initialX,clientY:this.initialY});e.virtualDisplacementX<0&&(t.x-=Math.abs(e.virtualDisplacementX)),e.virtualDisplacementY<0&&(t.y-=Math.abs(e.virtualDisplacementY));const i=c.Rectangle.fromPointAndSize(t,Math.abs(e.virtualDisplacementX),Math.abs(e.virtualDisplacementY));for(let e of this.engine.getModel().getSelectionEntities())if(e.getBoundingBox){const t=e.getBoundingBox();i.containsPoint(t.getTopLeft())&&i.containsPoint(t.getBottomRight())?e.setSelected(!0):e.setSelected(!1)}this.engine.repaintCanvas()}}class de extends re{constructor(){super({name:"selecting"}),this.keys=["shift"],this.registerAction(new d({type:h.MOUSE_DOWN,fire:e=>{const t=this.engine.getActionEventBus().getModelForEvent(e);t?(t.setSelected(!0),this.engine.repaintCanvas()):this.transitionWithEvent(new he,e)}}))}}class ge extends ae{constructor(){super({name:"move-items"}),this.registerAction(new d({type:h.MOUSE_DOWN,fire:e=>{const t=this.engine.getActionEventBus().getModelForEvent(e);t&&(t.isSelected()||this.engine.getModel().clearSelection(),t.setSelected(!0),this.engine.repaintCanvas())}}))}activated(e){super.activated(e),this.initialPositions={}}fireMouseMoved(e){const t=this.engine.getModel().getSelectedEntities(),i=this.engine.getModel();for(let s of t)if(s instanceof j){if(s.isLocked())continue;this.initialPositions[s.getID()]||(this.initialPositions[s.getID()]={point:s.getPosition(),item:s});const t=this.initialPositions[s.getID()].point;s.setPosition(i.getGridPosition(t.x+e.virtualDisplacementX),i.getGridPosition(t.y+e.virtualDisplacementY))}this.engine.repaintCanvas()}}class pe extends re{constructor(){super({name:"default"}),this.childStates=[new de],this.registerAction(new d({type:h.MOUSE_DOWN,fire:e=>{this.engine.getActionEventBus().getModelForEvent(e)?this.transitionWithEvent(new ge,e):this.transitionWithEvent(new ce,e)}})),this.registerAction(new d({type:h.TOUCH_START,fire:e=>{this.transitionWithEvent(new ce,e)}}))}}return t})()));
//# sourceMappingURL=index.umd.js.map