import { FormEvent } from "react"
import { useToggle } from "react-use"
import { useStore } from "@/lib/states"
import { Switch } from "./ui/switch"
import { Label } from "./ui/label"
import { NumberInput } from "./ui/input"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "./ui/select"
import { Textarea } from "./ui/textarea"
import { SDSampler } from "@/lib/types"
import { Separator } from "./ui/separator"
import { ScrollArea } from "./ui/scroll-area"
import { Sheet, SheetContent, SheetHeader, SheetTrigger } from "./ui/sheet"
import { ChevronLeft, ChevronRight, Upload } from "lucide-react"
import { Button, ImageUploadButton } from "./ui/button"
import useHotKey from "@/hooks/useHotkey"
import { Slider } from "./ui/slider"
import { useImage } from "@/hooks/useImage"
import { INSTRUCT_PIX2PIX, PAINT_BY_EXAMPLE } from "@/lib/const"
const RowContainer = ({ children }: { children: React.ReactNode }) => (
{children}
)
const SidePanel = () => {
const [
settings,
windowSize,
paintByExampleFile,
isProcessing,
updateSettings,
showSidePanel,
runInpainting,
updateAppState,
] = useStore((state) => [
state.settings,
state.windowSize,
state.paintByExampleFile,
state.getIsProcessing(),
state.updateSettings,
state.showSidePanel(),
state.runInpainting,
state.updateAppState,
])
const [exampleImage, isExampleImageLoaded] = useImage(paintByExampleFile)
const [open, toggleOpen] = useToggle(true)
useHotKey("c", () => {
toggleOpen()
})
if (!showSidePanel) {
return null
}
const onKeyUp = (e: React.KeyboardEvent) => {
// negativePrompt 回车触发 inpainting
if (e.key === "Enter" && e.ctrlKey && settings.prompt.length !== 0) {
runInpainting()
}
}
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 (
Example Image
{
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 })
}}
/>
)
}
return (
event.preventDefault()}
onPointerDownOutside={(event) => event.preventDefault()}
>
{
settings.model.name.split("/")[
settings.model.name.split("/").length - 1
]
}
{
updateSettings({ showCroper: value })
}}
/>
updateSettings({ sdSteps: vals[0] })}
/>
{
updateSettings({ sdSteps: val })
}}
/>
updateSettings({ sdGuidanceScale: vals[0] / 100 })
}
/>
{
updateSettings({ sdGuidanceScale: val })
}}
/>
{renderP2PImageGuidanceScale()}
{renderStrength()}
{/* 每次会从服务器返回更新该值 */}
{
updateSettings({ seedFixed: value })
}}
/>
{
updateSettings({ seed: val })
}}
/>
{renderNegativePrompt()}
{renderConterNetSetting()}
{renderFreeu()}
{renderLCMLora()}
updateSettings({ sdMaskBlur: vals[0] })
}
/>
{
updateSettings({ sdMaskBlur: value })
}}
/>
{
updateSettings({ sdMatchHistograms: value })
}}
/>
{renderPaintByExample()}
)
}
export default SidePanel