From b64aec26a21ad7910dee1429c2cb443dbfa056ee Mon Sep 17 00:00:00 2001 From: bymyself Date: Wed, 25 Mar 2026 13:39:45 -0700 Subject: [PATCH] fix: add LoadImage and LoadVideo to canvas preview node types LoadImage and LoadVideo were missing from CANVAS_IMAGE_PREVIEW_NODE_TYPES, so their previews were never promoted to parent subgraph nodes. This caused promoted preview images to not display on subgraph nodes in graph mode and app mode when the interior node was a LoadImage or LoadVideo. --- .../node/canvasImagePreviewTypes.ts | 4 +- .../graph/subgraph/promotionUtils.test.ts | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/composables/node/canvasImagePreviewTypes.ts b/src/composables/node/canvasImagePreviewTypes.ts index 03013db13e..498e6bb1ef 100644 --- a/src/composables/node/canvasImagePreviewTypes.ts +++ b/src/composables/node/canvasImagePreviewTypes.ts @@ -4,7 +4,9 @@ export const CANVAS_IMAGE_PREVIEW_WIDGET = '$$canvas-image-preview' const CANVAS_IMAGE_PREVIEW_NODE_TYPES = new Set([ 'PreviewImage', 'SaveImage', - 'GLSLShader' + 'GLSLShader', + 'LoadImage', + 'LoadVideo' ]) export function supportsVirtualCanvasImagePreview(node: LGraphNode): boolean { diff --git a/src/core/graph/subgraph/promotionUtils.test.ts b/src/core/graph/subgraph/promotionUtils.test.ts index b5f4d949c7..999953b0d1 100644 --- a/src/core/graph/subgraph/promotionUtils.test.ts +++ b/src/core/graph/subgraph/promotionUtils.test.ts @@ -203,6 +203,28 @@ describe('getPromotableWidgets', () => { ).toBe(true) }) + it('adds virtual canvas preview widget for LoadImage nodes', () => { + const node = new LGraphNode('LoadImage') + node.type = 'LoadImage' + + const widgets = getPromotableWidgets(node) + + expect( + widgets.some((widget) => widget.name === CANVAS_IMAGE_PREVIEW_WIDGET) + ).toBe(true) + }) + + it('adds virtual canvas preview widget for LoadVideo nodes', () => { + const node = new LGraphNode('LoadVideo') + node.type = 'LoadVideo' + + const widgets = getPromotableWidgets(node) + + expect( + widgets.some((widget) => widget.name === CANVAS_IMAGE_PREVIEW_WIDGET) + ).toBe(true) + }) + it('does not add virtual canvas preview widget for non-image nodes', () => { const node = new LGraphNode('TextNode') node.addOutput('TEXT', 'STRING') @@ -271,6 +293,25 @@ describe('promoteRecommendedWidgets', () => { expect(updatePreviewsMock).not.toHaveBeenCalled() }) + it('eagerly promotes virtual preview widget for LoadImage nodes', () => { + const subgraph = createTestSubgraph() + const subgraphNode = createTestSubgraphNode(subgraph) + const loadImageNode = new LGraphNode('LoadImage') + loadImageNode.type = 'LoadImage' + subgraph.add(loadImageNode) + + promoteRecommendedWidgets(subgraphNode) + + const store = usePromotionStore() + expect( + store.isPromoted(subgraphNode.rootGraph.id, subgraphNode.id, { + sourceNodeId: String(loadImageNode.id), + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET + }) + ).toBe(true) + expect(updatePreviewsMock).not.toHaveBeenCalled() + }) + it('registers $$canvas-image-preview on configure for GLSLShader in saved workflow', () => { // Simulate loading a saved workflow where proxyWidgets does NOT contain // the $$canvas-image-preview entry (e.g. blueprint authored before the