import { FormEvent } from "react"
import { useStore } from "@/lib/states"
import { Switch } from "../ui/switch"
import { NumberInput } from "../ui/input"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "../ui/select"
import { Textarea } from "../ui/textarea"
import { ExtenderDirection, PowerPaintTask } from "@/lib/types"
import { Separator } from "../ui/separator"
import { Button, ImageUploadButton } from "../ui/button"
import { Slider } from "../ui/slider"
import { useImage } from "@/hooks/useImage"
import { INSTRUCT_PIX2PIX, PAINT_BY_EXAMPLE, POWERPAINT } from "@/lib/const"
import { RowContainer, LabelTitle } from "./LabelTitle"
import { Upload } from "lucide-react"
const ExtenderButton = ({
text,
onClick,
}: {
text: string
onClick: () => void
}) => {
const [showExtender] = useStore((state) => [state.settings.showExtender])
return (
)
}
const DiffusionOptions = () => {
const [
samplers,
settings,
paintByExampleFile,
isProcessing,
updateSettings,
runInpainting,
updateAppState,
updateExtenderByBuiltIn,
updateExtenderDirection,
] = useStore((state) => [
state.serverConfig.samplers,
state.settings,
state.paintByExampleFile,
state.getIsProcessing(),
state.updateSettings,
state.runInpainting,
state.updateAppState,
state.updateExtenderByBuiltIn,
state.updateExtenderDirection,
])
const [exampleImage, isExampleImageLoaded] = useImage(paintByExampleFile)
const onKeyUp = (e: React.KeyboardEvent) => {
// negativePrompt 回车触发 inpainting
if (e.key === "Enter" && e.ctrlKey && settings.prompt.length !== 0) {
runInpainting()
}
}
const renderCropper = () => {
return (
{
updateSettings({ showCropper: value })
if (value) {
updateSettings({ showExtender: false })
}
}}
/>
)
}
const renderConterNetSetting = () => {
if (!settings.model.support_controlnet) {
return null
}
return (
{
updateSettings({ enableControlnet: value })
}}
/>
updateSettings({ controlnetConditioningScale: vals[0] / 100 })
}
/>
{
updateSettings({ controlnetConditioningScale: val })
}}
/>
)
}
const renderLCMLora = () => {
if (!settings.model.support_lcm_lora) {
return null
}
return (
<>
{
updateSettings({ enableLCMLora: value })
}}
/>
>
)
}
const renderFreeu = () => {
if (!settings.model.support_freeu) {
return null
}
return (
{
updateSettings({ enableFreeu: value })
}}
/>
{
updateSettings({
freeuConfig: { ...settings.freeuConfig, s1: value },
})
}}
/>
{
updateSettings({
freeuConfig: { ...settings.freeuConfig, s2: value },
})
}}
/>
{
updateSettings({
freeuConfig: { ...settings.freeuConfig, b1: value },
})
}}
/>
{
updateSettings({
freeuConfig: { ...settings.freeuConfig, b2: value },
})
}}
/>
)
}
const renderNegativePrompt = () => {
if (!settings.model.need_prompt) {
return null
}
return (
)
}
const renderPaintByExample = () => {
if (settings.model.name !== PAINT_BY_EXAMPLE) {
return null
}
return (
{
updateAppState({ paintByExampleFile: file })
}}
>
{isExampleImageLoaded ? (
) : (
<>>
)}
)
}
const renderP2PImageGuidanceScale = () => {
if (settings.model.name !== INSTRUCT_PIX2PIX) {
return null
}
return (
updateSettings({ p2pImageGuidanceScale: vals[0] / 100 })
}
/>
{
updateSettings({ p2pImageGuidanceScale: val })
}}
/>
)
}
const renderStrength = () => {
if (!settings.model.support_strength) {
return null
}
return (
updateSettings({ sdStrength: vals[0] / 100 })
}
/>
{
updateSettings({ sdStrength: val })
}}
/>
)
}
const renderExtender = () => {
if (!settings.model.support_outpainting) {
return null
}
return (
<>
{
updateSettings({ showExtender: value })
if (value) {
updateSettings({ showCropper: false })
}
}}
/>
updateExtenderByBuiltIn(settings.extenderDirection, 1.25)
}
/>
updateExtenderByBuiltIn(settings.extenderDirection, 1.5)
}
/>
updateExtenderByBuiltIn(settings.extenderDirection, 1.75)
}
/>
updateExtenderByBuiltIn(settings.extenderDirection, 2.0)
}
/>
>
)
}
const renderPowerPaintTaskType = () => {
if (settings.model.name !== POWERPAINT) {
return null
}
return (
)
}
const renderSteps = () => {
return (
updateSettings({ sdSteps: vals[0] })}
/>
{
updateSettings({ sdSteps: val })
}}
/>
)
}
const renderGuidanceScale = () => {
return (
updateSettings({ sdGuidanceScale: vals[0] / 100 })
}
/>
{
updateSettings({ sdGuidanceScale: val })
}}
/>
)
}
const renderSampler = () => {
return (
)
}
const renderSeed = () => {
return (
{/* 每次会从服务器返回更新该值 */}
{/* */}
{
updateSettings({ seedFixed: value })
}}
/>
{
updateSettings({ seed: val })
}}
/>
)
}
const renderMaskBlur = () => {
return (
updateSettings({ sdMaskBlur: vals[0] })}
/>
{
updateSettings({ sdMaskBlur: value })
}}
/>
)
}
const renderMatchHistograms = () => {
return (
<>
{
updateSettings({ sdMatchHistograms: value })
}}
/>
>
)
}
return (
{renderCropper()}
{renderExtender()}
{renderPowerPaintTaskType()}
{renderSteps()}
{renderGuidanceScale()}
{renderP2PImageGuidanceScale()}
{renderStrength()}
{renderSampler()}
{renderSeed()}
{renderNegativePrompt()}
{renderConterNetSetting()}
{renderLCMLora()}
{renderMaskBlur()}
{renderMatchHistograms()}
{renderFreeu()}
{renderPaintByExample()}
)
}
export default DiffusionOptions