NEWONE1 / invokeai /frontend /web /src /features /gallery /components /ImageViewer /CurrentImageButtons.tsx
| import { Divider, IconButton, Menu, MenuButton, MenuList } from '@invoke-ai/ui-library'; | |
| import { useStore } from '@nanostores/react'; | |
| import { skipToken } from '@reduxjs/toolkit/query'; | |
| import { useAppSelector } from 'app/store/storeHooks'; | |
| import { selectIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice'; | |
| import { DeleteImageButton } from 'features/deleteImageModal/components/DeleteImageButton'; | |
| import SingleSelectionMenuItems from 'features/gallery/components/ImageContextMenu/SingleSelectionMenuItems'; | |
| import { useImageActions } from 'features/gallery/hooks/useImageActions'; | |
| import { selectLastSelectedImage } from 'features/gallery/store/gallerySelectors'; | |
| import { $hasTemplates } from 'features/nodes/store/nodesSlice'; | |
| import { PostProcessingPopover } from 'features/parameters/components/PostProcessing/PostProcessingPopover'; | |
| import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; | |
| import { memo } from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { | |
| PiArrowsCounterClockwiseBold, | |
| PiAsteriskBold, | |
| PiDotsThreeOutlineFill, | |
| PiFlowArrowBold, | |
| PiPlantBold, | |
| PiQuotesBold, | |
| PiRulerBold, | |
| } from 'react-icons/pi'; | |
| import { useGetImageDTOQuery } from 'services/api/endpoints/images'; | |
| import type { ImageDTO } from 'services/api/types'; | |
| const CurrentImageButtons = () => { | |
| const lastSelectedImage = useAppSelector(selectLastSelectedImage); | |
| const { currentData: imageDTO } = useGetImageDTOQuery(lastSelectedImage?.image_name ?? skipToken); | |
| if (!imageDTO) { | |
| return null; | |
| } | |
| return <CurrentImageButtonsContent imageDTO={imageDTO} />; | |
| }; | |
| export default memo(CurrentImageButtons); | |
| const CurrentImageButtonsContent = memo(({ imageDTO }: { imageDTO: ImageDTO }) => { | |
| const { t } = useTranslation(); | |
| const hasTemplates = useStore($hasTemplates); | |
| const imageActions = useImageActions(imageDTO); | |
| const isStaging = useAppSelector(selectIsStaging); | |
| const isUpscalingEnabled = useFeatureStatus('upscaling'); | |
| return ( | |
| <> | |
| <Menu isLazy> | |
| <MenuButton | |
| as={IconButton} | |
| aria-label={t('parameters.imageActions')} | |
| tooltip={t('parameters.imageActions')} | |
| isDisabled={!imageDTO} | |
| variant="link" | |
| alignSelf="stretch" | |
| icon={<PiDotsThreeOutlineFill />} | |
| /> | |
| <MenuList>{imageDTO && <SingleSelectionMenuItems imageDTO={imageDTO} />}</MenuList> | |
| </Menu> | |
| <Divider orientation="vertical" h={8} mx={2} /> | |
| <IconButton | |
| icon={<PiFlowArrowBold />} | |
| tooltip={`${t('nodes.loadWorkflow')} (W)`} | |
| aria-label={`${t('nodes.loadWorkflow')} (W)`} | |
| isDisabled={!imageActions.hasWorkflow || !hasTemplates} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.loadWorkflow} | |
| /> | |
| <IconButton | |
| icon={<PiArrowsCounterClockwiseBold />} | |
| tooltip={`${t('parameters.remixImage')} (R)`} | |
| aria-label={`${t('parameters.remixImage')} (R)`} | |
| isDisabled={!imageActions.hasMetadata} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.remix} | |
| /> | |
| <IconButton | |
| icon={<PiQuotesBold />} | |
| tooltip={`${t('parameters.usePrompt')} (P)`} | |
| aria-label={`${t('parameters.usePrompt')} (P)`} | |
| isDisabled={!imageActions.hasPrompts} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.recallPrompts} | |
| /> | |
| <IconButton | |
| icon={<PiPlantBold />} | |
| tooltip={`${t('parameters.useSeed')} (S)`} | |
| aria-label={`${t('parameters.useSeed')} (S)`} | |
| isDisabled={!imageActions.hasSeed} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.recallSeed} | |
| /> | |
| <IconButton | |
| icon={<PiRulerBold />} | |
| tooltip={`${t('parameters.useSize')} (D)`} | |
| aria-label={`${t('parameters.useSize')} (D)`} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.recallSize} | |
| isDisabled={isStaging} | |
| /> | |
| <IconButton | |
| icon={<PiAsteriskBold />} | |
| tooltip={`${t('parameters.useAll')} (A)`} | |
| aria-label={`${t('parameters.useAll')} (A)`} | |
| isDisabled={!imageActions.hasMetadata} | |
| variant="link" | |
| alignSelf="stretch" | |
| onClick={imageActions.recallAll} | |
| /> | |
| {isUpscalingEnabled && <PostProcessingPopover imageDTO={imageDTO} />} | |
| <Divider orientation="vertical" h={8} mx={2} /> | |
| <DeleteImageButton onClick={imageActions.delete} /> | |
| </> | |
| ); | |
| }); | |
| CurrentImageButtonsContent.displayName = 'CurrentImageButtonsContent'; | |