mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-28 02:34:10 +00:00
* [fix] Enable mouse gestures over video previews - fixes ctrl+scroll zoom and space+drag panning 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * [improve] Enhance code clarity in media gesture handling with descriptive constants * [clean] Remove dangling comment in handlePointer method * [improve] Use satisfies and partial mocking for better type safety in tests - Replace 'as any' with vi.mocked({partial: true}) for store mocks - Use 'satisfies Partial<Event>' for better event type checking - Remove 'not.toThrow' test as it tests default behavior - Improve test readability and type safety per review feedback * [improve] Test actual canvas existence check instead of side effects - Replace vague 'graceful handling' test with specific 'early return' test - Verify that getCanvas() is actually called to check canvas existence - Test early return behavior when canvas is null rather than just preventDefault side effect - More robust test that validates the intended logic flow * [refactor] Use localized mocking instead of global mock functions - Replace global mockGetCanvas and mockGet with in-situ vi.mocked() calls - Extract store functions directly in test cases for better locality - Follow DrJKL's suggestion for cleaner test structure - Maintains same test coverage with improved readability --------- Co-authored-by: Claude <noreply@anthropic.com>
84 lines
2.5 KiB
TypeScript
84 lines
2.5 KiB
TypeScript
import { computed } from 'vue'
|
|
|
|
import { app } from '@/scripts/app'
|
|
import { useCanvasStore } from '@/stores/graphStore'
|
|
import { useSettingStore } from '@/stores/settingStore'
|
|
|
|
/**
|
|
* Composable for handling canvas interactions from Vue components.
|
|
* This provides a unified way to forward events to the LiteGraph canvas
|
|
* and will be the foundation for migrating canvas interactions to Vue.
|
|
*/
|
|
export function useCanvasInteractions() {
|
|
const settingStore = useSettingStore()
|
|
const { getCanvas } = useCanvasStore()
|
|
|
|
const isStandardNavMode = computed(
|
|
() => settingStore.get('Comfy.Canvas.NavigationMode') === 'standard'
|
|
)
|
|
|
|
/**
|
|
* Handles wheel events from UI components that should be forwarded to canvas
|
|
* when appropriate (e.g., Ctrl+wheel for zoom in standard mode)
|
|
*/
|
|
const handleWheel = (event: WheelEvent) => {
|
|
// In standard mode, Ctrl+wheel should go to canvas for zoom
|
|
if (isStandardNavMode.value && (event.ctrlKey || event.metaKey)) {
|
|
event.preventDefault() // Prevent browser zoom
|
|
forwardEventToCanvas(event)
|
|
return
|
|
}
|
|
|
|
// In legacy mode, all wheel events go to canvas for zoom
|
|
if (!isStandardNavMode.value) {
|
|
event.preventDefault()
|
|
forwardEventToCanvas(event)
|
|
return
|
|
}
|
|
|
|
// Otherwise, let the component handle it normally
|
|
}
|
|
|
|
/**
|
|
* Handles pointer events from media elements that should potentially
|
|
* be forwarded to canvas (e.g., space+drag for panning)
|
|
*/
|
|
const handlePointer = (event: PointerEvent) => {
|
|
// Check if canvas exists using established pattern
|
|
const canvas = getCanvas()
|
|
if (!canvas) return
|
|
|
|
// Check conditions for forwarding events to canvas
|
|
const isSpacePanningDrag = canvas.read_only && event.buttons === 1 // Space key pressed + left mouse drag
|
|
const isMiddleMousePanning = event.buttons === 4 // Middle mouse button for panning
|
|
|
|
if (isSpacePanningDrag || isMiddleMousePanning) {
|
|
event.preventDefault()
|
|
event.stopPropagation()
|
|
forwardEventToCanvas(event)
|
|
return
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Forwards an event to the LiteGraph canvas
|
|
*/
|
|
const forwardEventToCanvas = (
|
|
event: WheelEvent | PointerEvent | MouseEvent
|
|
) => {
|
|
const canvasEl = app.canvas?.canvas
|
|
if (!canvasEl) return
|
|
|
|
// Create new event with same properties
|
|
const EventConstructor = event.constructor as typeof WheelEvent
|
|
const newEvent = new EventConstructor(event.type, event)
|
|
canvasEl.dispatchEvent(newEvent)
|
|
}
|
|
|
|
return {
|
|
handleWheel,
|
|
handlePointer,
|
|
forwardEventToCanvas
|
|
}
|
|
}
|