django-vue3-admin-web/node_modules/@interactjs/utils/pointerUtils.js
2025-10-20 21:21:14 +08:00

245 lines
6.8 KiB
JavaScript

/**
* interact.js 1.10.27
*
* Copyright (c) 2012-present Taye Adeyemi <dev@taye.me>
* Released under the MIT License.
* https://raw.github.com/taye/interact.js/main/LICENSE
*/
import browser from './browser.js';
import domObjects from './domObjects.js';
import { getActualElement } from './domUtils.js';
import hypot from './hypot.js';
import is from './is.js';
export { default as pointerExtend } from './pointerExtend.js';
import './window.js';
import './isWindow.js';
function copyCoords(dest, src) {
dest.page = dest.page || {};
dest.page.x = src.page.x;
dest.page.y = src.page.y;
dest.client = dest.client || {};
dest.client.x = src.client.x;
dest.client.y = src.client.y;
dest.timeStamp = src.timeStamp;
}
function setCoordDeltas(targetObj, prev, cur) {
targetObj.page.x = cur.page.x - prev.page.x;
targetObj.page.y = cur.page.y - prev.page.y;
targetObj.client.x = cur.client.x - prev.client.x;
targetObj.client.y = cur.client.y - prev.client.y;
targetObj.timeStamp = cur.timeStamp - prev.timeStamp;
}
function setCoordVelocity(targetObj, delta) {
const dt = Math.max(delta.timeStamp / 1000, 0.001);
targetObj.page.x = delta.page.x / dt;
targetObj.page.y = delta.page.y / dt;
targetObj.client.x = delta.client.x / dt;
targetObj.client.y = delta.client.y / dt;
targetObj.timeStamp = dt;
}
function setZeroCoords(targetObj) {
targetObj.page.x = 0;
targetObj.page.y = 0;
targetObj.client.x = 0;
targetObj.client.y = 0;
}
function isNativePointer(pointer) {
return pointer instanceof domObjects.Event || pointer instanceof domObjects.Touch;
}
// Get specified X/Y coords for mouse or event.touches[0]
function getXY(type, pointer, xy) {
xy = xy || {};
type = type || 'page';
xy.x = pointer[type + 'X'];
xy.y = pointer[type + 'Y'];
return xy;
}
function getPageXY(pointer, page) {
page = page || {
x: 0,
y: 0
};
// Opera Mobile handles the viewport and scrolling oddly
if (browser.isOperaMobile && isNativePointer(pointer)) {
getXY('screen', pointer, page);
page.x += window.scrollX;
page.y += window.scrollY;
} else {
getXY('page', pointer, page);
}
return page;
}
function getClientXY(pointer, client) {
client = client || {};
if (browser.isOperaMobile && isNativePointer(pointer)) {
// Opera Mobile handles the viewport and scrolling oddly
getXY('screen', pointer, client);
} else {
getXY('client', pointer, client);
}
return client;
}
function getPointerId(pointer) {
return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier;
}
function setCoords(dest, pointers, timeStamp) {
const pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0];
getPageXY(pointer, dest.page);
getClientXY(pointer, dest.client);
dest.timeStamp = timeStamp;
}
function getTouchPair(event) {
const touches = [];
// array of touches is supplied
if (is.array(event)) {
touches[0] = event[0];
touches[1] = event[1];
}
// an event
else {
if (event.type === 'touchend') {
if (event.touches.length === 1) {
touches[0] = event.touches[0];
touches[1] = event.changedTouches[0];
} else if (event.touches.length === 0) {
touches[0] = event.changedTouches[0];
touches[1] = event.changedTouches[1];
}
} else {
touches[0] = event.touches[0];
touches[1] = event.touches[1];
}
}
return touches;
}
function pointerAverage(pointers) {
const average = {
pageX: 0,
pageY: 0,
clientX: 0,
clientY: 0,
screenX: 0,
screenY: 0
};
for (const pointer of pointers) {
for (const prop in average) {
average[prop] += pointer[prop];
}
}
for (const prop in average) {
average[prop] /= pointers.length;
}
return average;
}
function touchBBox(event) {
if (!event.length) {
return null;
}
const touches = getTouchPair(event);
const minX = Math.min(touches[0].pageX, touches[1].pageX);
const minY = Math.min(touches[0].pageY, touches[1].pageY);
const maxX = Math.max(touches[0].pageX, touches[1].pageX);
const maxY = Math.max(touches[0].pageY, touches[1].pageY);
return {
x: minX,
y: minY,
left: minX,
top: minY,
right: maxX,
bottom: maxY,
width: maxX - minX,
height: maxY - minY
};
}
function touchDistance(event, deltaSource) {
const sourceX = deltaSource + 'X';
const sourceY = deltaSource + 'Y';
const touches = getTouchPair(event);
const dx = touches[0][sourceX] - touches[1][sourceX];
const dy = touches[0][sourceY] - touches[1][sourceY];
return hypot(dx, dy);
}
function touchAngle(event, deltaSource) {
const sourceX = deltaSource + 'X';
const sourceY = deltaSource + 'Y';
const touches = getTouchPair(event);
const dx = touches[1][sourceX] - touches[0][sourceX];
const dy = touches[1][sourceY] - touches[0][sourceY];
const angle = 180 * Math.atan2(dy, dx) / Math.PI;
return angle;
}
function getPointerType(pointer) {
return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] :
// if the PointerEvent API isn't available, then the "pointer" must
// be either a MouseEvent, TouchEvent, or Touch object
/touch/.test(pointer.type || '') || pointer instanceof domObjects.Touch ? 'touch' : 'mouse';
}
// [ event.target, event.currentTarget ]
function getEventTargets(event) {
const path = is.func(event.composedPath) ? event.composedPath() : event.path;
return [getActualElement(path ? path[0] : event.target), getActualElement(event.currentTarget)];
}
function newCoords() {
return {
page: {
x: 0,
y: 0
},
client: {
x: 0,
y: 0
},
timeStamp: 0
};
}
function coordsToEvent(coords) {
const event = {
coords,
get page() {
return this.coords.page;
},
get client() {
return this.coords.client;
},
get timeStamp() {
return this.coords.timeStamp;
},
get pageX() {
return this.coords.page.x;
},
get pageY() {
return this.coords.page.y;
},
get clientX() {
return this.coords.client.x;
},
get clientY() {
return this.coords.client.y;
},
get pointerId() {
return this.coords.pointerId;
},
get target() {
return this.coords.target;
},
get type() {
return this.coords.type;
},
get pointerType() {
return this.coords.pointerType;
},
get buttons() {
return this.coords.buttons;
},
preventDefault() {}
};
return event;
}
export { coordsToEvent, copyCoords, getClientXY, getEventTargets, getPageXY, getPointerId, getPointerType, getTouchPair, getXY, isNativePointer, newCoords, pointerAverage, setCoordDeltas, setCoordVelocity, setCoords, setZeroCoords, touchAngle, touchBBox, touchDistance };
//# sourceMappingURL=pointerUtils.js.map