|
| 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