import { Button, ButtonGroup, Flex, Heading, Icon, ListItem, Menu, MenuButton, MenuItem, MenuList, Spacer, Spinner, Text, Tooltip, UnorderedList, } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; import { useAppSelector } from 'app/store/storeHooks'; import { useFocusRegion, useIsRegionFocused } from 'common/hooks/focus'; import { CanvasAutoProcessSwitch } from 'features/controlLayers/components/CanvasAutoProcessSwitch'; import { CanvasOperationIsolatedLayerPreviewSwitch } from 'features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch'; import { SelectObjectInvert } from 'features/controlLayers/components/SelectObject/SelectObjectInvert'; import { SelectObjectPointType } from 'features/controlLayers/components/SelectObject/SelectObjectPointType'; import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate'; import type { CanvasEntityAdapterControlLayer } from 'features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer'; import type { CanvasEntityAdapterRasterLayer } from 'features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer'; import { selectAutoProcess } from 'features/controlLayers/store/canvasSettingsSlice'; import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData'; import type { PropsWithChildren } from 'react'; import { memo, useCallback, useRef } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { PiCaretDownBold, PiInfoBold } from 'react-icons/pi'; const SelectObjectContent = memo( ({ adapter }: { adapter: CanvasEntityAdapterRasterLayer | CanvasEntityAdapterControlLayer }) => { const { t } = useTranslation(); const ref = useRef(null); useFocusRegion('canvas', ref, { focusOnMount: true }); const isCanvasFocused = useIsRegionFocused('canvas'); const isProcessing = useStore(adapter.segmentAnything.$isProcessing); const hasPoints = useStore(adapter.segmentAnything.$hasPoints); const hasImageState = useStore(adapter.segmentAnything.$hasImageState); const autoProcess = useAppSelector(selectAutoProcess); const saveAsInpaintMask = useCallback(() => { adapter.segmentAnything.saveAs('inpaint_mask'); }, [adapter.segmentAnything]); const saveAsRegionalGuidance = useCallback(() => { adapter.segmentAnything.saveAs('regional_guidance'); }, [adapter.segmentAnything]); const saveAsRasterLayer = useCallback(() => { adapter.segmentAnything.saveAs('raster_layer'); }, [adapter.segmentAnything]); const saveAsControlLayer = useCallback(() => { adapter.segmentAnything.saveAs('control_layer'); }, [adapter.segmentAnything]); useRegisteredHotkeys({ id: 'applySegmentAnything', category: 'canvas', callback: adapter.segmentAnything.apply, options: { enabled: !isProcessing && isCanvasFocused }, dependencies: [adapter.segmentAnything, isProcessing, isCanvasFocused], }); useRegisteredHotkeys({ id: 'cancelSegmentAnything', category: 'canvas', callback: adapter.segmentAnything.cancel, options: { enabled: !isProcessing && isCanvasFocused }, dependencies: [adapter.segmentAnything, isProcessing, isCanvasFocused], }); return ( {t('controlLayers.selectObject.selectObject')} }> } > {t('controlLayers.selectObject.saveAs')} {t('controlLayers.newInpaintMask')} {t('controlLayers.newRegionalGuidance')} {t('controlLayers.newControlLayer')} {t('controlLayers.newRasterLayer')} ); } ); SelectObjectContent.displayName = 'SegmentAnythingContent'; export const SelectObject = memo(() => { const canvasManager = useCanvasManager(); const adapter = useStore(canvasManager.stateApi.$segmentingAdapter); if (!adapter) { return null; } return ; }); SelectObject.displayName = 'SelectObject'; const Bold = (props: PropsWithChildren) => ( {props.children} ); const SelectObjectHelpTooltipContent = memo(() => { const { t } = useTranslation(); return ( }} /> }} /> {t('controlLayers.selectObject.clickToAdd')} {t('controlLayers.selectObject.dragToMove')} {t('controlLayers.selectObject.clickToRemove')} ); }); SelectObjectHelpTooltipContent.displayName = 'SelectObjectHelpTooltipContent';