mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 20:38:52 +00:00
84 lines
1.7 KiB
TypeScript
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;
|
|
}
|
|
}
|