NEWONE1 / invokeai /frontend /web /src /features /gallery /components /ImageContextMenu /ImageMenuItemNewFromImageSubMenu.tsx
| import { Menu, MenuButton, MenuItem, MenuList } from '@invoke-ai/ui-library'; | |
| import { useAppStore } from 'app/store/nanostores/store'; | |
| import { useAppSelector } from 'app/store/storeHooks'; | |
| import { SubMenuButtonContent, useSubMenu } from 'common/hooks/useSubMenu'; | |
| import { NewLayerIcon } from 'features/controlLayers/components/common/icons'; | |
| import { useCanvasIsBusy } from 'features/controlLayers/hooks/useCanvasIsBusy'; | |
| import { selectIsFLUX, selectIsSD3 } from 'features/controlLayers/store/paramsSlice'; | |
| import { useImageViewer } from 'features/gallery/components/ImageViewer/useImageViewer'; | |
| import { useImageDTOContext } from 'features/gallery/contexts/ImageDTOContext'; | |
| import { sentImageToCanvas } from 'features/gallery/store/actions'; | |
| import { createNewCanvasEntityFromImage, newCanvasFromImage } from 'features/imageActions/actions'; | |
| import { toast } from 'features/toast/toast'; | |
| import { setActiveTab } from 'features/ui/store/uiSlice'; | |
| import { memo, useCallback } from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { PiFileBold, PiPlusBold } from 'react-icons/pi'; | |
| export const ImageMenuItemNewFromImageSubMenu = memo(() => { | |
| const { t } = useTranslation(); | |
| const subMenu = useSubMenu(); | |
| const store = useAppStore(); | |
| const imageDTO = useImageDTOContext(); | |
| const imageViewer = useImageViewer(); | |
| const isBusy = useCanvasIsBusy(); | |
| const isFLUX = useAppSelector(selectIsFLUX); | |
| const isSD3 = useAppSelector(selectIsSD3); | |
| const onClickNewCanvasWithRasterLayerFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| newCanvasFromImage({ imageDTO, type: 'raster_layer', dispatch, getState }); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| const onClickNewCanvasWithControlLayerFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| newCanvasFromImage({ imageDTO, type: 'control_layer', dispatch, getState }); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| const onClickNewRasterLayerFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| createNewCanvasEntityFromImage({ imageDTO, type: 'raster_layer', dispatch, getState }); | |
| dispatch(sentImageToCanvas()); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| const onClickNewControlLayerFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| createNewCanvasEntityFromImage({ imageDTO, type: 'control_layer', dispatch, getState }); | |
| dispatch(sentImageToCanvas()); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| const onClickNewInpaintMaskFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| createNewCanvasEntityFromImage({ imageDTO, type: 'inpaint_mask', dispatch, getState }); | |
| dispatch(sentImageToCanvas()); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| const onClickNewRegionalGuidanceFromImage = useCallback(() => { | |
| const { dispatch, getState } = store; | |
| createNewCanvasEntityFromImage({ imageDTO, type: 'regional_guidance', dispatch, getState }); | |
| dispatch(sentImageToCanvas()); | |
| dispatch(setActiveTab('canvas')); | |
| imageViewer.close(); | |
| toast({ | |
| id: 'SENT_TO_CANVAS', | |
| title: t('toast.sentToCanvas'), | |
| status: 'success', | |
| }); | |
| }, [imageDTO, imageViewer, store, t]); | |
| return ( | |
| <MenuItem {...subMenu.parentMenuItemProps} icon={<PiPlusBold />}> | |
| <Menu {...subMenu.menuProps}> | |
| <MenuButton {...subMenu.menuButtonProps}> | |
| <SubMenuButtonContent label={t('controlLayers.newFromImage')} /> | |
| </MenuButton> | |
| <MenuList {...subMenu.menuListProps}> | |
| <MenuItem icon={<PiFileBold />} onClickCapture={onClickNewCanvasWithRasterLayerFromImage} isDisabled={isBusy}> | |
| {t('controlLayers.canvasAsRasterLayer')} | |
| </MenuItem> | |
| <MenuItem | |
| icon={<PiFileBold />} | |
| onClickCapture={onClickNewCanvasWithControlLayerFromImage} | |
| isDisabled={isBusy || isSD3} | |
| > | |
| {t('controlLayers.canvasAsControlLayer')} | |
| </MenuItem> | |
| <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewInpaintMaskFromImage} isDisabled={isBusy}> | |
| {t('controlLayers.inpaintMask')} | |
| </MenuItem> | |
| <MenuItem | |
| icon={<NewLayerIcon />} | |
| onClickCapture={onClickNewRegionalGuidanceFromImage} | |
| isDisabled={isBusy || isFLUX || isSD3} | |
| > | |
| {t('controlLayers.regionalGuidance')} | |
| </MenuItem> | |
| <MenuItem | |
| icon={<NewLayerIcon />} | |
| onClickCapture={onClickNewControlLayerFromImage} | |
| isDisabled={isBusy || isSD3} | |
| > | |
| {t('controlLayers.controlLayer')} | |
| </MenuItem> | |
| <MenuItem icon={<NewLayerIcon />} onClickCapture={onClickNewRasterLayerFromImage} isDisabled={isBusy}> | |
| {t('controlLayers.rasterLayer')} | |
| </MenuItem> | |
| </MenuList> | |
| </Menu> | |
| </MenuItem> | |
| ); | |
| }); | |
| ImageMenuItemNewFromImageSubMenu.displayName = 'ImageMenuItemNewFromImageSubMenu'; | |