diff --git a/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersFloatingToolbar.tsx b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersFloatingToolbar.tsx new file mode 100644 index 00000000000..c0f4749a4fb --- /dev/null +++ b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersFloatingToolbar.tsx @@ -0,0 +1,78 @@ +import { ButtonGroup, Flex, IconButton, Tooltip } from '@invoke-ai/ui-library'; +import { + useAddControlLayer, + useAddInpaintMask, + useAddNewRegionalGuidanceWithARefImage, + useAddRasterLayer, + useAddRegionalGuidance, +} from 'features/controlLayers/hooks/addLayerHooks'; +import { useCanvasIsBusy } from 'features/controlLayers/hooks/useCanvasIsBusy'; +import { useIsEntityTypeEnabled } from 'features/controlLayers/hooks/useIsEntityTypeEnabled'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { PiEraserBold, PiPaintBrushBold, PiRectangleBold, PiShapesFill } from 'react-icons/pi'; + +export const CanvasLayersFloatingToolbar = memo(() => { + const { t } = useTranslation(); + const isBusy = useCanvasIsBusy(); + const addInpaintMask = useAddInpaintMask(); + const addRegionalGuidance = useAddRegionalGuidance(); + const _addRegionalReferenceImage = useAddNewRegionalGuidanceWithARefImage(); + const addRasterLayer = useAddRasterLayer(); + const addControlLayer = useAddControlLayer(); + const isRegionalGuidanceEnabled = useIsEntityTypeEnabled('regional_guidance'); + const isControlLayerEnabled = useIsEntityTypeEnabled('control_layer'); + const isInpaintLayerEnabled = useIsEntityTypeEnabled('inpaint_mask'); + + return ( + + + + } + onClick={addInpaintMask} + isDisabled={!isInpaintLayerEnabled || isBusy} + /> + + + } + onClick={addRegionalGuidance} + isDisabled={!isRegionalGuidanceEnabled || isBusy} + /> + + + } + onClick={addControlLayer} + isDisabled={!isControlLayerEnabled || isBusy} + /> + + + } + onClick={addRasterLayer} + isDisabled={isBusy} + /> + + + + ); +}); + +CanvasLayersFloatingToolbar.displayName = 'CanvasLayersFloatingToolbar'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx index 49ae65205b1..d89a0479ab5 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx @@ -3,6 +3,7 @@ import { useAppSelector } from 'app/store/storeHooks'; import { CanvasAddEntityButtons } from 'features/controlLayers/components/CanvasAddEntityButtons'; import { CanvasEntityList } from 'features/controlLayers/components/CanvasEntityList/CanvasEntityList'; import { EntityListSelectedEntityActionBar } from 'features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBar'; +import { CanvasLayersFloatingToolbar } from 'features/controlLayers/components/CanvasLayersFloatingToolbar'; import { CanvasManagerProviderGate } from 'features/controlLayers/contexts/CanvasManagerProviderGate'; import { selectHasEntities } from 'features/controlLayers/store/selectors'; import { memo } from 'react'; @@ -14,13 +15,14 @@ export const CanvasLayersPanel = memo(() => { return ( - + {!hasEntities && } {hasEntities && } + {hasEntities && } );