From fb0be9760929e179de7ac84d3568b07ef70b6857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:25:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=94=9F=203D=20=E7=9A=84=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E5=BA=93=E7=A9=BA=E7=A1=AE=E8=AE=A4=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E6=B8=85=E6=8E=89=E5=B7=B2=E9=80=89=E5=8F=82=E8=80=83=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/components/image-editor/ImageCanvasGenerationDialogModel.ts:单槽对话框只在素材库确实选到了图时才做「替换」,空确认退回原行为(保留画布点选/上传的那张)。此前确认按钮不校验空选,空确认会把已有参考图直接清掉 - src/components/image-editor/projectAssetReferencePickerModel.test.ts:补空确认保留画布参考图的用例 --- .../ImageCanvasGenerationDialogModel.ts | 3 ++- .../projectAssetReferencePickerModel.test.ts | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts index 3004ae7f5..0b01bc6d6 100644 --- a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts +++ b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts @@ -2265,7 +2265,8 @@ export function replaceProjectAssetPickerReferences( ...resetFailedGenerationDialog(dialog), generationReferences: appendLimitedImageReferences( // 单槽对话框(图生 3D)里素材库选择是替换:留着画布点选的那张只会把这次选择挤掉。 - usesSingleImageReferenceSlot(dialog) + // 但确认时一个都没选就不算「替换」,否则空确认会把画布点选/上传的那张直接清掉。 + usesSingleImageReferenceSlot(dialog) && references.length > 0 ? [] : (dialog.generationReferences ?? []).filter( (reference) => !isProjectAssetPickerReference(reference), diff --git a/src/components/image-editor/projectAssetReferencePickerModel.test.ts b/src/components/image-editor/projectAssetReferencePickerModel.test.ts index f6e643276..1ee72811d 100644 --- a/src/components/image-editor/projectAssetReferencePickerModel.test.ts +++ b/src/components/image-editor/projectAssetReferencePickerModel.test.ts @@ -272,6 +272,30 @@ describe('参考图弹窗素材筛选与快照', () => { expect(next).toMatchObject({ status: 'idle', composerOpen: true }); }); + it('keeps the 3D image-to-model source when the picker is confirmed empty', () => { + const dialog = { + mode: 'model3d-image-to-model', + prompt: '', + status: 'failed', + errorMessage: '失败', + composerOpen: false, + generationReferences: [ + { + id: 'canvas-layer-1', + label: '画布点选', + src: 'https://example.test/canvas.png', + mediaType: 'image', + }, + ], + } satisfies GenerateDialogState; + + const next = replaceProjectAssetPickerReferences(dialog, []); + + expect( + next?.generationReferences?.map((reference) => reference.id), + ).toEqual(['canvas-layer-1']); + }); + it('leaves dialogs outside the reference-composer modes untouched', () => { const dialog = { mode: 'video',