|
| 1 | +import { Menu, MenuButton, MenuItem, MenuList } from '@invoke-ai/ui-library'; |
| 2 | +import { useAppDispatch } from 'app/store/storeHooks'; |
| 3 | +import { SubMenuButtonContent, useSubMenu } from 'common/hooks/useSubMenu'; |
| 4 | +import { NewLayerIcon } from 'features/controlLayers/components/common/icons'; |
| 5 | +import { |
| 6 | + useNewCanvasFromImage, |
| 7 | + useNewControlLayerFromImage, |
| 8 | + useNewInpaintMaskFromImage, |
| 9 | + useNewRasterLayerFromImage, |
| 10 | + useNewRegionalGuidanceFromImage, |
| 11 | +} from 'features/controlLayers/hooks/addLayerHooks'; |
| 12 | +import { useCanvasIsBusy } from 'features/controlLayers/hooks/useCanvasIsBusy'; |
| 13 | +import { useImageViewer } from 'features/gallery/components/ImageViewer/useImageViewer'; |
| 14 | +import { useImageDTOContext } from 'features/gallery/contexts/ImageDTOContext'; |
| 15 | +import { sentImageToCanvas } from 'features/gallery/store/actions'; |
| 16 | +import { toast } from 'features/toast/toast'; |
| 17 | +import { setActiveTab } from 'features/ui/store/uiSlice'; |
| 18 | +import { memo, useCallback } from 'react'; |
| 19 | +import { useTranslation } from 'react-i18next'; |
| 20 | +import { PiFileBold, PiPlusBold } from 'react-icons/pi'; |
| 21 | + |
| 22 | +export const ImageMenuItemNewFromImageSubMenu = memo(() => { |
| 23 | + const { t } = useTranslation(); |
| 24 | + const subMenu = useSubMenu(); |
| 25 | + const dispatch = useAppDispatch(); |
| 26 | + const imageDTO = useImageDTOContext(); |
| 27 | + const imageViewer = useImageViewer(); |
| 28 | + const isBusy = useCanvasIsBusy(); |
| 29 | + const newRasterLayerFromImage = useNewRasterLayerFromImage(); |
| 30 | + const newControlLayerFromImage = useNewControlLayerFromImage(); |
| 31 | + const newInpaintMaskFromImage = useNewInpaintMaskFromImage(); |
| 32 | + const newRegionalGuidanceFromImage = useNewRegionalGuidanceFromImage(); |
| 33 | + const newCanvasFromImage = useNewCanvasFromImage(); |
| 34 | + |
| 35 | + const onClickNewCanvasFromImage = useCallback(() => { |
| 36 | + newCanvasFromImage(imageDTO); |
| 37 | + dispatch(setActiveTab('canvas')); |
| 38 | + imageViewer.close(); |
| 39 | + toast({ |
| 40 | + id: 'SENT_TO_CANVAS', |
| 41 | + title: t('toast.sentToCanvas'), |
| 42 | + status: 'success', |
| 43 | + }); |
| 44 | + }, [dispatch, imageDTO, imageViewer, newCanvasFromImage, t]); |
| 45 | + |
| 46 | + const onClickNewRasterLayerFromImage = useCallback(() => { |
| 47 | + dispatch(sentImageToCanvas()); |
| 48 | + newRasterLayerFromImage(imageDTO); |
| 49 | + dispatch(setActiveTab('canvas')); |
| 50 | + imageViewer.close(); |
| 51 | + toast({ |
| 52 | + id: 'SENT_TO_CANVAS', |
| 53 | + title: t('toast.sentToCanvas'), |
| 54 | + status: 'success', |
| 55 | + }); |
| 56 | + }, [dispatch, imageDTO, imageViewer, newRasterLayerFromImage, t]); |
| 57 | + |
| 58 | + const onClickNewControlLayerFromImage = useCallback(() => { |
| 59 | + dispatch(sentImageToCanvas()); |
| 60 | + newControlLayerFromImage(imageDTO); |
| 61 | + dispatch(setActiveTab('canvas')); |
| 62 | + imageViewer.close(); |
| 63 | + toast({ |
| 64 | + id: 'SENT_TO_CANVAS', |
| 65 | + title: t('toast.sentToCanvas'), |
| 66 | + status: 'success', |
| 67 | + }); |
| 68 | + }, [dispatch, imageDTO, imageViewer, newControlLayerFromImage, t]); |
| 69 | + |
| 70 | + const onClickNewInpaintMaskFromImage = useCallback(() => { |
| 71 | + dispatch(sentImageToCanvas()); |
| 72 | + newInpaintMaskFromImage(imageDTO); |
| 73 | + dispatch(setActiveTab('canvas')); |
| 74 | + imageViewer.close(); |
| 75 | + toast({ |
| 76 | + id: 'SENT_TO_CANVAS', |
| 77 | + title: t('toast.sentToCanvas'), |
| 78 | + status: 'success', |
| 79 | + }); |
| 80 | + }, [dispatch, imageDTO, imageViewer, newInpaintMaskFromImage, t]); |
| 81 | + |
| 82 | + const onClickNewRegionalGuidanceFromImage = useCallback(() => { |
| 83 | + dispatch(sentImageToCanvas()); |
| 84 | + newRegionalGuidanceFromImage(imageDTO); |
| 85 | + dispatch(setActiveTab('canvas')); |
| 86 | + imageViewer.close(); |
| 87 | + toast({ |
| 88 | + id: 'SENT_TO_CANVAS', |
| 89 | + title: t('toast.sentToCanvas'), |
| 90 | + status: 'success', |
| 91 | + }); |
| 92 | + }, [dispatch, imageDTO, imageViewer, newRegionalGuidanceFromImage, t]); |
| 93 | + |
| 94 | + return ( |
| 95 | + <MenuItem {...subMenu.parentMenuItemProps} icon={<PiPlusBold />}> |
| 96 | + <Menu {...subMenu.menuProps}> |
| 97 | + <MenuButton {...subMenu.menuButtonProps}> |
| 98 | + <SubMenuButtonContent label="New from Image" /> |
| 99 | + </MenuButton> |
| 100 | + <MenuList {...subMenu.menuListProps}> |
| 101 | + <MenuItem icon={<PiFileBold />} onClickCapture={onClickNewCanvasFromImage} isDisabled={isBusy}> |
| 102 | + {t('controlLayers.canvas')} |
| 103 | + </MenuItem> |
| 104 | + <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewInpaintMaskFromImage} isDisabled={isBusy}> |
| 105 | + {t('controlLayers.inpaintMask')} |
| 106 | + </MenuItem> |
| 107 | + <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewRegionalGuidanceFromImage} isDisabled={isBusy}> |
| 108 | + {t('controlLayers.regionalGuidance')} |
| 109 | + </MenuItem> |
| 110 | + <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewControlLayerFromImage} isDisabled={isBusy}> |
| 111 | + {t('controlLayers.controlLayer')} |
| 112 | + </MenuItem> |
| 113 | + <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewRasterLayerFromImage} isDisabled={isBusy}> |
| 114 | + {t('controlLayers.rasterLayer')} |
| 115 | + </MenuItem> |
| 116 | + </MenuList> |
| 117 | + </Menu> |
| 118 | + </MenuItem> |
| 119 | + ); |
| 120 | +}); |
| 121 | + |
| 122 | +ImageMenuItemNewFromImageSubMenu.displayName = 'ImageMenuItemNewFromImageSubMenu'; |
0 commit comments