-
Notifications
You must be signed in to change notification settings - Fork 377
Implement drop-on-canvas + linkconnectoradapter consolidation #5898
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
9a18d37
939cbe0
e3e1d2e
5c6c21c
f624940
48f5087
369da53
22a1c61
70651dc
c227d60
9d668a1
b99d70d
19c538c
263b280
bef712e
e7f0ee4
20d136d
3f4a806
e136b89
6685e00
0aa971b
9d32b4c
e879bd5
f348902
d780296
8eec7fb
f99d8c1
65ec322
a2be36a
88cd60f
381d97a
e9ffce4
99aaa4e
57810b9
9b39835
c050115
839d8a5
4f6eaea
76c718e
0f46452
23f3e17
0627a71
1ca3d75
ecc5bed
0e33672
9de27ad
18b4f56
4b95ef9
8da5ae3
247e395
1c11dcc
f13a45c
21cc208
066a755
5e3c91f
a71b99d
d5a5621
d18a604
87e410d
35bc2f9
aed6a4e
768b6e5
47781c7
f198e13
6cc0a1e
634dec5
bae44be
f271fed
e04bf8a
d2f3051
fafd374
d9a283b
b00e429
4d7c0d7
d1f2734
4c985f7
2ddb8f3
89a2315
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion' | ||
import type { | ||
CanvasPointerEvent, | ||
CanvasPointerExtensions | ||
} from '@/lib/litegraph/src/types/events' | ||
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' | ||
|
||
type PointerOffsets = { | ||
x: number | ||
y: number | ||
} | ||
|
||
const pointerHistory = new Map<number, PointerOffsets>() | ||
|
||
const defineEnhancements = ( | ||
event: PointerEvent, | ||
enhancement: CanvasPointerExtensions | ||
) => { | ||
Object.defineProperties(event, { | ||
canvasX: { value: enhancement.canvasX, configurable: true, writable: true }, | ||
canvasY: { value: enhancement.canvasY, configurable: true, writable: true }, | ||
deltaX: { value: enhancement.deltaX, configurable: true, writable: true }, | ||
deltaY: { value: enhancement.deltaY, configurable: true, writable: true }, | ||
safeOffsetX: { | ||
value: enhancement.safeOffsetX, | ||
configurable: true, | ||
writable: true | ||
}, | ||
safeOffsetY: { | ||
value: enhancement.safeOffsetY, | ||
configurable: true, | ||
writable: true | ||
} | ||
}) | ||
} | ||
|
||
const createEnhancement = (event: PointerEvent): CanvasPointerExtensions => { | ||
const conversion = useSharedCanvasPositionConversion() | ||
conversion.update() | ||
|
||
const [canvasX, canvasY] = conversion.clientPosToCanvasPos([ | ||
event.clientX, | ||
event.clientY | ||
]) | ||
|
||
const canvas = useCanvasStore().getCanvas() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [quality] low Priority Issue: Potential undefined canvas access without null check |
||
const { offset, scale } = canvas.ds | ||
|
||
const [originClientX, originClientY] = conversion.canvasPosToClientPos([0, 0]) | ||
const left = originClientX - offset[0] * scale | ||
const top = originClientY - offset[1] * scale | ||
|
||
const safeOffsetX = event.clientX - left | ||
const safeOffsetY = event.clientY - top | ||
|
||
const previous = pointerHistory.get(event.pointerId) | ||
const deltaX = previous ? safeOffsetX - previous.x : 0 | ||
const deltaY = previous ? safeOffsetY - previous.y : 0 | ||
pointerHistory.set(event.pointerId, { x: safeOffsetX, y: safeOffsetY }) | ||
|
||
return { canvasX, canvasY, deltaX, deltaY, safeOffsetX, safeOffsetY } | ||
} | ||
|
||
export const toCanvasPointerEvent = <T extends PointerEvent>( | ||
event: T | ||
): T & CanvasPointerEvent => { | ||
const enhancement = createEnhancement(event) | ||
defineEnhancements(event, enhancement) | ||
return event as T & CanvasPointerEvent | ||
} | ||
|
||
export const clearCanvasPointerHistory = (pointerId: number) => { | ||
pointerHistory.delete(pointerId) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[performance] medium Priority
Issue: Pointer history map grows unbounded without cleanup of stale entries
Context: pointerHistory Map on line 13 accumulates entries for all pointer IDs but only explicitly cleans up when clearCanvasPointerHistory is called, which may not happen for all pointers
Suggestion: Add periodic cleanup or use WeakMap if possible, or implement automatic cleanup in pointerup/pointercancel events