Make LGraphCanvas shallowReactive (#1169)

* Make LGraphCanvas shallowReactive

* Restore canvas options after creation
This commit is contained in:
Chenlei Hu
2024-10-08 14:07:15 -04:00
committed by GitHub
parent 482da21ba7
commit 2cb1cea196
3 changed files with 24 additions and 27 deletions

View File

@@ -108,12 +108,12 @@ watchEffect(() => {
watchEffect(() => { watchEffect(() => {
if (!canvasStore.canvas) return if (!canvasStore.canvas) return
if (canvasStore.draggingCanvas) { if (canvasStore.canvas.dragging_canvas) {
canvasStore.canvas.canvas.style.cursor = 'grabbing' canvasStore.canvas.canvas.style.cursor = 'grabbing'
return return
} }
if (canvasStore.readOnly) { if (canvasStore.canvas.read_only) {
canvasStore.canvas.canvas.style.cursor = 'grab' canvasStore.canvas.canvas.style.cursor = 'grab'
return return
} }

View File

@@ -55,6 +55,7 @@ import { IWidget } from '@comfyorg/litegraph'
import { useExtensionStore } from '@/stores/extensionStore' import { useExtensionStore } from '@/stores/extensionStore'
import { KeyComboImpl, useKeybindingStore } from '@/stores/keybindingStore' import { KeyComboImpl, useKeybindingStore } from '@/stores/keybindingStore'
import { useCommandStore } from '@/stores/commandStore' import { useCommandStore } from '@/stores/commandStore'
import { shallowReactive } from 'vue'
export const ANIM_PREVIEW_WIDGET = '$$comfy_animation_preview' export const ANIM_PREVIEW_WIDGET = '$$comfy_animation_preview'
@@ -1836,7 +1837,20 @@ export class ComfyApp {
this.#addAfterConfigureHandler() this.#addAfterConfigureHandler()
this.canvas = new LGraphCanvas(canvasEl, this.graph) // Make LGraphCanvas shallow reactive so that any change on the root object
// triggers reactivity.
this.canvas = shallowReactive(
new LGraphCanvas(canvasEl, this.graph, {
skip_events: true,
skip_render: true
})
)
// Bind event/ start rendering later, so that event handlers get reactive canvas reference.
this.canvas.options.skip_events = false
this.canvas.options.skip_render = false
this.canvas.bindEvents()
this.canvas.startRendering()
this.ctx = canvasEl.getContext('2d') this.ctx = canvasEl.getContext('2d')
LiteGraph.alt_drag_do_clone_nodes = true LiteGraph.alt_drag_do_clone_nodes = true

View File

@@ -1,6 +1,6 @@
import { LGraphNode, LGraphGroup, LGraphCanvas } from '@comfyorg/litegraph' import { LGraphNode, LGraphGroup, LGraphCanvas } from '@comfyorg/litegraph'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref, shallowRef } from 'vue' import { shallowRef } from 'vue'
export const useTitleEditorStore = defineStore('titleEditor', () => { export const useTitleEditorStore = defineStore('titleEditor', () => {
const titleEditorTarget = shallowRef<LGraphNode | LGraphGroup | null>(null) const titleEditorTarget = shallowRef<LGraphNode | LGraphGroup | null>(null)
@@ -11,31 +11,14 @@ export const useTitleEditorStore = defineStore('titleEditor', () => {
}) })
export const useCanvasStore = defineStore('canvas', () => { export const useCanvasStore = defineStore('canvas', () => {
/**
* The LGraphCanvas instance.
*
* The root LGraphCanvas object is shallow reactive.
*/
const canvas = shallowRef<LGraphCanvas | null>(null) const canvas = shallowRef<LGraphCanvas | null>(null)
const readOnly = ref(false)
const draggingCanvas = ref(false)
document.addEventListener(
'litegraph:canvas',
(e: CustomEvent<{ subType: string; readOnly: boolean }>) => {
if (e.detail?.subType === 'read-only') {
readOnly.value = e.detail.readOnly
}
}
)
document.addEventListener(
'litegraph:canvas',
(e: CustomEvent<{ subType: string; draggingCanvas: boolean }>) => {
if (e.detail?.subType === 'dragging-canvas') {
draggingCanvas.value = e.detail.draggingCanvas
}
}
)
return { return {
canvas, canvas
readOnly,
draggingCanvas
} }
}) })