Skip to content

Commit 056387c

Browse files
feat(ui): allow recall of prompt and seed on upscaling tab
1 parent 8a43d90 commit 056387c

File tree

6 files changed

+56
-8
lines changed

6 files changed

+56
-8
lines changed

invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/ImageMenuItemMetadataRecallActions.tsx renamed to invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/ImageMenuItemMetadataRecallActionsCanvasGenerateTabs.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
PiRulerBold,
1818
} from 'react-icons/pi';
1919

20-
export const ImageMenuItemMetadataRecallActions = memo(() => {
20+
export const ImageMenuItemMetadataRecallActionsCanvasGenerateTabs = memo(() => {
2121
const { t } = useTranslation();
2222
const subMenu = useSubMenu();
2323

@@ -61,4 +61,5 @@ export const ImageMenuItemMetadataRecallActions = memo(() => {
6161
);
6262
});
6363

64-
ImageMenuItemMetadataRecallActions.displayName = 'ImageMenuItemMetadataRecallActions';
64+
ImageMenuItemMetadataRecallActionsCanvasGenerateTabs.displayName =
65+
'ImageMenuItemMetadataRecallActionsCanvasGenerateTabs';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Menu, MenuButton, MenuItem, MenuList } from '@invoke-ai/ui-library';
2+
import { SubMenuButtonContent, useSubMenu } from 'common/hooks/useSubMenu';
3+
import { useImageDTOContext } from 'features/gallery/contexts/ImageDTOContext';
4+
import { useRecallPrompts } from 'features/gallery/hooks/useRecallPrompts';
5+
import { useRecallSeed } from 'features/gallery/hooks/useRecallSeed';
6+
import { memo } from 'react';
7+
import { useTranslation } from 'react-i18next';
8+
import { PiArrowBendUpLeftBold, PiPlantBold, PiQuotesBold } from 'react-icons/pi';
9+
10+
export const ImageMenuItemMetadataRecallActionsUpscaleTab = memo(() => {
11+
const { t } = useTranslation();
12+
const subMenu = useSubMenu();
13+
14+
const imageDTO = useImageDTOContext();
15+
16+
const recallPrompts = useRecallPrompts(imageDTO);
17+
const recallSeed = useRecallSeed(imageDTO);
18+
19+
return (
20+
<MenuItem {...subMenu.parentMenuItemProps} icon={<PiArrowBendUpLeftBold />}>
21+
<Menu {...subMenu.menuProps}>
22+
<MenuButton {...subMenu.menuButtonProps}>
23+
<SubMenuButtonContent label={t('parameters.recallMetadata')} />
24+
</MenuButton>
25+
<MenuList {...subMenu.menuListProps}>
26+
<MenuItem icon={<PiQuotesBold />} onClick={recallPrompts.recall} isDisabled={!recallPrompts.isEnabled}>
27+
{t('parameters.usePrompt')}
28+
</MenuItem>
29+
<MenuItem icon={<PiPlantBold />} onClick={recallSeed.recall} isDisabled={!recallSeed.isEnabled}>
30+
{t('parameters.useSeed')}
31+
</MenuItem>
32+
</MenuList>
33+
</Menu>
34+
</MenuItem>
35+
);
36+
});
37+
38+
ImageMenuItemMetadataRecallActionsUpscaleTab.displayName = 'ImageMenuItemMetadataRecallActionsUpscaleTab';

invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ImageMenuItemCopy } from 'features/gallery/components/ImageContextMenu/
66
import { ImageMenuItemDelete } from 'features/gallery/components/ImageContextMenu/ImageMenuItemDelete';
77
import { ImageMenuItemDownload } from 'features/gallery/components/ImageContextMenu/ImageMenuItemDownload';
88
import { ImageMenuItemLoadWorkflow } from 'features/gallery/components/ImageContextMenu/ImageMenuItemLoadWorkflow';
9-
import { ImageMenuItemMetadataRecallActions } from 'features/gallery/components/ImageContextMenu/ImageMenuItemMetadataRecallActions';
9+
import { ImageMenuItemMetadataRecallActionsCanvasGenerateTabs } from 'features/gallery/components/ImageContextMenu/ImageMenuItemMetadataRecallActionsCanvasGenerateTabs';
1010
import { ImageMenuItemNewCanvasFromImageSubMenu } from 'features/gallery/components/ImageContextMenu/ImageMenuItemNewCanvasFromImageSubMenu';
1111
import { ImageMenuItemNewLayerFromImageSubMenu } from 'features/gallery/components/ImageContextMenu/ImageMenuItemNewLayerFromImageSubMenu';
1212
import { ImageMenuItemOpenInNewTab } from 'features/gallery/components/ImageContextMenu/ImageMenuItemOpenInNewTab';
@@ -21,6 +21,7 @@ import { selectActiveTab } from 'features/ui/store/uiSelectors';
2121
import { memo } from 'react';
2222
import type { ImageDTO } from 'services/api/types';
2323

24+
import { ImageMenuItemMetadataRecallActionsUpscaleTab } from './ImageMenuItemMetadataRecallActionsUpscaleTab';
2425
import { ImageMenuItemUseAsPromptTemplate } from './ImageMenuItemUseAsPromptTemplate';
2526

2627
type SingleSelectionMenuItemsProps = {
@@ -42,7 +43,8 @@ const SingleSelectionMenuItems = ({ imageDTO }: SingleSelectionMenuItemsProps) =
4243
</IconMenuItemGroup>
4344
<MenuDivider />
4445
<ImageMenuItemLoadWorkflow />
45-
{(tab === 'canvas' || tab === 'generate') && <ImageMenuItemMetadataRecallActions />}
46+
{(tab === 'canvas' || tab === 'generate') && <ImageMenuItemMetadataRecallActionsCanvasGenerateTabs />}
47+
{tab === 'upscaling' && <ImageMenuItemMetadataRecallActionsUpscaleTab />}
4648
<MenuDivider />
4749
<ImageMenuItemSendToUpscale />
4850
<ImageMenuItemUseForPromptGeneration />

invokeai/frontend/web/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const CurrentImageButtons = memo(({ imageDTO }: { imageDTO: ImageDTO }) =
3131
const { t } = useTranslation();
3232
const tab = useAppSelector(selectActiveTab);
3333
const isCanvasOrGenerateTab = tab === 'canvas' || tab === 'generate';
34+
const isCanvasOrGenerateOrUpscalingTab = tab === 'canvas' || tab === 'generate' || tab === 'upscaling';
3435

3536
const isUpscalingEnabled = useFeatureStatus('upscaling');
3637

@@ -94,7 +95,7 @@ export const CurrentImageButtons = memo(({ imageDTO }: { imageDTO: ImageDTO }) =
9495
onClick={recallRemix.recall}
9596
/>
9697
)}
97-
{isCanvasOrGenerateTab && (
98+
{isCanvasOrGenerateOrUpscalingTab && (
9899
<IconButton
99100
icon={<PiQuotesBold />}
100101
tooltip={`${t('parameters.usePrompt')} (P)`}
@@ -105,7 +106,7 @@ export const CurrentImageButtons = memo(({ imageDTO }: { imageDTO: ImageDTO }) =
105106
onClick={recallPrompts.recall}
106107
/>
107108
)}
108-
{isCanvasOrGenerateTab && (
109+
{isCanvasOrGenerateOrUpscalingTab && (
109110
<IconButton
110111
icon={<PiPlantBold />}
111112
tooltip={`${t('parameters.useSeed')} (S)`}

invokeai/frontend/web/src/features/gallery/hooks/useRecallPrompts.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import { useAppSelector, useAppStore } from 'app/store/storeHooks';
22
import { MetadataHandlers, MetadataUtils } from 'features/metadata/parsing';
33
import { selectActiveTab } from 'features/ui/store/uiSelectors';
4+
import type { TabName } from 'features/ui/store/uiTypes';
45
import { useCallback, useEffect, useMemo, useState } from 'react';
56
import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata';
67
import type { ImageDTO } from 'services/api/types';
78

89
import { useClearStylePresetWithToast } from './useClearStylePresetWithToast';
910

11+
const ALLOWED_TABS: TabName[] = ['canvas', 'generate', 'upscaling'];
12+
1013
export const useRecallPrompts = (imageDTO: ImageDTO) => {
1114
const store = useAppStore();
1215
const tab = useAppSelector(selectActiveTab);
@@ -43,7 +46,7 @@ export const useRecallPrompts = (imageDTO: ImageDTO) => {
4346
return false;
4447
}
4548

46-
if (tab !== 'canvas' && tab !== 'generate') {
49+
if (!ALLOWED_TABS.includes(tab)) {
4750
return false;
4851
}
4952

invokeai/frontend/web/src/features/gallery/hooks/useRecallSeed.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { useAppSelector, useAppStore } from 'app/store/storeHooks';
22
import { MetadataHandlers, MetadataUtils } from 'features/metadata/parsing';
33
import { selectActiveTab } from 'features/ui/store/uiSelectors';
4+
import type { TabName } from 'features/ui/store/uiTypes';
45
import { useCallback, useEffect, useMemo, useState } from 'react';
56
import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata';
67
import type { ImageDTO } from 'services/api/types';
78

9+
const ALLOWED_TABS: TabName[] = ['canvas', 'generate', 'upscaling'];
10+
811
export const useRecallSeed = (imageDTO: ImageDTO) => {
912
const store = useAppStore();
1013
const tab = useAppSelector(selectActiveTab);
@@ -30,7 +33,7 @@ export const useRecallSeed = (imageDTO: ImageDTO) => {
3033
return false;
3134
}
3235

33-
if (tab !== 'canvas' && tab !== 'generate') {
36+
if (!ALLOWED_TABS.includes(tab)) {
3437
return false;
3538
}
3639

0 commit comments

Comments
 (0)