mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
fix(ui): lint & fix issues with adding regional ip adapters
This commit is contained in:
parent
c776ac3af2
commit
afc6f83d72
@ -1,6 +1,5 @@
|
|||||||
import { Button, ButtonGroup, Flex } from '@invoke-ai/ui-library';
|
import { Button, ButtonGroup, Flex } from '@invoke-ai/ui-library';
|
||||||
import { useAppDispatch } from 'app/store/storeHooks';
|
import { useAppDispatch } from 'app/store/storeHooks';
|
||||||
import { useDefaultControlAdapter, useDefaultIPAdapter } from 'features/controlLayers/hooks/useLayerControlAdapter';
|
|
||||||
import {
|
import {
|
||||||
controlLayerAdded,
|
controlLayerAdded,
|
||||||
inpaintMaskAdded,
|
inpaintMaskAdded,
|
||||||
@ -15,23 +14,21 @@ import { PiPlusBold } from 'react-icons/pi';
|
|||||||
export const CanvasAddEntityButtons = memo(() => {
|
export const CanvasAddEntityButtons = memo(() => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const defaultControlAdapter = useDefaultControlAdapter();
|
|
||||||
const defaultIPAdapter = useDefaultIPAdapter();
|
|
||||||
const addInpaintMask = useCallback(() => {
|
const addInpaintMask = useCallback(() => {
|
||||||
dispatch(inpaintMaskAdded());
|
dispatch(inpaintMaskAdded({ isSelected: true }));
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
const addRegionalGuidance = useCallback(() => {
|
const addRegionalGuidance = useCallback(() => {
|
||||||
dispatch(rgAdded());
|
dispatch(rgAdded({ isSelected: true }));
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
const addRasterLayer = useCallback(() => {
|
const addRasterLayer = useCallback(() => {
|
||||||
dispatch(rasterLayerAdded({ isSelected: true }));
|
dispatch(rasterLayerAdded({ isSelected: true }));
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
const addControlLayer = useCallback(() => {
|
const addControlLayer = useCallback(() => {
|
||||||
dispatch(controlLayerAdded({ isSelected: true, overrides: { controlAdapter: defaultControlAdapter } }));
|
dispatch(controlLayerAdded({ isSelected: true }));
|
||||||
}, [defaultControlAdapter, dispatch]);
|
}, [dispatch]);
|
||||||
const addIPAdapter = useCallback(() => {
|
const addIPAdapter = useCallback(() => {
|
||||||
dispatch(ipaAdded({ ipAdapter: defaultIPAdapter }));
|
dispatch(ipaAdded({ isSelected: true }));
|
||||||
}, [defaultIPAdapter, dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex flexDir="column" w="full" h="full" alignItems="center" justifyContent="center">
|
<Flex flexDir="column" w="full" h="full" alignItems="center" justifyContent="center">
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import { Button, Flex } from '@invoke-ai/ui-library';
|
import { Button, Flex } from '@invoke-ai/ui-library';
|
||||||
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
|
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { useDefaultIPAdapter } from 'features/controlLayers/hooks/useLayerControlAdapter';
|
|
||||||
import { nanoid } from 'features/controlLayers/konva/util';
|
|
||||||
import {
|
import {
|
||||||
rgIPAdapterAdded,
|
rgIPAdapterAdded,
|
||||||
rgNegativePromptChanged,
|
rgNegativePromptChanged,
|
||||||
@ -20,7 +18,6 @@ type AddPromptButtonProps = {
|
|||||||
export const RegionalGuidanceAddPromptsIPAdapterButtons = ({ id }: AddPromptButtonProps) => {
|
export const RegionalGuidanceAddPromptsIPAdapterButtons = ({ id }: AddPromptButtonProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const defaultIPAdapter = useDefaultIPAdapter();
|
|
||||||
const selectValidActions = useMemo(
|
const selectValidActions = useMemo(
|
||||||
() =>
|
() =>
|
||||||
createMemoizedSelector(selectCanvasV2Slice, (canvasV2) => {
|
createMemoizedSelector(selectCanvasV2Slice, (canvasV2) => {
|
||||||
@ -40,8 +37,8 @@ export const RegionalGuidanceAddPromptsIPAdapterButtons = ({ id }: AddPromptButt
|
|||||||
dispatch(rgNegativePromptChanged({ id, prompt: '' }));
|
dispatch(rgNegativePromptChanged({ id, prompt: '' }));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
const addIPAdapter = useCallback(() => {
|
const addIPAdapter = useCallback(() => {
|
||||||
dispatch(rgIPAdapterAdded({ id, ipAdapter: { ...defaultIPAdapter, id: nanoid() } }));
|
dispatch(rgIPAdapterAdded({ id }));
|
||||||
}, [defaultIPAdapter, dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex w="full" p={2} justifyContent="space-between">
|
<Flex w="full" p={2} justifyContent="space-between">
|
||||||
|
@ -2,8 +2,6 @@ import { MenuItem } from '@invoke-ai/ui-library';
|
|||||||
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
|
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { useEntityIdentifierContext } from 'features/controlLayers/contexts/EntityIdentifierContext';
|
import { useEntityIdentifierContext } from 'features/controlLayers/contexts/EntityIdentifierContext';
|
||||||
import { useDefaultIPAdapter } from 'features/controlLayers/hooks/useLayerControlAdapter';
|
|
||||||
import { nanoid } from 'features/controlLayers/konva/util';
|
|
||||||
import {
|
import {
|
||||||
rgIPAdapterAdded,
|
rgIPAdapterAdded,
|
||||||
rgNegativePromptChanged,
|
rgNegativePromptChanged,
|
||||||
@ -17,7 +15,6 @@ export const RegionalGuidanceMenuItemsAddPromptsAndIPAdapter = memo(() => {
|
|||||||
const { id } = useEntityIdentifierContext();
|
const { id } = useEntityIdentifierContext();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const defaultIPAdapter = useDefaultIPAdapter();
|
|
||||||
const selectValidActions = useMemo(
|
const selectValidActions = useMemo(
|
||||||
() =>
|
() =>
|
||||||
createMemoizedSelector(selectCanvasV2Slice, (canvasV2) => {
|
createMemoizedSelector(selectCanvasV2Slice, (canvasV2) => {
|
||||||
@ -37,8 +34,8 @@ export const RegionalGuidanceMenuItemsAddPromptsAndIPAdapter = memo(() => {
|
|||||||
dispatch(rgNegativePromptChanged({ id: id, prompt: '' }));
|
dispatch(rgNegativePromptChanged({ id: id, prompt: '' }));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
const addIPAdapter = useCallback(() => {
|
const addIPAdapter = useCallback(() => {
|
||||||
dispatch(rgIPAdapterAdded({ id, ipAdapter: { ...defaultIPAdapter, id: nanoid() } }));
|
dispatch(rgIPAdapterAdded({ id }));
|
||||||
}, [defaultIPAdapter, dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
@ -27,6 +27,7 @@ export const useControlLayerControlAdapter = (entityIdentifier: CanvasEntityIden
|
|||||||
return controlAdapter;
|
return controlAdapter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** @knipignore */
|
||||||
export const useDefaultControlAdapter = (): ControlNetConfig | T2IAdapterConfig => {
|
export const useDefaultControlAdapter = (): ControlNetConfig | T2IAdapterConfig => {
|
||||||
const [modelConfigs] = useControlNetAndT2IAdapterModels();
|
const [modelConfigs] = useControlNetAndT2IAdapterModels();
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ export const useDefaultControlAdapter = (): ControlNetConfig | T2IAdapterConfig
|
|||||||
return defaultControlAdapter;
|
return defaultControlAdapter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** @knipignore */
|
||||||
export const useDefaultIPAdapter = (): IPAdapterConfig => {
|
export const useDefaultIPAdapter = (): IPAdapterConfig => {
|
||||||
const [modelConfigs] = useIPAdapterModels();
|
const [modelConfigs] = useIPAdapterModels();
|
||||||
|
|
||||||
|
@ -15,11 +15,6 @@ export const BRUSH_BORDER_INNER_COLOR = 'rgba(0,0,0,1)';
|
|||||||
*/
|
*/
|
||||||
export const BRUSH_BORDER_OUTER_COLOR = 'rgba(255,255,255,0.8)';
|
export const BRUSH_BORDER_OUTER_COLOR = 'rgba(255,255,255,0.8)';
|
||||||
|
|
||||||
/**
|
|
||||||
* The border width for the brush preview.
|
|
||||||
*/
|
|
||||||
export const BRUSH_ERASER_BORDER_WIDTH = 1;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The target spacing of individual points of brush strokes, as a percentage of the brush size.
|
* The target spacing of individual points of brush strokes, as a percentage of the brush size.
|
||||||
*/
|
*/
|
||||||
|
@ -175,7 +175,7 @@ function selectAllEntitiesOfType(state: CanvasV2State, type: CanvasEntityState['
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function selectAllEntities(state: CanvasV2State): CanvasEntityState[] {
|
function selectAllEntities(state: CanvasV2State): CanvasEntityState[] {
|
||||||
// These are in the same order as they are displayed in the list!
|
// These are in the same order as they are displayed in the list!
|
||||||
return [
|
return [
|
||||||
...state.inpaintMasks.entities.toReversed(),
|
...state.inpaintMasks.entities.toReversed(),
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import type { PayloadAction, SliceCaseReducers } from '@reduxjs/toolkit';
|
import type { PayloadAction, SliceCaseReducers } from '@reduxjs/toolkit';
|
||||||
|
import { deepClone } from 'common/util/deepClone';
|
||||||
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
||||||
import type {
|
import type {
|
||||||
CanvasV2State,
|
CanvasV2State,
|
||||||
@ -8,7 +9,7 @@ import type {
|
|||||||
RegionalGuidanceIPAdapterConfig,
|
RegionalGuidanceIPAdapterConfig,
|
||||||
RgbColor,
|
RgbColor,
|
||||||
} from 'features/controlLayers/store/types';
|
} from 'features/controlLayers/store/types';
|
||||||
import { getEntityIdentifier, imageDTOToImageWithDims } from 'features/controlLayers/store/types';
|
import { getEntityIdentifier, imageDTOToImageWithDims, initialIPAdapter } from 'features/controlLayers/store/types';
|
||||||
import { zModelIdentifierField } from 'features/nodes/types/common';
|
import { zModelIdentifierField } from 'features/nodes/types/common';
|
||||||
import { isEqual, merge } from 'lodash-es';
|
import { isEqual, merge } from 'lodash-es';
|
||||||
import type { ImageDTO, IPAdapterModelConfig } from 'services/api/types';
|
import type { ImageDTO, IPAdapterModelConfig } from 'services/api/types';
|
||||||
@ -134,14 +135,24 @@ export const regionsReducers = {
|
|||||||
}
|
}
|
||||||
rg.autoNegative = !rg.autoNegative;
|
rg.autoNegative = !rg.autoNegative;
|
||||||
},
|
},
|
||||||
rgIPAdapterAdded: (state, action: PayloadAction<{ id: string; ipAdapter: RegionalGuidanceIPAdapterConfig }>) => {
|
rgIPAdapterAdded: {
|
||||||
const { id, ipAdapter } = action.payload;
|
reducer: (
|
||||||
|
state,
|
||||||
|
action: PayloadAction<{ id: string; ipAdapterId: string; overrides?: Partial<RegionalGuidanceIPAdapterConfig> }>
|
||||||
|
) => {
|
||||||
|
const { id, overrides, ipAdapterId } = action.payload;
|
||||||
const entity = selectRegionalGuidanceEntity(state, id);
|
const entity = selectRegionalGuidanceEntity(state, id);
|
||||||
if (!entity) {
|
if (!entity) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const ipAdapter = { ...deepClone(initialIPAdapter), id: ipAdapterId };
|
||||||
|
merge(ipAdapter, overrides);
|
||||||
entity.ipAdapters.push(ipAdapter);
|
entity.ipAdapters.push(ipAdapter);
|
||||||
},
|
},
|
||||||
|
prepare: (payload: { id: string; overrides?: Partial<RegionalGuidanceIPAdapterConfig> }) => ({
|
||||||
|
payload: { ...payload, ipAdapterId: getPrefixedId('regional_guidance_ip_adapter') },
|
||||||
|
}),
|
||||||
|
},
|
||||||
rgIPAdapterDeleted: (state, action: PayloadAction<{ id: string; ipAdapterId: string }>) => {
|
rgIPAdapterDeleted: (state, action: PayloadAction<{ id: string; ipAdapterId: string }>) => {
|
||||||
const { id, ipAdapterId } = action.payload;
|
const { id, ipAdapterId } = action.payload;
|
||||||
const entity = selectRegionalGuidanceEntity(state, id);
|
const entity = selectRegionalGuidanceEntity(state, id);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user