konva/src/PointerEvents.ts

68 lines
1.6 KiB
TypeScript
Raw Normal View History

2021-05-05 22:19:24 +08:00
import { KonvaEventObject } from './Node.js';
import { Konva } from './Global.js';
2019-03-27 04:30:00 +08:00
2021-05-05 22:19:24 +08:00
import { Shape } from './Shape.js';
import { Stage } from './Stage.js';
2019-03-27 04:30:00 +08:00
const Captures = new Map<number, Shape | Stage>();
2019-08-08 23:12:18 +08:00
// we may use this module for capturing touch events too
// so make sure we don't do something super specific to pointer
const SUPPORT_POINTER_EVENTS = Konva._global['PointerEvent'] !== undefined;
2019-06-01 22:09:51 +08:00
export interface KonvaPointerEvent extends KonvaEventObject<PointerEvent> {
2019-03-27 04:30:00 +08:00
pointerId: number;
}
export function getCapturedShape(pointerId: number) {
return Captures.get(pointerId);
}
export function createEvent(evt: PointerEvent): KonvaPointerEvent {
return {
evt,
2021-05-05 22:19:24 +08:00
pointerId: evt.pointerId,
2019-03-27 04:30:00 +08:00
} as any;
}
export function hasPointerCapture(pointerId: number, shape: Shape | Stage) {
return Captures.get(pointerId) === shape;
}
export function setPointerCapture(pointerId: number, shape: Shape | Stage) {
releaseCapture(pointerId);
const stage = shape.getStage();
if (!stage) return;
2019-03-27 04:30:00 +08:00
Captures.set(pointerId, shape);
2019-08-08 23:12:18 +08:00
if (SUPPORT_POINTER_EVENTS) {
shape._fire(
'gotpointercapture',
createEvent(new PointerEvent('gotpointercapture'))
);
}
2019-03-27 04:30:00 +08:00
}
export function releaseCapture(pointerId: number, target?: Shape | Stage) {
const shape = Captures.get(pointerId);
if (!shape) return;
const stage = shape.getStage();
2019-03-27 04:30:00 +08:00
if (stage && stage.content) {
2019-08-04 10:41:57 +08:00
// stage.content.releasePointerCapture(pointerId);
}
2019-03-27 04:30:00 +08:00
Captures.delete(pointerId);
2019-08-08 23:12:18 +08:00
if (SUPPORT_POINTER_EVENTS) {
shape._fire(
'lostpointercapture',
createEvent(new PointerEvent('lostpointercapture'))
);
}
2019-03-27 04:30:00 +08:00
}