Skip to content

Commit 5b4bad1

Browse files
Updated
1 parent 80e9f30 commit 5b4bad1

File tree

4 files changed

+48
-16
lines changed

4 files changed

+48
-16
lines changed

invokeai/frontend/web/public/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,6 +2368,7 @@
23682368
"upscaleModel": "Upscale Model",
23692369
"postProcessingModel": "Post-Processing Model",
23702370
"scale": "Scale",
2371+
"tileControl": "Tile Control",
23712372
"postProcessingMissingModelWarning": "Visit the <LinkComponent>Model Manager</LinkComponent> to install a post-processing (image to image) model.",
23722373
"missingModelsWarning": "Visit the <LinkComponent>Model Manager</LinkComponent> to install the required models:",
23732374
"mainModelDesc": "Main model (SD1.5 or SDXL architecture)",

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import { refImageModelChanged, selectRefImagesSlice } from 'features/controlLaye
1515
import { selectCanvasSlice } from 'features/controlLayers/store/selectors';
1616
import { getEntityIdentifier, isFLUXReduxConfig, isIPAdapterConfig } from 'features/controlLayers/store/types';
1717
import { modelSelected } from 'features/parameters/store/actions';
18-
import { postProcessingModelChanged, tileControlnetModelChanged, upscaleModelChanged } from 'features/parameters/store/upscaleSlice';
18+
import {
19+
postProcessingModelChanged,
20+
tileControlnetModelChanged,
21+
upscaleModelChanged,
22+
} from 'features/parameters/store/upscaleSlice';
1923
import {
2024
zParameterCLIPEmbedModel,
2125
zParameterSpandrelImageToImageModel,
@@ -358,7 +362,7 @@ const handleTileControlNetModel: ModelHandler = (models, state, dispatch, log) =
358362

359363
// Find a model with "Tile" in the name, case-insensitive
360364
const tileModel = controlNetModels.find((m) => m.name.toLowerCase().includes('tile'));
361-
365+
362366
// If we have a tile model, select it
363367
if (tileModel) {
364368
log.debug(

invokeai/frontend/web/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
1+
import { FormControl, FormLabel } from '@invoke-ai/ui-library';
22
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
3-
import { useModelCombobox } from 'common/hooks/useModelCombobox';
3+
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
4+
import { selectBase } from 'features/controlLayers/store/paramsSlice';
5+
import { ModelPicker } from 'features/parameters/components/ModelPicker';
46
import { selectTileControlNetModel, tileControlnetModelChanged } from 'features/parameters/store/upscaleSlice';
5-
import { memo, useCallback } from 'react';
7+
import { memo, useCallback, useMemo } from 'react';
68
import { useTranslation } from 'react-i18next';
79
import { useControlNetModels } from 'services/api/hooks/modelsByType';
810
import type { ControlNetModelConfig } from 'services/api/types';
@@ -11,26 +13,51 @@ const ParamTileControlNetModel = () => {
1113
const dispatch = useAppDispatch();
1214
const { t } = useTranslation();
1315
const tileControlNetModel = useAppSelector(selectTileControlNetModel);
16+
const currentBaseModel = useAppSelector(selectBase);
1417
const [modelConfigs, { isLoading }] = useControlNetModels();
1518

1619
const _onChange = useCallback(
17-
(controlNetModel: ControlNetModelConfig | null) => {
20+
(controlNetModel: ControlNetModelConfig) => {
1821
dispatch(tileControlnetModelChanged(controlNetModel));
1922
},
2023
[dispatch]
2124
);
2225

23-
const { options, value, onChange, noOptionsMessage } = useModelCombobox({
24-
modelConfigs,
25-
onChange: _onChange,
26-
selectedModel: tileControlNetModel,
27-
isLoading,
28-
});
26+
const filteredModelConfigs = useMemo(() => {
27+
if (!currentBaseModel) {
28+
return [];
29+
}
30+
return modelConfigs.filter((model) => {
31+
const isCompatible = model.base === currentBaseModel;
32+
const isTileOrMultiModel = model.name.toLowerCase().includes('tile') || model.name.toLowerCase().includes('union');
33+
return isCompatible && isTileOrMultiModel;
34+
});
35+
}, [modelConfigs, currentBaseModel]);
36+
37+
const getIsOptionDisabled = useCallback(
38+
(model: ControlNetModelConfig): boolean => {
39+
const isCompatible = currentBaseModel === model.base;
40+
const hasMainModel = Boolean(currentBaseModel);
41+
return !hasMainModel || !isCompatible;
42+
},
43+
[currentBaseModel]
44+
);
2945

3046
return (
31-
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1} gap={2}>
32-
<FormLabel m={0}>{t('controlNet')}</FormLabel>
33-
<Combobox value={value} options={options} onChange={onChange} noOptionsMessage={noOptionsMessage} />
47+
<FormControl isDisabled={!filteredModelConfigs.length} isInvalid={!filteredModelConfigs.length} minW={0} flexGrow={1} gap={2}>
48+
<InformationalPopover feature="controlNet">
49+
<FormLabel m={0}>{t('upscaling.tileControl')}</FormLabel>
50+
</InformationalPopover>
51+
<ModelPicker
52+
modelConfigs={filteredModelConfigs}
53+
selectedModelConfig={tileControlNetModel ?? undefined}
54+
onChange={_onChange}
55+
getIsOptionDisabled={getIsOptionDisabled}
56+
placeholder={t('common.placeholderSelectAModel')}
57+
noOptionsText={t('upscaling.missingTileControlNetModel')}
58+
isDisabled={isLoading || !filteredModelConfigs.length}
59+
isInvalid={!filteredModelConfigs.length}
60+
/>
3461
</FormControl>
3562
);
3663
};

invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import ParamClipSkip from 'features/parameters/components/Advanced/ParamClipSkip
1212
import ParamT5EncoderModelSelect from 'features/parameters/components/Advanced/ParamT5EncoderModelSelect';
1313
import ParamSeamlessXAxis from 'features/parameters/components/Seamless/ParamSeamlessXAxis';
1414
import ParamSeamlessYAxis from 'features/parameters/components/Seamless/ParamSeamlessYAxis';
15+
import ParamTileControlNetModel from 'features/parameters/components/Upscale/ParamTileControlNetModel';
1516
import ParamFLUXVAEModelSelect from 'features/parameters/components/VAEModel/ParamFLUXVAEModelSelect';
1617
import ParamVAEModelSelect from 'features/parameters/components/VAEModel/ParamVAEModelSelect';
1718
import ParamVAEPrecision from 'features/parameters/components/VAEModel/ParamVAEPrecision';
18-
import ParamTileControlNetModel from 'features/parameters/components/Upscale/ParamTileControlNetModel';
1919
import { useStandaloneAccordionToggle } from 'features/settingsAccordions/hooks/useStandaloneAccordionToggle';
2020
import { selectActiveTab } from 'features/ui/store/uiSelectors';
2121
import { memo, useMemo } from 'react';

0 commit comments

Comments
 (0)