UNPKG

konva

Version:

HTML5 2d canvas library.

111 lines (110 loc) 3.89 kB
import { Konva } from "./Global.js"; import { Util } from "./Util.js"; export const DD = { get isDragging() { let flag = false; DD._dragElements.forEach((elem) => { if (elem.dragStatus === 'dragging') { flag = true; } }); return flag; }, justDragged: false, get node() { let node; DD._dragElements.forEach((elem) => { node = elem.node; }); return node; }, _dragElements: new Map(), _drag(evt) { const nodesToFireEvents = []; DD._dragElements.forEach((elem, key) => { const { node } = elem; const stage = node.getStage(); stage.setPointersPositions(evt); if (elem.pointerId === undefined) { elem.pointerId = Util._getFirstPointerId(evt); } const pos = stage._changedPointerPositions.find((pos) => pos.id === elem.pointerId); if (!pos) { return; } if (elem.dragStatus !== 'dragging') { const dragDistance = node.dragDistance(); const distance = Math.max(Math.abs(pos.x - elem.startPointerPos.x), Math.abs(pos.y - elem.startPointerPos.y)); if (distance < dragDistance) { return; } node.startDrag({ evt }); if (!node.isDragging()) { return; } } node._setDragPosition(evt, elem); nodesToFireEvents.push(node); }); nodesToFireEvents.forEach((node) => { node.fire('dragmove', { type: 'dragmove', target: node, evt: evt, }, true); }); }, _endDragBefore(evt) { const drawNodes = []; DD._dragElements.forEach((elem) => { const { node } = elem; const stage = node.getStage(); if (evt) { stage.setPointersPositions(evt); } const pos = stage._changedPointerPositions.find((pos) => pos.id === elem.pointerId); if (!pos) { return; } if (elem.dragStatus === 'dragging' || elem.dragStatus === 'stopped') { DD.justDragged = true; Konva._mouseListenClick = false; Konva._touchListenClick = false; Konva._pointerListenClick = false; elem.dragStatus = 'stopped'; } const drawNode = elem.node.getLayer() || (elem.node instanceof Konva['Stage'] && elem.node); if (drawNode && drawNodes.indexOf(drawNode) === -1) { drawNodes.push(drawNode); } }); drawNodes.forEach((drawNode) => { drawNode.draw(); }); }, _endDragAfter(evt) { DD._dragElements.forEach((elem, key) => { if (elem.dragStatus === 'stopped') { elem.node.fire('dragend', { type: 'dragend', target: elem.node, evt: evt, }, true); } if (elem.dragStatus !== 'dragging') { DD._dragElements.delete(key); } }); }, }; if (Konva.isBrowser) { window.addEventListener('mouseup', DD._endDragBefore, true); window.addEventListener('touchend', DD._endDragBefore, true); window.addEventListener('touchcancel', DD._endDragBefore, true); window.addEventListener('mousemove', DD._drag); window.addEventListener('touchmove', DD._drag); window.addEventListener('mouseup', DD._endDragAfter, false); window.addEventListener('touchend', DD._endDragAfter, false); window.addEventListener('touchcancel', DD._endDragAfter, false); }