diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 037017cdb9..c8c5699931 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1025,10 +1025,11 @@ "fluxModelIncompatibleBboxHeight": "$t(parameters.invoke.fluxRequiresDimensionsToBeMultipleOf16), bbox height is {{height}}", "fluxModelIncompatibleScaledBboxWidth": "$t(parameters.invoke.fluxRequiresDimensionsToBeMultipleOf16), scaled bbox width is {{width}}", "fluxModelIncompatibleScaledBboxHeight": "$t(parameters.invoke.fluxRequiresDimensionsToBeMultipleOf16), scaled bbox height is {{height}}", - "canvasIsFiltering": "Canvas is filtering", - "canvasIsTransforming": "Canvas is transforming", - "canvasIsRasterizing": "Canvas is rasterizing", - "canvasIsCompositing": "Canvas is compositing", + "canvasIsFiltering": "Canvas is busy (filtering)", + "canvasIsTransforming": "Canvas is busy (transforming)", + "canvasIsRasterizing": "Canvas is busy (rasterizing)", + "canvasIsCompositing": "Canvas is busy (compositing)", + "canvasIsSelectingObject": "Canvas is busy (selecting object)", "noPrompts": "No prompts generated", "noNodesInGraph": "No nodes in graph", "systemDisconnected": "System disconnected", diff --git a/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts b/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts index 3e70778aaa..a6b8cc671d 100644 --- a/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts +++ b/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts @@ -30,15 +30,25 @@ const LAYER_TYPE_TO_TKEY = { control_layer: 'controlLayers.controlLayer', } as const; -const createSelector = ( - templates: Templates, - isConnected: boolean, - canvasIsFiltering: boolean, - canvasIsTransforming: boolean, - canvasIsRasterizing: boolean, - canvasIsCompositing: boolean -) => - createMemoizedSelector( +const createSelector = (arg: { + templates: Templates; + isConnected: boolean; + canvasIsFiltering: boolean; + canvasIsTransforming: boolean; + canvasIsRasterizing: boolean; + canvasIsCompositing: boolean; + canvasIsSelectingObject: boolean; +}) => { + const { + templates, + isConnected, + canvasIsFiltering, + canvasIsTransforming, + canvasIsRasterizing, + canvasIsCompositing, + canvasIsSelectingObject, + } = arg; + return createMemoizedSelector( [ selectSystemSlice, selectNodesSlice, @@ -147,6 +157,9 @@ const createSelector = ( if (canvasIsCompositing) { reasons.push({ content: i18n.t('parameters.invoke.canvasIsCompositing') }); } + if (canvasIsSelectingObject) { + reasons.push({ content: i18n.t('parameters.invoke.canvasIsSelectingObject') }); + } if (dynamicPrompts.prompts.length === 0 && getShouldProcessPrompt(positivePrompt)) { reasons.push({ content: i18n.t('parameters.invoke.noPrompts') }); @@ -305,6 +318,7 @@ const createSelector = ( return { isReady: !reasons.length, reasons }; } ); +}; export const useIsReadyToEnqueue = () => { const templates = useStore($templates); @@ -313,18 +327,28 @@ export const useIsReadyToEnqueue = () => { const canvasIsFiltering = useStore(canvasManager?.stateApi.$isFiltering ?? $true); const canvasIsTransforming = useStore(canvasManager?.stateApi.$isTransforming ?? $true); const canvasIsRasterizing = useStore(canvasManager?.stateApi.$isRasterizing ?? $true); + const canvasIsSelectingObject = useStore(canvasManager?.stateApi.$isSegmenting ?? $true); const canvasIsCompositing = useStore(canvasManager?.compositor.$isBusy ?? $true); const selector = useMemo( () => - createSelector( + createSelector({ templates, isConnected, canvasIsFiltering, canvasIsTransforming, canvasIsRasterizing, - canvasIsCompositing - ), - [templates, isConnected, canvasIsFiltering, canvasIsTransforming, canvasIsRasterizing, canvasIsCompositing] + canvasIsCompositing, + canvasIsSelectingObject, + }), + [ + templates, + isConnected, + canvasIsFiltering, + canvasIsTransforming, + canvasIsRasterizing, + canvasIsCompositing, + canvasIsSelectingObject, + ] ); const value = useAppSelector(selector); return value;