Skip to content

Commit 6aa605e

Browse files
cursoragenthipsterusername
authored andcommitted
Add toggle for showing/hiding style preset prompt previews
Co-authored-by: kent <kent@invoke.ai>
1 parent f51014e commit 6aa605e

File tree

6 files changed

+66
-19
lines changed

6 files changed

+66
-19
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2400,7 +2400,9 @@
24002400
"uploadImage": "Upload Image",
24012401
"useForTemplate": "Use For Prompt Template",
24022402
"viewList": "View Template List",
2403-
"viewModeTooltip": "This is how your prompt will look with your currently selected template. To edit your prompt, click anywhere in the text box."
2403+
"viewModeTooltip": "This is how your prompt will look with your currently selected template. To edit your prompt, click anywhere in the text box.",
2404+
"showPromptPreviews": "Show Prompt Previews",
2405+
"hidePromptPreviews": "Hide Prompt Previews"
24042406
},
24052407
"upsell": {
24062408
"inviteTeammates": "Invite Teammates",

invokeai/frontend/web/src/features/stylePresets/components/StylePresetListItem.tsx

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { $stylePresetModalState } from 'features/stylePresets/store/stylePresetM
55
import {
66
$isStylePresetsMenuOpen,
77
activeStylePresetIdChanged,
8+
selectShowPromptPreviews,
89
selectStylePresetActivePresetId,
910
} from 'features/stylePresets/store/stylePresetSlice';
1011
import type { MouseEvent } from 'react';
@@ -18,6 +19,7 @@ import StylePresetImage from './StylePresetImage';
1819
export const StylePresetListItem = ({ preset }: { preset: StylePresetRecordWithImage }) => {
1920
const dispatch = useAppDispatch();
2021
const activeStylePresetId = useAppSelector(selectStylePresetActivePresetId);
22+
const showPromptPreviews = useAppSelector(selectShowPromptPreviews);
2123
const { t } = useTranslation();
2224
const deleteStylePreset = useDeleteStylePreset();
2325

@@ -138,20 +140,22 @@ export const StylePresetListItem = ({ preset }: { preset: StylePresetRecordWithI
138140
</Flex>
139141
</Flex>
140142

141-
<Flex flexDir="column" gap={1}>
142-
<Text fontSize="xs">
143-
<Text as="span" fontWeight="semibold">
144-
{t('stylePresets.positivePrompt')}:
145-
</Text>{' '}
146-
{preset.preset_data.positive_prompt}
147-
</Text>
148-
<Text fontSize="xs">
149-
<Text as="span" fontWeight="semibold">
150-
{t('stylePresets.negativePrompt')}:
151-
</Text>{' '}
152-
{preset.preset_data.negative_prompt}
153-
</Text>
154-
</Flex>
143+
{showPromptPreviews && (
144+
<Flex flexDir="column" gap={1}>
145+
<Text fontSize="xs">
146+
<Text as="span" fontWeight="semibold">
147+
{t('stylePresets.positivePrompt')}:
148+
</Text>{' '}
149+
{preset.preset_data.positive_prompt}
150+
</Text>
151+
<Text fontSize="xs">
152+
<Text as="span" fontWeight="semibold">
153+
{t('stylePresets.negativePrompt')}:
154+
</Text>{' '}
155+
{preset.preset_data.negative_prompt}
156+
</Text>
157+
</Flex>
158+
)}
155159
</Flex>
156160
</Flex>
157161
);

invokeai/frontend/web/src/features/stylePresets/components/StylePresetMenu.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { EMPTY_ARRAY } from 'app/store/constants';
33
import { useAppSelector } from 'app/store/storeHooks';
44
import { StylePresetExportButton } from 'features/stylePresets/components/StylePresetExportButton';
55
import { StylePresetImportButton } from 'features/stylePresets/components/StylePresetImportButton';
6+
import { StylePresetPromptPreviewToggle } from 'features/stylePresets/components/StylePresetPromptPreviewToggle';
67
import { selectStylePresetSearchTerm } from 'features/stylePresets/store/stylePresetSlice';
78
import { selectAllowPrivateStylePresets } from 'features/system/store/configSlice';
89
import { useTranslation } from 'react-i18next';
@@ -54,9 +55,12 @@ export const StylePresetMenu = () => {
5455
<Flex flexDir="column" gap={2} padding={3} layerStyle="second" borderRadius="base">
5556
<Flex alignItems="center" gap={2} w="full" justifyContent="space-between">
5657
<StylePresetSearch />
57-
<StylePresetCreateButton />
58-
<StylePresetImportButton />
59-
<StylePresetExportButton />
58+
<Flex alignItems="center" gap={1}>
59+
<StylePresetPromptPreviewToggle />
60+
<StylePresetCreateButton />
61+
<StylePresetImportButton />
62+
<StylePresetExportButton />
63+
</Flex>
6064
</Flex>
6165

6266
<StylePresetList title={t('stylePresets.myTemplates')} data={data.presets} />
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { IconButton } from '@invoke-ai/ui-library';
2+
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
3+
import { selectShowPromptPreviews, showPromptPreviewsChanged } from 'features/stylePresets/store/stylePresetSlice';
4+
import { useCallback } from 'react';
5+
import { useTranslation } from 'react-i18next';
6+
import { PiEyeBold, PiEyeSlashBold } from 'react-icons/pi';
7+
8+
export const StylePresetPromptPreviewToggle = () => {
9+
const dispatch = useAppDispatch();
10+
const showPromptPreviews = useAppSelector(selectShowPromptPreviews);
11+
const { t } = useTranslation();
12+
13+
const handleToggle = useCallback(() => {
14+
dispatch(showPromptPreviewsChanged(!showPromptPreviews));
15+
}, [dispatch, showPromptPreviews]);
16+
17+
return (
18+
<IconButton
19+
size="sm"
20+
variant="ghost"
21+
aria-label={showPromptPreviews ? t('stylePresets.hidePromptPreviews') : t('stylePresets.showPromptPreviews')}
22+
tooltip={showPromptPreviews ? t('stylePresets.hidePromptPreviews') : t('stylePresets.showPromptPreviews')}
23+
onClick={handleToggle}
24+
icon={showPromptPreviews ? <PiEyeBold /> : <PiEyeSlashBold />}
25+
colorScheme={showPromptPreviews ? 'invokeBlue' : 'base'}
26+
/>
27+
);
28+
};

invokeai/frontend/web/src/features/stylePresets/store/stylePresetSlice.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const initialState: StylePresetState = {
1212
activeStylePresetId: null,
1313
searchTerm: '',
1414
viewMode: false,
15+
showPromptPreviews: false,
1516
};
1617

1718
export const stylePresetSlice = createSlice({
@@ -27,6 +28,9 @@ export const stylePresetSlice = createSlice({
2728
viewModeChanged: (state, action: PayloadAction<boolean>) => {
2829
state.viewMode = action.payload;
2930
},
31+
showPromptPreviewsChanged: (state, action: PayloadAction<boolean>) => {
32+
state.showPromptPreviews = action.payload;
33+
},
3034
},
3135
extraReducers(builder) {
3236
builder.addCase(paramsReset, () => {
@@ -53,13 +57,16 @@ export const stylePresetSlice = createSlice({
5357
},
5458
});
5559

56-
export const { activeStylePresetIdChanged, searchTermChanged, viewModeChanged } = stylePresetSlice.actions;
60+
export const { activeStylePresetIdChanged, searchTermChanged, viewModeChanged, showPromptPreviewsChanged } = stylePresetSlice.actions;
5761

5862
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
5963
const migrateStylePresetState = (state: any): any => {
6064
if (!('_version' in state)) {
6165
state._version = 1;
6266
}
67+
if (!('showPromptPreviews' in state)) {
68+
state.showPromptPreviews = false;
69+
}
6370
return state;
6471
};
6572

@@ -79,6 +86,7 @@ export const selectStylePresetActivePresetId = createStylePresetSelector(
7986
);
8087
export const selectStylePresetViewMode = createStylePresetSelector((stylePreset) => stylePreset.viewMode);
8188
export const selectStylePresetSearchTerm = createStylePresetSelector((stylePreset) => stylePreset.searchTerm);
89+
export const selectShowPromptPreviews = createStylePresetSelector((stylePreset) => stylePreset.showPromptPreviews);
8290

8391
/**
8492
* Tracks whether or not the style preset menu is open.

invokeai/frontend/web/src/features/stylePresets/store/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export type StylePresetState = {
22
activeStylePresetId: string | null;
33
searchTerm: string;
44
viewMode: boolean;
5+
showPromptPreviews: boolean;
56
};

0 commit comments

Comments
 (0)