2023-02-12 22:52:50 +00:00
|
|
|
/* eslint-disable max-lines */
|
2023-01-13 20:39:07 +00:00
|
|
|
/* eslint-disable no-null/no-null */
|
2023-02-04 16:50:20 +00:00
|
|
|
import { doesExist, Maybe } from '@apextoaster/js-utils';
|
2023-02-13 23:34:42 +00:00
|
|
|
import { Logger } from 'noicejs';
|
2023-01-13 00:10:46 +00:00
|
|
|
import { createContext } from 'react';
|
|
|
|
import { StateCreator, StoreApi } from 'zustand';
|
|
|
|
|
|
|
|
import {
|
|
|
|
ApiClient,
|
|
|
|
BaseImgParams,
|
2023-02-12 22:52:50 +00:00
|
|
|
BlendParams,
|
2023-01-15 00:07:05 +00:00
|
|
|
BrushParams,
|
2023-01-18 13:20:12 +00:00
|
|
|
ImageResponse,
|
2023-01-13 00:10:46 +00:00
|
|
|
Img2ImgParams,
|
|
|
|
InpaintParams,
|
2023-01-17 02:11:10 +00:00
|
|
|
ModelParams,
|
2023-01-15 00:07:05 +00:00
|
|
|
OutpaintPixels,
|
2023-02-04 16:50:20 +00:00
|
|
|
ReadyResponse,
|
2023-01-13 00:10:46 +00:00
|
|
|
Txt2ImgParams,
|
2023-01-16 20:05:04 +00:00
|
|
|
UpscaleParams,
|
2023-01-17 05:45:54 +00:00
|
|
|
UpscaleReqParams,
|
2023-01-16 20:10:15 +00:00
|
|
|
} from './client.js';
|
2023-01-18 13:20:12 +00:00
|
|
|
import { Config, ConfigFiles, ConfigState, ServerParams } from './config.js';
|
2023-01-12 06:10:57 +00:00
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* Combine optional files and required ranges.
|
|
|
|
*/
|
2023-01-17 05:45:54 +00:00
|
|
|
type TabState<TabParams> = ConfigFiles<Required<TabParams>> & ConfigState<Required<TabParams>>;
|
2023-01-12 06:10:57 +00:00
|
|
|
|
2023-02-04 16:50:20 +00:00
|
|
|
interface LoadingItem {
|
|
|
|
image: ImageResponse;
|
|
|
|
ready: Maybe<ReadyResponse>;
|
|
|
|
}
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
interface BrushSlice {
|
|
|
|
brush: BrushParams;
|
|
|
|
|
|
|
|
setBrush(brush: Partial<BrushParams>): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface DefaultSlice {
|
|
|
|
defaults: TabState<BaseImgParams>;
|
|
|
|
|
|
|
|
setDefaults(param: Partial<BaseImgParams>): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface HistorySlice {
|
|
|
|
history: Array<ImageResponse>;
|
|
|
|
limit: number;
|
2023-02-04 16:50:20 +00:00
|
|
|
loading: Array<LoadingItem>;
|
2023-01-27 23:27:11 +00:00
|
|
|
|
2023-02-04 18:30:03 +00:00
|
|
|
clearLoading(image: ImageResponse): void;
|
2023-01-27 23:27:11 +00:00
|
|
|
pushHistory(image: ImageResponse): void;
|
2023-02-04 17:56:14 +00:00
|
|
|
pushLoading(image: ImageResponse): void;
|
2023-01-27 23:27:11 +00:00
|
|
|
removeHistory(image: ImageResponse): void;
|
|
|
|
setLimit(limit: number): void;
|
2023-02-04 18:30:03 +00:00
|
|
|
/**
|
|
|
|
* @todo should check ready and move the image from loading to history
|
|
|
|
*/
|
2023-02-04 17:56:14 +00:00
|
|
|
setReady(image: ImageResponse, ready: ReadyResponse): void;
|
2023-01-27 23:27:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
interface ModelSlice {
|
|
|
|
model: ModelParams;
|
|
|
|
|
|
|
|
setModel(model: Partial<ModelParams>): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
// #region tab slices
|
2023-01-12 23:49:51 +00:00
|
|
|
interface Txt2ImgSlice {
|
|
|
|
txt2img: TabState<Txt2ImgParams>;
|
|
|
|
|
|
|
|
setTxt2Img(params: Partial<Txt2ImgParams>): void;
|
|
|
|
resetTxt2Img(): void;
|
2023-01-12 06:10:57 +00:00
|
|
|
}
|
|
|
|
|
2023-01-12 23:49:51 +00:00
|
|
|
interface Img2ImgSlice {
|
|
|
|
img2img: TabState<Img2ImgParams>;
|
2023-01-12 06:10:57 +00:00
|
|
|
|
2023-01-12 23:49:51 +00:00
|
|
|
setImg2Img(params: Partial<Img2ImgParams>): void;
|
|
|
|
resetImg2Img(): void;
|
|
|
|
}
|
2023-01-12 06:10:57 +00:00
|
|
|
|
2023-01-12 23:49:51 +00:00
|
|
|
interface InpaintSlice {
|
|
|
|
inpaint: TabState<InpaintParams>;
|
2023-01-12 06:10:57 +00:00
|
|
|
|
2023-01-12 23:49:51 +00:00
|
|
|
setInpaint(params: Partial<InpaintParams>): void;
|
|
|
|
resetInpaint(): void;
|
|
|
|
}
|
|
|
|
|
2023-01-15 00:07:05 +00:00
|
|
|
interface OutpaintSlice {
|
|
|
|
outpaint: OutpaintPixels;
|
|
|
|
|
|
|
|
setOutpaint(pixels: Partial<OutpaintPixels>): void;
|
|
|
|
}
|
|
|
|
|
2023-01-16 20:05:04 +00:00
|
|
|
interface UpscaleSlice {
|
|
|
|
upscale: UpscaleParams;
|
2023-01-17 05:45:54 +00:00
|
|
|
upscaleTab: TabState<UpscaleReqParams>;
|
2023-01-16 20:05:04 +00:00
|
|
|
|
|
|
|
setUpscale(upscale: Partial<UpscaleParams>): void;
|
2023-01-17 05:45:54 +00:00
|
|
|
setUpscaleTab(params: Partial<UpscaleReqParams>): void;
|
|
|
|
resetUpscaleTab(): void;
|
2023-01-16 20:05:04 +00:00
|
|
|
}
|
2023-02-11 21:22:24 +00:00
|
|
|
|
2023-02-12 22:52:50 +00:00
|
|
|
interface BlendSlice {
|
|
|
|
blend: TabState<BlendParams>;
|
|
|
|
|
|
|
|
setBlend(blend: Partial<BlendParams>): void;
|
|
|
|
resetBlend(): void;
|
|
|
|
}
|
|
|
|
|
2023-02-11 21:22:24 +00:00
|
|
|
interface ResetSlice {
|
|
|
|
resetAll(): void;
|
|
|
|
}
|
2023-01-27 23:27:11 +00:00
|
|
|
// #endregion
|
2023-01-16 20:05:04 +00:00
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* Full merged state including all slices.
|
|
|
|
*/
|
2023-01-16 20:05:04 +00:00
|
|
|
export type OnnxState
|
|
|
|
= BrushSlice
|
|
|
|
& DefaultSlice
|
|
|
|
& HistorySlice
|
|
|
|
& Img2ImgSlice
|
|
|
|
& InpaintSlice
|
2023-01-17 02:11:10 +00:00
|
|
|
& ModelSlice
|
2023-01-16 20:05:04 +00:00
|
|
|
& OutpaintSlice
|
|
|
|
& Txt2ImgSlice
|
2023-02-11 21:22:24 +00:00
|
|
|
& UpscaleSlice
|
2023-02-12 22:52:50 +00:00
|
|
|
& BlendSlice
|
2023-02-11 21:22:24 +00:00
|
|
|
& ResetSlice;
|
2023-01-12 23:49:51 +00:00
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* Shorthand for state creator to reduce repeated arguments.
|
|
|
|
*/
|
|
|
|
export type Slice<T> = StateCreator<OnnxState, [], [], T>;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* React context binding for API client.
|
|
|
|
*/
|
|
|
|
export const ClientContext = createContext<Maybe<ApiClient>>(undefined);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* React context binding for merged config, including server parameters.
|
|
|
|
*/
|
|
|
|
export const ConfigContext = createContext<Maybe<Config<ServerParams>>>(undefined);
|
|
|
|
|
2023-02-13 23:34:42 +00:00
|
|
|
/**
|
|
|
|
* React context binding for bunyan logger.
|
|
|
|
*/
|
|
|
|
export const LoggerContext = createContext<Maybe<Logger>>(undefined);
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* React context binding for zustand state store.
|
|
|
|
*/
|
|
|
|
export const StateContext = createContext<Maybe<StoreApi<OnnxState>>>(undefined);
|
2023-01-12 23:49:51 +00:00
|
|
|
|
2023-02-11 21:22:24 +00:00
|
|
|
/**
|
|
|
|
* Key for zustand persistence, typically local storage.
|
|
|
|
*/
|
|
|
|
export const STATE_KEY = 'onnx-web';
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* Current state version for zustand persistence.
|
|
|
|
*/
|
2023-02-04 17:56:14 +00:00
|
|
|
export const STATE_VERSION = 5;
|
2023-01-27 23:27:11 +00:00
|
|
|
|
2023-02-13 23:34:42 +00:00
|
|
|
export const BLEND_SOURCES = 2;
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
/**
|
|
|
|
* Default parameters for the inpaint brush.
|
|
|
|
*
|
|
|
|
* Not provided by the server yet.
|
|
|
|
*/
|
|
|
|
export const DEFAULT_BRUSH = {
|
|
|
|
color: 255,
|
|
|
|
size: 8,
|
|
|
|
strength: 0.5,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default parameters for the image history.
|
|
|
|
*
|
|
|
|
* Not provided by the server yet.
|
|
|
|
*/
|
|
|
|
export const DEFAULT_HISTORY = {
|
|
|
|
/**
|
|
|
|
* The number of images to be shown.
|
|
|
|
*/
|
|
|
|
limit: 4,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The number of additional images to be kept in history, so they can scroll
|
|
|
|
* back into view when you delete one. Does not include deleted images.
|
|
|
|
*/
|
|
|
|
scrollback: 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
export function baseParamsFromServer(defaults: ServerParams): Required<BaseImgParams> {
|
|
|
|
return {
|
2023-02-20 14:35:18 +00:00
|
|
|
batch: defaults.batch.default,
|
2023-01-27 23:27:11 +00:00
|
|
|
cfg: defaults.cfg.default,
|
2023-02-20 05:29:26 +00:00
|
|
|
eta: defaults.eta.default,
|
2023-01-27 23:27:11 +00:00
|
|
|
negativePrompt: defaults.negativePrompt.default,
|
|
|
|
prompt: defaults.prompt.default,
|
|
|
|
scheduler: defaults.scheduler.default,
|
|
|
|
steps: defaults.steps.default,
|
|
|
|
seed: defaults.seed.default,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Prepare the state slice constructors.
|
|
|
|
*
|
|
|
|
* In the default state, image sources should be null and booleans should be false. Everything
|
|
|
|
* else should be initialized from the default value in the base parameters.
|
|
|
|
*/
|
|
|
|
export function createStateSlices(server: ServerParams) {
|
|
|
|
const base = baseParamsFromServer(server);
|
|
|
|
|
|
|
|
const createTxt2ImgSlice: Slice<Txt2ImgSlice> = (set) => ({
|
2023-01-12 23:49:51 +00:00
|
|
|
txt2img: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
|
|
|
width: server.width.default,
|
|
|
|
height: server.height.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
setTxt2Img(params) {
|
|
|
|
set((prev) => ({
|
|
|
|
txt2img: {
|
|
|
|
...prev.txt2img,
|
|
|
|
...params,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
resetTxt2Img() {
|
|
|
|
set({
|
|
|
|
txt2img: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
|
|
|
width: server.width.default,
|
|
|
|
height: server.height.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createImg2ImgSlice: Slice<Img2ImgSlice> = (set) => ({
|
2023-01-12 23:49:51 +00:00
|
|
|
img2img: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
2023-01-13 20:39:07 +00:00
|
|
|
source: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
strength: server.strength.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
setImg2Img(params) {
|
|
|
|
set((prev) => ({
|
|
|
|
img2img: {
|
|
|
|
...prev.img2img,
|
|
|
|
...params,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
resetImg2Img() {
|
|
|
|
set({
|
|
|
|
img2img: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
2023-01-13 20:39:07 +00:00
|
|
|
source: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
strength: server.strength.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createInpaintSlice: Slice<InpaintSlice> = (set) => ({
|
2023-01-12 23:49:51 +00:00
|
|
|
inpaint: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
|
|
|
fillColor: server.fillColor.default,
|
|
|
|
filter: server.filter.default,
|
2023-01-13 20:39:07 +00:00
|
|
|
mask: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
noise: server.noise.default,
|
2023-01-15 17:10:02 +00:00
|
|
|
source: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
strength: server.strength.default,
|
2023-02-11 23:41:58 +00:00
|
|
|
tileOrder: server.tileOrder.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
setInpaint(params) {
|
|
|
|
set((prev) => ({
|
|
|
|
inpaint: {
|
|
|
|
...prev.inpaint,
|
|
|
|
...params,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
resetInpaint() {
|
|
|
|
set({
|
|
|
|
inpaint: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
|
|
|
fillColor: server.fillColor.default,
|
|
|
|
filter: server.filter.default,
|
2023-01-13 20:39:07 +00:00
|
|
|
mask: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
noise: server.noise.default,
|
2023-01-13 20:39:07 +00:00
|
|
|
source: null,
|
2023-01-27 23:27:11 +00:00
|
|
|
strength: server.strength.default,
|
2023-02-11 23:41:58 +00:00
|
|
|
tileOrder: server.tileOrder.default,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createHistorySlice: Slice<HistorySlice> = (set) => ({
|
2023-01-12 23:49:51 +00:00
|
|
|
history: [],
|
2023-01-27 23:27:11 +00:00
|
|
|
limit: DEFAULT_HISTORY.limit,
|
2023-02-04 16:50:20 +00:00
|
|
|
loading: [],
|
2023-02-04 18:30:03 +00:00
|
|
|
clearLoading(image) {
|
2023-02-04 16:50:20 +00:00
|
|
|
set((prev) => ({
|
|
|
|
...prev,
|
2023-02-04 18:30:03 +00:00
|
|
|
loading: prev.loading.filter((it) => it.image.output.key !== image.output.key),
|
2023-02-04 16:50:20 +00:00
|
|
|
}));
|
|
|
|
},
|
2023-01-12 23:49:51 +00:00
|
|
|
pushHistory(image) {
|
|
|
|
set((prev) => ({
|
|
|
|
...prev,
|
|
|
|
history: [
|
|
|
|
image,
|
|
|
|
...prev.history,
|
2023-01-27 23:27:11 +00:00
|
|
|
].slice(0, prev.limit + DEFAULT_HISTORY.scrollback),
|
2023-02-04 18:30:03 +00:00
|
|
|
loading: prev.loading.filter((it) => it.image.output.key !== image.output.key),
|
2023-01-12 23:49:51 +00:00
|
|
|
}));
|
|
|
|
},
|
2023-02-04 17:56:14 +00:00
|
|
|
pushLoading(image) {
|
|
|
|
set((prev) => ({
|
|
|
|
...prev,
|
|
|
|
loading: [
|
|
|
|
{
|
|
|
|
image,
|
|
|
|
ready: {
|
|
|
|
progress: 0,
|
|
|
|
ready: false,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
...prev.loading,
|
|
|
|
],
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
removeHistory(image) {
|
|
|
|
set((prev) => ({
|
|
|
|
...prev,
|
|
|
|
history: prev.history.filter((it) => it.output !== image.output),
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
setLimit(limit) {
|
|
|
|
set((prev) => ({
|
|
|
|
...prev,
|
|
|
|
limit,
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
setReady(image, ready) {
|
2023-02-04 16:50:20 +00:00
|
|
|
set((prev) => {
|
|
|
|
const loading = [...prev.loading];
|
|
|
|
const idx = loading.findIndex((it) => it.image.output.key === image.output.key);
|
|
|
|
if (idx >= 0) {
|
|
|
|
loading[idx].ready = ready;
|
|
|
|
} else {
|
2023-02-04 17:56:14 +00:00
|
|
|
// TODO: error
|
2023-02-04 16:50:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
...prev,
|
|
|
|
loading,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
},
|
2023-01-12 23:49:51 +00:00
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createOutpaintSlice: Slice<OutpaintSlice> = (set) => ({
|
2023-01-15 00:07:05 +00:00
|
|
|
outpaint: {
|
2023-01-15 00:30:27 +00:00
|
|
|
enabled: false,
|
2023-01-27 23:27:11 +00:00
|
|
|
left: server.left.default,
|
|
|
|
right: server.right.default,
|
|
|
|
top: server.top.default,
|
|
|
|
bottom: server.bottom.default,
|
2023-01-15 00:07:05 +00:00
|
|
|
},
|
|
|
|
setOutpaint(pixels) {
|
|
|
|
set((prev) => ({
|
|
|
|
outpaint: {
|
|
|
|
...prev.outpaint,
|
|
|
|
...pixels,
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createBrushSlice: Slice<BrushSlice> = (set) => ({
|
2023-01-15 00:07:05 +00:00
|
|
|
brush: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...DEFAULT_BRUSH,
|
2023-01-15 00:07:05 +00:00
|
|
|
},
|
|
|
|
setBrush(brush) {
|
|
|
|
set((prev) => ({
|
|
|
|
brush: {
|
|
|
|
...prev.brush,
|
|
|
|
...brush,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createUpscaleSlice: Slice<UpscaleSlice> = (set) => ({
|
2023-01-16 20:05:04 +00:00
|
|
|
upscale: {
|
2023-01-27 23:27:11 +00:00
|
|
|
denoise: server.denoise.default,
|
2023-01-16 20:05:04 +00:00
|
|
|
enabled: false,
|
|
|
|
faces: false,
|
2023-02-06 23:13:37 +00:00
|
|
|
faceOutscale: server.faceOutscale.default,
|
2023-01-27 23:27:11 +00:00
|
|
|
faceStrength: server.faceStrength.default,
|
2023-02-06 23:13:37 +00:00
|
|
|
outscale: server.outscale.default,
|
|
|
|
scale: server.scale.default,
|
2023-02-18 16:59:59 +00:00
|
|
|
upscaleOrder: server.upscaleOrder.default,
|
2023-01-16 20:05:04 +00:00
|
|
|
},
|
2023-01-17 05:45:54 +00:00
|
|
|
upscaleTab: {
|
2023-02-19 19:18:20 +00:00
|
|
|
negativePrompt: server.negativePrompt.default,
|
|
|
|
prompt: server.prompt.default,
|
2023-01-17 05:45:54 +00:00
|
|
|
source: null,
|
|
|
|
},
|
2023-01-16 20:05:04 +00:00
|
|
|
setUpscale(upscale) {
|
|
|
|
set((prev) => ({
|
|
|
|
upscale: {
|
|
|
|
...prev.upscale,
|
|
|
|
...upscale,
|
2023-01-17 05:45:54 +00:00
|
|
|
},
|
2023-01-16 20:05:04 +00:00
|
|
|
}));
|
|
|
|
},
|
2023-01-17 05:45:54 +00:00
|
|
|
setUpscaleTab(source) {
|
|
|
|
set((prev) => ({
|
|
|
|
upscaleTab: {
|
|
|
|
...prev.upscaleTab,
|
|
|
|
...source,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
resetUpscaleTab() {
|
|
|
|
set({
|
|
|
|
upscaleTab: {
|
2023-02-19 19:18:20 +00:00
|
|
|
negativePrompt: server.negativePrompt.default,
|
|
|
|
prompt: server.prompt.default,
|
2023-01-17 05:45:54 +00:00
|
|
|
source: null,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
2023-01-16 20:05:04 +00:00
|
|
|
});
|
|
|
|
|
2023-02-12 22:52:50 +00:00
|
|
|
const createBlendSlice: Slice<BlendSlice> = (set) => ({
|
|
|
|
blend: {
|
|
|
|
mask: null,
|
|
|
|
sources: [],
|
|
|
|
},
|
|
|
|
setBlend(blend) {
|
|
|
|
set((prev) => ({
|
|
|
|
blend: {
|
|
|
|
...prev.blend,
|
|
|
|
...blend,
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
resetBlend() {
|
2023-02-19 19:18:20 +00:00
|
|
|
set({
|
2023-02-12 22:52:50 +00:00
|
|
|
blend: {
|
|
|
|
mask: null,
|
|
|
|
sources: [],
|
|
|
|
},
|
2023-02-19 19:18:20 +00:00
|
|
|
});
|
2023-02-12 22:52:50 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createDefaultSlice: Slice<DefaultSlice> = (set) => ({
|
2023-01-12 23:49:51 +00:00
|
|
|
defaults: {
|
2023-01-27 23:27:11 +00:00
|
|
|
...base,
|
2023-01-12 23:49:51 +00:00
|
|
|
},
|
|
|
|
setDefaults(params) {
|
|
|
|
set((prev) => ({
|
|
|
|
defaults: {
|
|
|
|
...prev.defaults,
|
|
|
|
...params,
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-27 23:27:11 +00:00
|
|
|
const createModelSlice: Slice<ModelSlice> = (set) => ({
|
2023-01-17 02:11:10 +00:00
|
|
|
model: {
|
2023-01-27 23:27:11 +00:00
|
|
|
model: server.model.default,
|
|
|
|
platform: server.platform.default,
|
|
|
|
upscaling: server.upscaling.default,
|
|
|
|
correction: server.correction.default,
|
2023-02-05 23:23:47 +00:00
|
|
|
lpw: false,
|
2023-01-17 02:11:10 +00:00
|
|
|
},
|
|
|
|
setModel(params) {
|
|
|
|
set((prev) => ({
|
|
|
|
model: {
|
|
|
|
...prev.model,
|
|
|
|
...params,
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-02-11 21:22:24 +00:00
|
|
|
const createResetSlice: Slice<ResetSlice> = (set) => ({
|
|
|
|
resetAll() {
|
|
|
|
set((prev) => {
|
|
|
|
const next = {...prev};
|
|
|
|
next.resetImg2Img();
|
|
|
|
next.resetInpaint();
|
|
|
|
next.resetTxt2Img();
|
|
|
|
next.resetUpscaleTab();
|
2023-02-12 22:52:50 +00:00
|
|
|
next.resetBlend();
|
2023-02-11 21:22:24 +00:00
|
|
|
// TODO: reset more stuff
|
|
|
|
return next;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2023-01-12 23:49:51 +00:00
|
|
|
return {
|
2023-01-16 20:05:04 +00:00
|
|
|
createBrushSlice,
|
2023-01-12 23:49:51 +00:00
|
|
|
createDefaultSlice,
|
|
|
|
createHistorySlice,
|
|
|
|
createImg2ImgSlice,
|
|
|
|
createInpaintSlice,
|
2023-01-17 02:11:10 +00:00
|
|
|
createModelSlice,
|
2023-01-15 00:07:05 +00:00
|
|
|
createOutpaintSlice,
|
2023-01-16 20:05:04 +00:00
|
|
|
createTxt2ImgSlice,
|
|
|
|
createUpscaleSlice,
|
2023-02-12 22:52:50 +00:00
|
|
|
createBlendSlice,
|
2023-02-11 21:22:24 +00:00
|
|
|
createResetSlice,
|
2023-01-12 23:49:51 +00:00
|
|
|
};
|
|
|
|
}
|