import { useEffect, useState } from "react"; import { Button } from "antd"; import { AppModal } from "@/components/ui/product/app-modal"; import { WandSparkles, X } from "lucide-react"; import { ImageSettingsPanel } from "@/components/image-settings-panel"; import { ModelPicker } from "@/components/model-picker"; import { canvasThemes } from "@/lib/canvas-theme"; import { defaultImageParamsForModel } from "@/lib/model-selection"; import { CanvasCameraControlPopover } from "./canvas-camera-control-popover"; import type { CameraControlOptions } from "@/lib/canvas/camera-prompt-library"; import { useActiveTheme } from "@/stores/canvas/use-canvas-theme-store"; import type { AiConfig } from "@/stores/use-config-store"; export type BatchGenerationSettings = Pick & { cameraControl?: CameraControlOptions }; type BatchGenerationSettingsDialogProps = { open: boolean; config: AiConfig; rowCount: number; concurrency: number; onClose: () => void; onConfirm: (settings: BatchGenerationSettings) => void; }; export function BatchGenerationSettingsDialog({ open, config, rowCount, concurrency, onClose, onConfirm }: BatchGenerationSettingsDialogProps) { const theme = canvasThemes[useActiveTheme()]; const [generationConfig, setGenerationConfig] = useState(config); const [cameraControl, setCameraControl] = useState(undefined); useEffect(() => { if (open) { setGenerationConfig(config); setCameraControl(undefined); } }, [config, open]); const handleConfigChange = (key: "quality" | "size" | "transparentBackground" | "count", value: string) => { setGenerationConfig((current) => ({ ...current, [key]: value })); }; const handleModelChange = (model: string) => { setGenerationConfig((current) => ({ ...current, model, imageModel: model, ...defaultImageParamsForModel(current, model) })); }; const imageModel = generationConfig.imageModel || generationConfig.model; return (
共 {rowCount} 个任务(每行 1 张) · 并发上限 {concurrency}
确认后将提交生成任务,可能消耗积分或产生外部模型费用。
生成模型
摄像机控制
为本批次统一应用镜头、焦段和光圈设置
); }