diff --git a/src/lib/components/ComfyApp.ts b/src/lib/components/ComfyApp.ts index 092bba1..1e618b6 100644 --- a/src/lib/components/ComfyApp.ts +++ b/src/lib/components/ComfyApp.ts @@ -42,6 +42,12 @@ if (typeof window !== "undefined") { nodes.ComfyReroute.setDefaultTextVisibility(!!localStorage["Comfy.ComfyReroute.DefaultVisibility"]); } +export type OpenWorkflowOptions = { + setActive?: boolean, + refreshCombos?: boolean | Record, + warnMissingNodeTypes?: boolean, +} + /* * Queued prompt that hasn't been sent to the backend yet. */ @@ -208,8 +214,12 @@ export default class ComfyApp { // We failed to restore a workflow so load the default if (!restored) { - await this.initDefaultWorkflow("defaultWorkflow", defs); - await this.initDefaultWorkflow("upscale", defs); + const options: OpenWorkflowOptions = { + refreshCombos: defs, + setActive: false + } + await this.initDefaultWorkflow("defaultWorkflow", options); + await this.initDefaultWorkflow("upscale", options); } // Save current workflow automatically @@ -296,7 +306,7 @@ export default class ComfyApp { const workflows = state.workflows as SerializedAppState[]; await Promise.all(workflows.map(w => { - return this.openWorkflow(w, defs, false).catch(error => { + return this.openWorkflow(w, { refreshCombos: defs, warnMissingNodeTypes: false, setActive: false }).catch(error => { console.error("Failed restoring previous workflow", error) notify(`Failed restoring previous workflow: ${error}`, { type: "error" }) }) @@ -586,9 +596,11 @@ export default class ComfyApp { setColor(BuiltInSlotType.ACTION, "lightseagreen") } - async openWorkflow(data: SerializedAppState, - refreshCombos: boolean | Record = true, - warnMissingNodeTypes: boolean = true + async openWorkflow(data: SerializedAppState, options: OpenWorkflowOptions = { + setActive: true, + refreshCombos: true, + warnMissingNodeTypes: true + } ): Promise { if (data.version !== COMFYBOX_SERIAL_VERSION) { const mes = `Invalid ComfyBox saved data format: ${data.version} ` @@ -600,7 +612,7 @@ export default class ComfyApp { let workflow: ComfyWorkflow; try { - workflow = workflowState.openWorkflow(this.lCanvas, data); + workflow = workflowState.openWorkflow(this.lCanvas, data, options.setActive); } catch (error) { modalState.pushModal({ @@ -612,7 +624,7 @@ export default class ComfyApp { return Promise.reject(error) } - if (workflow.missingNodeTypes.size > 0 && warnMissingNodeTypes) { + if (workflow.missingNodeTypes.size > 0 && options.warnMissingNodeTypes) { modalState.pushModal({ svelteComponent: MissingNodeTypesModal, svelteProps: { @@ -624,10 +636,10 @@ export default class ComfyApp { // Restore canvas offset/zoom this.lCanvas.deserialize(data.canvas) - if (refreshCombos) { + if (options.refreshCombos) { let defs = null; - if (typeof refreshCombos === "object") - defs = refreshCombos; + if (typeof options.refreshCombos === "object") + defs = options.refreshCombos; await this.refreshComboInNodes(workflow, defs); } @@ -705,7 +717,7 @@ export default class ComfyApp { selectionState.clear(); } - async initDefaultWorkflow(name: string = "defaultWorkflow", defs?: Record) { + async initDefaultWorkflow(name: string = "defaultWorkflow", options?: OpenWorkflowOptions) { let state = null; try { const graphResponse = await fetch(`/workflows/${name}.json`); @@ -716,7 +728,7 @@ export default class ComfyApp { notify(`Failed to load default graph ${name}: ${error} `, { type: "error" }) state = structuredClone(blankGraph) } - await this.openWorkflow(state, defs) + await this.openWorkflow(state, options) } clear() { diff --git a/src/lib/components/ComfyQueue.svelte b/src/lib/components/ComfyQueue.svelte index cecb695..fcf4180 100644 --- a/src/lib/components/ComfyQueue.svelte +++ b/src/lib/components/ComfyQueue.svelte @@ -76,11 +76,11 @@ let _runningEntries: QueueUIEntry[] = [] let _entries: QueueUIEntry[] = [] - $: if (mode === "queue" && (changed || ($queuePending && $queuePending.length != _queuedEntries.length))) { + $: if (mode === "queue" && (changed || $queuePending.length != _queuedEntries.length || $queueRunning.length != _runningEntries.length)) { updateFromQueue(); changed = false; } - else if (mode === "history" && (changed || ($queueCompleted && $queueCompleted.length != _entries.length))) { + else if (mode === "history" && (changed || $queueCompleted.length != _entries.length)) { updateFromHistory(); changed = false; } diff --git a/src/lib/stores/workflowState.ts b/src/lib/stores/workflowState.ts index 122db4a..050a3a1 100644 --- a/src/lib/stores/workflowState.ts +++ b/src/lib/stores/workflowState.ts @@ -245,8 +245,8 @@ type WorkflowStateOps = { getWorkflowByNodeID: (id: NodeID) => ComfyWorkflow | null getActiveWorkflow: () => ComfyWorkflow | null createNewWorkflow: (canvas: ComfyGraphCanvas, title?: string, setActive?: boolean) => ComfyWorkflow, - openWorkflow: (canvas: ComfyGraphCanvas, data: SerializedAppState) => ComfyWorkflow, - addWorkflow: (canvas: ComfyGraphCanvas, data: ComfyWorkflow) => void, + openWorkflow: (canvas: ComfyGraphCanvas, data: SerializedAppState, setActive?: boolean) => ComfyWorkflow, + addWorkflow: (canvas: ComfyGraphCanvas, data: ComfyWorkflow, setActive?: boolean) => void, closeWorkflow: (canvas: ComfyGraphCanvas, index: number) => void, closeAllWorkflows: (canvas: ComfyGraphCanvas) => void, setActiveWorkflow: (canvas: ComfyGraphCanvas, index: number | WorkflowInstID) => ComfyWorkflow | null, @@ -299,7 +299,7 @@ function createNewWorkflow(canvas: ComfyGraphCanvas, title: string = "New Workfl state.openedWorkflows.push(workflow); state.openedWorkflowsByID[workflow.id] = workflow; - if (setActive) + if (setActive || state.activeWorkflowID == null) setActiveWorkflow(canvas, state.openedWorkflows.length - 1) store.set(state) @@ -307,20 +307,22 @@ function createNewWorkflow(canvas: ComfyGraphCanvas, title: string = "New Workfl return workflow; } -function openWorkflow(canvas: ComfyGraphCanvas, data: SerializedAppState): ComfyWorkflow { +function openWorkflow(canvas: ComfyGraphCanvas, data: SerializedAppState, setActive: boolean = true): ComfyWorkflow { const [workflow, layoutState] = ComfyWorkflow.create("Workflow") workflow.deserialize(layoutState, { graph: data.workflow, layout: data.layout, attrs: data.attrs }) - addWorkflow(canvas, workflow); + addWorkflow(canvas, workflow, setActive); return workflow; } -function addWorkflow(canvas: ComfyGraphCanvas, workflow: ComfyWorkflow) { +function addWorkflow(canvas: ComfyGraphCanvas, workflow: ComfyWorkflow, setActive: boolean = true) { const state = get(store); state.openedWorkflows.push(workflow); state.openedWorkflowsByID[workflow.id] = workflow; - setActiveWorkflow(canvas, state.openedWorkflows.length - 1) + + if (setActive || state.activeWorkflowID == null) + setActiveWorkflow(canvas, state.openedWorkflows.length - 1) store.set(state)