Skip to content

Commit 61cf4d4

Browse files
feat: ✨ "Remix Image" option on images (#5553)
* feat: ✨ "Remix Image" option on images Adds a new "remix image" option where applicable, recalls all metadata except the seed * refactor: 🚨 lint code * feat: ✨ "Remix Image" option on images Adds a new "remix image" option where applicable, recalls all metadata except the seed * refactor: 🚨 lint code * feat: ✨ add new remix hotkey to hotkeys modal --------- Co-authored-by: psychedelicious <[email protected]>
1 parent 9d20a2d commit 61cf4d4

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,10 @@
600600
"desc": "Send current image to Image to Image",
601601
"title": "Send To Image To Image"
602602
},
603+
"remixImage": {
604+
"desc": "Use all parameters except seed from the current image",
605+
"title": "Remix image"
606+
},
603607
"setParameters": {
604608
"desc": "Use all parameters of the current image",
605609
"title": "Set Parameters"
@@ -1216,6 +1220,7 @@
12161220
"useCpuNoise": "Use CPU Noise",
12171221
"cpuNoise": "CPU Noise",
12181222
"gpuNoise": "GPU Noise",
1223+
"remixImage": "Remix Image",
12191224
"useInitImg": "Use Initial Image",
12201225
"usePrompt": "Use Prompt",
12211226
"useSeed": "Use Seed",

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { memo, useCallback } from 'react';
3232
import { useHotkeys } from 'react-hotkeys-hook';
3333
import { useTranslation } from 'react-i18next';
3434
import {
35+
PiArrowsCounterClockwiseBold,
3536
PiAsteriskBold,
3637
PiDotsThreeOutlineFill,
3738
PiFlowArrowBold,
@@ -129,6 +130,16 @@ const CurrentImageButtons = () => {
129130

130131
useHotkeys('p', handleUsePrompt, [metadata]);
131132

133+
const handleRemixImage = useCallback(() => {
134+
// Recalls all metadata parameters except seed
135+
recallAllParameters({
136+
...metadata,
137+
seed: undefined,
138+
});
139+
}, [metadata, recallAllParameters]);
140+
141+
useHotkeys('r', handleRemixImage, [metadata]);
142+
132143
const handleUseSize = useCallback(() => {
133144
recallWidthAndHeight(metadata?.width, metadata?.height);
134145
}, [metadata?.width, metadata?.height, recallWidthAndHeight]);
@@ -231,6 +242,14 @@ const CurrentImageButtons = () => {
231242
onClick={handleLoadWorkflow}
232243
isLoading={getAndLoadEmbeddedWorkflowResult.isLoading}
233244
/>
245+
<IconButton
246+
isLoading={isLoadingMetadata}
247+
icon={<PiArrowsCounterClockwiseBold />}
248+
tooltip={`${t('parameters.remixImage')} (R)`}
249+
aria-label={`${t('parameters.remixImage')} (R)`}
250+
isDisabled={!metadata?.positive_prompt}
251+
onClick={handleRemixImage}
252+
/>
234253
<IconButton
235254
isLoading={isLoadingMetadata}
236255
icon={<PiQuotesBold />}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { memo, useCallback } from 'react';
2424
import { flushSync } from 'react-dom';
2525
import { useTranslation } from 'react-i18next';
2626
import {
27+
PiArrowsCounterClockwiseBold,
2728
PiAsteriskBold,
2829
PiCopyBold,
2930
PiDownloadSimpleBold,
@@ -127,6 +128,14 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
127128
recallAllParameters(metadata);
128129
}, [metadata, recallAllParameters]);
129130

131+
const handleRemixImage = useCallback(() => {
132+
// Recalls all metadata parameters except seed
133+
recallAllParameters({
134+
...metadata,
135+
seed: undefined,
136+
});
137+
}, [metadata, recallAllParameters]);
138+
130139
const handleChangeBoard = useCallback(() => {
131140
dispatch(imagesToChangeSelected([imageDTO]));
132141
dispatch(isModalOpenChanged(true));
@@ -187,6 +196,19 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
187196
>
188197
{t('nodes.loadWorkflow')}
189198
</MenuItem>
199+
<MenuItem
200+
icon={
201+
isLoadingMetadata ? <SpinnerIcon /> : <PiArrowsCounterClockwiseBold />
202+
}
203+
onClickCapture={handleRemixImage}
204+
isDisabled={
205+
isLoadingMetadata ||
206+
(metadata?.positive_prompt === undefined &&
207+
metadata?.negative_prompt === undefined)
208+
}
209+
>
210+
{t('parameters.remixImage')}
211+
</MenuItem>
190212
<MenuItem
191213
icon={isLoadingMetadata ? <SpinnerIcon /> : <PiQuotesBold />}
192214
onClickCapture={handleRecallPrompt}

invokeai/frontend/web/src/features/system/components/HotkeysModal/useHotkeyData.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ export const useHotkeyData = (): HotkeyGroup[] => {
8181
() => ({
8282
title: t('hotkeys.generalHotkeys'),
8383
hotkeyListItems: [
84+
{
85+
title: t('hotkeys.remixImage.title'),
86+
desc: t('hotkeys.remixImage.desc'),
87+
hotkeys: [['R']],
88+
},
8489
{
8590
title: t('hotkeys.setPrompt.title'),
8691
desc: t('hotkeys.setPrompt.desc'),

0 commit comments

Comments
 (0)