diff --git a/src/components/image-editor/ImageCanvasEditGenerationModalView.test.tsx b/src/components/image-editor/ImageCanvasEditGenerationModalView.test.tsx index c4ca42259..db0763e54 100644 --- a/src/components/image-editor/ImageCanvasEditGenerationModalView.test.tsx +++ b/src/components/image-editor/ImageCanvasEditGenerationModalView.test.tsx @@ -15,6 +15,8 @@ function createDialog( prompt: '旧修改提示', status: 'idle', sourceLayerId: 'layer-a', + imageModel: 'gpt-image-2', + imageSize: '1K', ...patch, }; } diff --git a/src/components/image-editor/ImageCanvasEditGenerationModalView.tsx b/src/components/image-editor/ImageCanvasEditGenerationModalView.tsx index de12533d6..edc042dff 100644 --- a/src/components/image-editor/ImageCanvasEditGenerationModalView.tsx +++ b/src/components/image-editor/ImageCanvasEditGenerationModalView.tsx @@ -3,7 +3,6 @@ import { type Dispatch, type SetStateAction } from 'react'; import { UnifiedModal } from '../common/UnifiedModal'; import { calculateEditorImageGenerationPrice, - IMAGE_MODEL_GPT_IMAGE_2, } from './ImageCanvasGenerationModel'; import { ImageCanvasBasicGenerationComposerView } from './ImageCanvasBasicGenerationComposerView'; import type { GenerateDialogState } from './ImageCanvasEditorTypes'; @@ -20,10 +19,12 @@ export function ImageCanvasEditGenerationModalView({ onSubmit, }: ImageCanvasEditGenerationModalViewProps) { const isOpen = dialog?.mode === 'edit' && dialog.status !== 'generating'; + const dialogImageModel = dialog?.imageModel ?? 'gpt-image-2'; + const dialogImageSize = dialog?.imageSize ?? '1K'; const editPrice = calculateEditorImageGenerationPrice({ kind: 'quick-edit', - model: IMAGE_MODEL_GPT_IMAGE_2, - imageSize: '1K', + model: dialogImageModel, + imageSize: dialogImageSize, }); return ( @@ -42,9 +43,9 @@ export function ImageCanvasEditGenerationModalView({ dialog={{ ...dialog, mode: 'edit', - imageModel: IMAGE_MODEL_GPT_IMAGE_2, + imageModel: dialogImageModel, aspectRatio: dialog.aspectRatio ?? '1:1', - imageSize: dialog.imageSize ?? '1K', + imageSize: dialogImageSize, generationReferences: [], }} style={{}} diff --git a/src/components/image-editor/ImageCanvasGenerationDialogModel.test.ts b/src/components/image-editor/ImageCanvasGenerationDialogModel.test.ts index 8e704d2ec..f7fe6af2e 100644 --- a/src/components/image-editor/ImageCanvasGenerationDialogModel.test.ts +++ b/src/components/image-editor/ImageCanvasGenerationDialogModel.test.ts @@ -381,6 +381,9 @@ describe('ImageCanvasGenerationDialogModel', () => { status: 'idle', composerOpen: true, sourceLayerId: 'layer-source', + imageModel: 'gpt-image-2', + aspectRatio: '4:3', + imageSize: '1K', }); expect(createQuickEditPanelDraft(sourceLayer)).toEqual({ mode: 'quick-edit', diff --git a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts index 4f6164920..fe33bb826 100644 --- a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts +++ b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts @@ -633,26 +633,53 @@ export function createUiDesignGenerationDialogDraft({ export function createEditDialogDraft( sourceLayer: CanvasLayer, + options: { + imageModel?: string; + aspectRatio?: string; + imageSize?: string; + } = {}, ): GenerateDialogState { + const imageModel = normalizeEditorImageModel( + options.imageModel ?? sourceLayer.model, + ); + const aspectRatio = + options.aspectRatio ?? + inferEditorImageAspectRatio(sourceLayer.originalWidth, sourceLayer.originalHeight); + const imageSize = + options.imageSize ?? + inferEditorImageSizeLabel(sourceLayer.originalWidth, sourceLayer.originalHeight); return { mode: 'edit', prompt: resolveUserGenerationPromptSnapshot(sourceLayer), status: 'idle', composerOpen: true, sourceLayerId: sourceLayer.id, + imageModel, + aspectRatio, + imageSize, }; } export function createQuickEditPanelDraft( sourceLayer: CanvasLayer, + options: { + imageModel?: string; + aspectRatio?: string; + imageSize?: string; + } = {}, ): QuickEditPanelState { - const aspectRatio = inferEditorImageAspectRatio( - sourceLayer.originalWidth, - sourceLayer.originalHeight, - ); - const imageSize = inferEditorImageSizeLabel( - sourceLayer.originalWidth, - sourceLayer.originalHeight, + const aspectRatio = options.aspectRatio ?? + inferEditorImageAspectRatio( + sourceLayer.originalWidth, + sourceLayer.originalHeight, + ); + const imageSize = options.imageSize ?? + inferEditorImageSizeLabel( + sourceLayer.originalWidth, + sourceLayer.originalHeight, + ); + const model = normalizeEditorImageModel( + options.imageModel ?? sourceLayer.model, ); return { mode: 'quick-edit', @@ -664,7 +691,7 @@ export function createQuickEditPanelDraft( ), aspectRatio, imageSize, - model: normalizeEditorImageModel(sourceLayer.model), + model, quickEditReferences: [], status: 'idle', }; @@ -714,9 +741,14 @@ export function createQuickEditGenerationDialogDraft({ export function createRedrawPanelDraft( sourceLayer: CanvasLayer, + options: { + imageModel?: string; + aspectRatio?: string; + imageSize?: string; + } = {}, ): QuickEditPanelState { return { - ...createQuickEditPanelDraft(sourceLayer), + ...createQuickEditPanelDraft(sourceLayer, options), mode: 'redraw', prompt: resolveUserGenerationPromptSnapshot(sourceLayer), }; diff --git a/src/components/image-editor/useImageCanvasGenerationWorkflow.test.tsx b/src/components/image-editor/useImageCanvasGenerationWorkflow.test.tsx index 74d69df72..1f5199fa8 100644 --- a/src/components/image-editor/useImageCanvasGenerationWorkflow.test.tsx +++ b/src/components/image-editor/useImageCanvasGenerationWorkflow.test.tsx @@ -248,6 +248,23 @@ function GenerationWorkflowHarness({ + @@ -405,6 +422,21 @@ function GenerationWorkflowHarness({ > 填写生成提示词 +