mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
IP adapter UI
This commit is contained in:
committed by
psychedelicious
parent
4bda7d7df5
commit
24d73d484a
@ -5,8 +5,23 @@ import ParamIPAdapterFeatureToggle from './ParamIPAdapterFeatureToggle';
|
|||||||
import ParamIPAdapterImage from './ParamIPAdapterImage';
|
import ParamIPAdapterImage from './ParamIPAdapterImage';
|
||||||
import ParamIPAdapterModelSelect from './ParamIPAdapterModelSelect';
|
import ParamIPAdapterModelSelect from './ParamIPAdapterModelSelect';
|
||||||
import ParamIPAdapterWeight from './ParamIPAdapterWeight';
|
import ParamIPAdapterWeight from './ParamIPAdapterWeight';
|
||||||
|
import { createSelector } from '@reduxjs/toolkit';
|
||||||
|
import { stateSelector } from '../../../../app/store/store';
|
||||||
|
import { defaultSelectorOptions } from '../../../../app/store/util/defaultMemoizeOptions';
|
||||||
|
import { useAppSelector } from '../../../../app/store/storeHooks';
|
||||||
|
|
||||||
|
const selector = createSelector(
|
||||||
|
stateSelector,
|
||||||
|
(state) => {
|
||||||
|
const { isIPAdapterEnabled } = state.controlNet;
|
||||||
|
|
||||||
|
return { isIPAdapterEnabled };
|
||||||
|
},
|
||||||
|
defaultSelectorOptions
|
||||||
|
);
|
||||||
|
|
||||||
const IPAdapterPanel = () => {
|
const IPAdapterPanel = () => {
|
||||||
|
const { isIPAdapterEnabled } = useAppSelector(selector);
|
||||||
return (
|
return (
|
||||||
<Flex
|
<Flex
|
||||||
sx={{
|
sx={{
|
||||||
@ -14,7 +29,6 @@ const IPAdapterPanel = () => {
|
|||||||
gap: 3,
|
gap: 3,
|
||||||
paddingInline: 3,
|
paddingInline: 3,
|
||||||
paddingBlock: 2,
|
paddingBlock: 2,
|
||||||
paddingBottom: 5,
|
|
||||||
borderRadius: 'base',
|
borderRadius: 'base',
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
bg: 'base.250',
|
bg: 'base.250',
|
||||||
@ -24,10 +38,26 @@ const IPAdapterPanel = () => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ParamIPAdapterFeatureToggle />
|
<ParamIPAdapterFeatureToggle />
|
||||||
<ParamIPAdapterImage />
|
{isIPAdapterEnabled && (
|
||||||
<ParamIPAdapterModelSelect />
|
<>
|
||||||
<ParamIPAdapterWeight />
|
<ParamIPAdapterModelSelect />
|
||||||
<ParamIPAdapterBeginEnd />
|
<Flex gap="3">
|
||||||
|
<Flex
|
||||||
|
flexDirection="column"
|
||||||
|
sx={{
|
||||||
|
h: 28,
|
||||||
|
w: 'full',
|
||||||
|
gap: 4,
|
||||||
|
mb: 4,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ParamIPAdapterWeight />
|
||||||
|
<ParamIPAdapterBeginEnd />
|
||||||
|
</Flex>
|
||||||
|
<ParamIPAdapterImage />
|
||||||
|
</Flex>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -66,7 +66,8 @@ const ParamIPAdapterImage = () => {
|
|||||||
layerStyle="second"
|
layerStyle="second"
|
||||||
sx={{
|
sx={{
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
w: 'full',
|
h: 28,
|
||||||
|
w: 28,
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
aspectRatio: '1/1',
|
aspectRatio: '1/1',
|
||||||
|
@ -6,7 +6,7 @@ import { ipAdapterModelChanged } from 'features/controlNet/store/controlNetSlice
|
|||||||
import { MODEL_TYPE_MAP } from 'features/parameters/types/constants';
|
import { MODEL_TYPE_MAP } from 'features/parameters/types/constants';
|
||||||
import { modelIdToIPAdapterModelParam } from 'features/parameters/util/modelIdToIPAdapterModelParams';
|
import { modelIdToIPAdapterModelParam } from 'features/parameters/util/modelIdToIPAdapterModelParams';
|
||||||
import { forEach } from 'lodash-es';
|
import { forEach } from 'lodash-es';
|
||||||
import { memo, useCallback, useMemo } from 'react';
|
import { memo, useCallback, useEffect, useMemo } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useGetIPAdapterModelsQuery } from 'services/api/endpoints/models';
|
import { useGetIPAdapterModelsQuery } from 'services/api/endpoints/models';
|
||||||
|
|
||||||
@ -24,6 +24,27 @@ const ParamIPAdapterModelSelect = () => {
|
|||||||
|
|
||||||
const { data: ipAdapterModels } = useGetIPAdapterModelsQuery();
|
const { data: ipAdapterModels } = useGetIPAdapterModelsQuery();
|
||||||
|
|
||||||
|
const firstModel = useMemo(() => {
|
||||||
|
if (!ipAdapterModels || !Object.keys(ipAdapterModels.entities).length) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const firstModelId = Object.keys(ipAdapterModels.entities)[0];
|
||||||
|
|
||||||
|
if (!firstModelId) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstModel = ipAdapterModels.entities[firstModelId];
|
||||||
|
|
||||||
|
return firstModel ? firstModel : undefined;
|
||||||
|
}, [ipAdapterModels]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (firstModel) {
|
||||||
|
dispatch(ipAdapterModelChanged(firstModel));
|
||||||
|
}
|
||||||
|
}, [firstModel, dispatch]);
|
||||||
|
|
||||||
// grab the full model entity from the RTK Query cache
|
// grab the full model entity from the RTK Query cache
|
||||||
const selectedModel = useMemo(
|
const selectedModel = useMemo(
|
||||||
() =>
|
() =>
|
||||||
|
Reference in New Issue
Block a user