IP adapter UI

This commit is contained in:
Mary Hipp
2023-10-03 13:28:15 -04:00
committed by psychedelicious
parent 4bda7d7df5
commit 24d73d484a
3 changed files with 59 additions and 7 deletions

View File

@ -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>
); );
}; };

View File

@ -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',

View File

@ -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(
() => () =>