diff --git a/src/components/image-editor/ImageCanvasEditorTypes.ts b/src/components/image-editor/ImageCanvasEditorTypes.ts index 9e1664d77..4fcc5077f 100644 --- a/src/components/image-editor/ImageCanvasEditorTypes.ts +++ b/src/components/image-editor/ImageCanvasEditorTypes.ts @@ -265,6 +265,7 @@ export type GenerateDialogState = { assetLabel?: string; status: 'idle' | 'generating' | 'pending-confirmation' | 'failed'; composerOpen?: boolean; + isRedrawAsNewArtifact?: boolean; sourceLayerId?: string; generatedLayerId?: string; specType?: SpecGenerationType; @@ -444,6 +445,7 @@ export type CanvasContextMenuState = export type QuickEditPanelState = { referenceUploadContextId?: string; + mode?: 'quick-edit' | 'redraw'; sourceLayerId: string; prompt: string; assetLabel?: string; diff --git a/src/components/image-editor/ImageCanvasGenerationLayerModel.ts b/src/components/image-editor/ImageCanvasGenerationLayerModel.ts index 5dc1e1a31..ee0806117 100644 --- a/src/components/image-editor/ImageCanvasGenerationLayerModel.ts +++ b/src/components/image-editor/ImageCanvasGenerationLayerModel.ts @@ -32,6 +32,16 @@ type GeneratedResultLayerOptions = { generationInputs?: CanvasGenerationInputs; }; +type QuickEditResultLayerOptions = { + generated: EditorImageGenerationResult; + generatedIndex: number; + sourceLayer: CanvasLayer; + generationInputs: CanvasGenerationInputs; + mode?: 'quick-edit' | 'redraw'; + frame?: GenerateDialogState['placeholder']; + title?: string; +}; + type IconSpritesheetResultLayerOptions = { generated: EditorIconSpritesheetGenerationResult; iconResults?: EditorIconSpritesheetIconResult[] | null; @@ -173,6 +183,67 @@ export function createGeneratedResultLayer({ ); } +export function createQuickEditResultLayer({ + generated, + generatedIndex, + sourceLayer, + generationInputs, + mode = 'quick-edit', + frame, + title, +}: QuickEditResultLayerOptions): CanvasLayer { + const originalWidth = + frame?.originalWidth || + generated.width || + sourceLayer.originalWidth || + 1024; + const originalHeight = + frame?.originalHeight || + generated.height || + sourceLayer.originalHeight || + 1024; + const { width, height } = resolveLayerResolutionSize( + originalWidth, + originalHeight, + { + width: sourceLayer.width, + height: sourceLayer.height, + }, + ); + const frameX = + frame && frame.width > 0 + ? frame.x + frame.width / 2 - width / 2 + : undefined; + const frameY = + frame && frame.height > 0 + ? frame.y + frame.height / 2 - height / 2 + : undefined; + + return applyGeneratedMetadata( + { + id: `layer-quick-edit-${generatedIndex}`, + resourceId: `local-resource-quick-edit-${generatedIndex}`, + title: + title ?? + `${sourceLayer.title} ${mode === 'redraw' ? '重绘' : '快速编辑'}`, + src: generated.imageSrc, + x: frameX ?? sourceLayer.x + sourceLayer.width + 32, + y: frameY ?? sourceLayer.y, + width, + height, + originalWidth, + originalHeight, + zIndex: generatedIndex + 10, + sourceType: generated.sourceType, + sourceResourceId: sourceLayer.resourceId, + groupId: sourceLayer.groupId, + assetKind: sourceLayer.assetKind, + }, + generated, + generationInputs, + ); +} + export function applyImageEditResultToSourceLayer({ generated, sourceLayer,