Files
AFFiNE-Mirror/blocksuite/framework/block-std/src/event/state/pointer.ts
2024-12-20 15:38:06 +08:00

84 lines
1.7 KiB
TypeScript

import { UIEventState } from '../base.js';
type PointerEventStateOptions = {
event: PointerEvent;
rect: DOMRect;
startX: number;
startY: number;
last: PointerEventState | null;
};
type Point = { x: number; y: number };
export class PointerEventState extends UIEventState {
button: number;
containerOffset: Point;
delta: Point;
keys: {
shift: boolean;
cmd: boolean;
alt: boolean;
};
point: Point;
pressure: number;
raw: PointerEvent;
start: Point;
override type = 'pointerState';
get x() {
return this.point.x;
}
get y() {
return this.point.y;
}
constructor({ event, rect, startX, startY, last }: PointerEventStateOptions) {
super(event);
const offsetX = event.clientX - rect.left;
const offsetY = event.clientY - rect.top;
this.raw = event;
this.point = { x: offsetX, y: offsetY };
this.containerOffset = { x: rect.left, y: rect.top };
this.start = { x: startX, y: startY };
this.delta = last
? { x: offsetX - last.point.x, y: offsetY - last.point.y }
: { x: 0, y: 0 };
this.keys = {
shift: event.shiftKey,
cmd: event.metaKey || event.ctrlKey,
alt: event.altKey,
};
this.button = last?.button || event.button;
this.pressure = event.pressure;
}
}
export class MultiPointerEventState extends UIEventState {
pointers: PointerEventState[];
override type = 'multiPointerState';
constructor(event: PointerEvent, pointers: PointerEventState[]) {
super(event);
this.pointers = pointers;
}
}
declare global {
interface BlockSuiteUIEventState {
pointerState: PointerEventState;
multiPointerState: MultiPointerEventState;
}
}