Skip to content

Commit d2f3051

Browse files
committed
add canvasPointerEvent helper
1 parent e04bf8a commit d2f3051

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion'
2+
import type {
3+
CanvasPointerEvent,
4+
CanvasPointerExtensions
5+
} from '@/lib/litegraph/src/types/events'
6+
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
7+
8+
type PointerOffsets = {
9+
x: number
10+
y: number
11+
}
12+
13+
const pointerHistory = new Map<number, PointerOffsets>()
14+
15+
const defineEnhancements = (
16+
event: PointerEvent,
17+
enhancement: CanvasPointerExtensions
18+
) => {
19+
Object.defineProperties(event, {
20+
canvasX: { value: enhancement.canvasX, configurable: true, writable: true },
21+
canvasY: { value: enhancement.canvasY, configurable: true, writable: true },
22+
deltaX: { value: enhancement.deltaX, configurable: true, writable: true },
23+
deltaY: { value: enhancement.deltaY, configurable: true, writable: true },
24+
safeOffsetX: {
25+
value: enhancement.safeOffsetX,
26+
configurable: true,
27+
writable: true
28+
},
29+
safeOffsetY: {
30+
value: enhancement.safeOffsetY,
31+
configurable: true,
32+
writable: true
33+
}
34+
})
35+
}
36+
37+
const createEnhancement = (event: PointerEvent): CanvasPointerExtensions => {
38+
const conversion = useSharedCanvasPositionConversion()
39+
conversion.update()
40+
41+
const [canvasX, canvasY] = conversion.clientPosToCanvasPos([
42+
event.clientX,
43+
event.clientY
44+
])
45+
46+
const canvas = useCanvasStore().getCanvas()
47+
const { offset, scale } = canvas.ds
48+
49+
const [originClientX, originClientY] = conversion.canvasPosToClientPos([0, 0])
50+
const left = originClientX - offset[0] * scale
51+
const top = originClientY - offset[1] * scale
52+
53+
const safeOffsetX = event.clientX - left
54+
const safeOffsetY = event.clientY - top
55+
56+
const previous = pointerHistory.get(event.pointerId)
57+
const deltaX = previous ? safeOffsetX - previous.x : 0
58+
const deltaY = previous ? safeOffsetY - previous.y : 0
59+
pointerHistory.set(event.pointerId, { x: safeOffsetX, y: safeOffsetY })
60+
61+
return { canvasX, canvasY, deltaX, deltaY, safeOffsetX, safeOffsetY }
62+
}
63+
64+
export const toCanvasPointerEvent = <T extends PointerEvent>(
65+
event: T
66+
): T & CanvasPointerEvent => {
67+
const enhancement = createEnhancement(event)
68+
defineEnhancements(event, enhancement)
69+
return event as T & CanvasPointerEvent
70+
}
71+
72+
export const clearCanvasPointerHistory = (pointerId: number) => {
73+
pointerHistory.delete(pointerId)
74+
}

0 commit comments

Comments
 (0)