From fd7fa6f4ab1096b4e6d5c0e779b3a32945445dcc Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:36:58 +1000 Subject: [PATCH] feat(ui): rework isolated previewing Previously the setting was `showOnlyRasterLayersWhileStaging`. This has been renamed to `isolatedStagingPreview`. Works the same. Also added `isolatedFilteringPreview` an `isolatedTransformingPreview`. These work the same way, but they isolate the current selected layer. There are toggles in the canvas settings popover _and_ the filter/transform popups (same setting). --- invokeai/frontend/web/public/locales/en.json | 5 ++- .../components/Filters/Filter.tsx | 12 +++++- ...SettingsIsolatedFilteringPreviewSwitch.tsx | 28 +++++++++++++ ...asSettingsIsolatedStagingPreviewSwitch.tsx | 28 +++++++++++++ ...tingsIsolatedTransformingPreviewSwitch.tsx | 28 +++++++++++++ .../Settings/CanvasSettingsPopover.tsx | 8 +++- ...ShowOnlyRasterLayersWhileStagingSwitch.tsx | 29 -------------- .../components/Transform/Transform.tsx | 27 ++++++++++--- .../CanvasEntity/CanvasEntityAdapterBase.ts | 40 ++++++++++++++++--- .../store/canvasSettingsSlice.ts | 36 +++++++++++++---- .../features/controlLayers/store/selectors.ts | 8 ++-- 11 files changed, 195 insertions(+), 54 deletions(-) create mode 100644 invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedFilteringPreviewSwitch.tsx create mode 100644 invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx create mode 100644 invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedTransformingPreviewSwitch.tsx delete mode 100644 invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch.tsx diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 2af47b5408..031c71aa8f 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1960,7 +1960,10 @@ "label": "Preserve Masked Region", "alert": "Preserving Masked Region" }, - "showOnlyRasterLayersWhileStaging": "Show Only Raster Layers While Staging" + "isolatedPreview": "Isolated Preview", + "isolatedStagingPreview": "Isolated Staging Preview", + "isolatedFilteringPreview": "Isolated Filtering Preview", + "isolatedTransformingPreview": "Isolated Transforming Preview" }, "HUD": { "bbox": "Bbox", diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx index 5bc449fac6..18d50f8f99 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx @@ -8,7 +8,9 @@ import type { CanvasEntityAdapterControlLayer } from 'features/controlLayers/kon import type { CanvasEntityAdapterRasterLayer } from 'features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer'; import { selectAutoProcessFilter, + selectIsolatedFilteringPreview, settingsAutoProcessFilterToggled, + settingsIsolatedFilteringPreviewToggled, } from 'features/controlLayers/store/canvasSettingsSlice'; import type { FilterConfig } from 'features/controlLayers/store/filters'; import { IMAGE_FILTERS } from 'features/controlLayers/store/filters'; @@ -23,6 +25,10 @@ const FilterBox = memo(({ adapter }: { adapter: CanvasEntityAdapterRasterLayer | const isProcessing = useStore(adapter.filterer.$isProcessing); const hasProcessed = useStore(adapter.filterer.$hasProcessed); const autoProcessFilter = useAppSelector(selectAutoProcessFilter); + const isolatedFilteringPreview = useAppSelector(selectIsolatedFilteringPreview); + const onChangeIsolatedPreview = useCallback(() => { + dispatch(settingsIsolatedFilteringPreviewToggled()); + }, [dispatch]); const onChangeFilterConfig = useCallback( (filterConfig: FilterConfig) => { @@ -59,7 +65,7 @@ const FilterBox = memo(({ adapter }: { adapter: CanvasEntityAdapterRasterLayer | transitionProperty="height" transitionDuration="normal" > - + {t('controlLayers.filter.filter')} @@ -68,6 +74,10 @@ const FilterBox = memo(({ adapter }: { adapter: CanvasEntityAdapterRasterLayer | {t('controlLayers.filter.autoProcess')} + + {t('controlLayers.settings.isolatedPreview')} + + diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedFilteringPreviewSwitch.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedFilteringPreviewSwitch.tsx new file mode 100644 index 0000000000..9a469ce7dc --- /dev/null +++ b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedFilteringPreviewSwitch.tsx @@ -0,0 +1,28 @@ +import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { + selectIsolatedFilteringPreview, + settingsIsolatedFilteringPreviewToggled, +} from 'features/controlLayers/store/canvasSettingsSlice'; +import { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +export const CanvasSettingsIsolatedFilteringPreviewSwitch = memo(() => { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const isolatedFilteringPreview = useAppSelector(selectIsolatedFilteringPreview); + const onChange = useCallback(() => { + dispatch(settingsIsolatedFilteringPreviewToggled()); + }, [dispatch]); + + return ( + + + {t('controlLayers.settings.isolatedFilteringPreview')} + + + + ); +}); + +CanvasSettingsIsolatedFilteringPreviewSwitch.displayName = 'CanvasSettingsIsolatedFilteringPreviewSwitch'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx new file mode 100644 index 0000000000..cb8a759b81 --- /dev/null +++ b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx @@ -0,0 +1,28 @@ +import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { + selectIsolatedStagingPreview, + settingsIsolatedStagingPreviewToggled, +} from 'features/controlLayers/store/canvasSettingsSlice'; +import { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +export const CanvasSettingsIsolatedStagingPreviewSwitch = memo(() => { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const isolatedStagingPreview = useAppSelector(selectIsolatedStagingPreview); + const onChange = useCallback(() => { + dispatch(settingsIsolatedStagingPreviewToggled()); + }, [dispatch]); + + return ( + + + {t('controlLayers.settings.isolatedStagingPreview')} + + + + ); +}); + +CanvasSettingsIsolatedStagingPreviewSwitch.displayName = 'CanvasSettingsIsolatedStagingPreviewSwitch'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedTransformingPreviewSwitch.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedTransformingPreviewSwitch.tsx new file mode 100644 index 0000000000..24026c0a6d --- /dev/null +++ b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedTransformingPreviewSwitch.tsx @@ -0,0 +1,28 @@ +import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { + selectIsolatedTransformingPreview, + settingsIsolatedTransformingPreviewToggled, +} from 'features/controlLayers/store/canvasSettingsSlice'; +import { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +export const CanvasSettingsIsolatedTransformingPreviewSwitch = memo(() => { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const isolatedTransformingPreview = useAppSelector(selectIsolatedTransformingPreview); + const onChange = useCallback(() => { + dispatch(settingsIsolatedTransformingPreviewToggled()); + }, [dispatch]); + + return ( + + + {t('controlLayers.settings.isolatedTransformingPreview')} + + + + ); +}); + +CanvasSettingsIsolatedTransformingPreviewSwitch.displayName = 'CanvasSettingsIsolatedTransformingPreviewSwitch'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx index 2ddf731929..a5b9aa96a6 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx @@ -16,12 +16,14 @@ import { CanvasSettingsClipToBboxCheckbox } from 'features/controlLayers/compone import { CanvasSettingsDynamicGridSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsDynamicGridSwitch'; import { CanvasSettingsSnapToGridCheckbox } from 'features/controlLayers/components/Settings/CanvasSettingsGridSize'; import { CanvasSettingsInvertScrollCheckbox } from 'features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox'; +import { CanvasSettingsIsolatedFilteringPreviewSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsIsolatedFilteringPreviewSwitch'; +import { CanvasSettingsIsolatedStagingPreviewSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch'; +import { CanvasSettingsIsolatedTransformingPreviewSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsIsolatedTransformingPreviewSwitch'; import { CanvasSettingsLogDebugInfoButton } from 'features/controlLayers/components/Settings/CanvasSettingsLogDebugInfo'; import { CanvasSettingsOutputOnlyMaskedRegionsCheckbox } from 'features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox'; import { CanvasSettingsPreserveMaskCheckbox } from 'features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox'; import { CanvasSettingsRecalculateRectsButton } from 'features/controlLayers/components/Settings/CanvasSettingsRecalculateRectsButton'; import { CanvasSettingsShowHUDSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsShowHUDSwitch'; -import { CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch } from 'features/controlLayers/components/Settings/CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch'; import { CanvasSettingsShowProgressOnCanvas } from 'features/controlLayers/components/Settings/CanvasSettingsShowProgressOnCanvasSwitch'; import { memo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -49,7 +51,9 @@ export const CanvasSettingsPopover = memo(() => { - + + + diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch.tsx deleted file mode 100644 index de6dfefaba..0000000000 --- a/invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { - selectShowOnlyRasterLayersWhileStaging, - settingsShowOnlyRasterLayersWhileStagingToggled, -} from 'features/controlLayers/store/canvasSettingsSlice'; -import { memo, useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; - -export const CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch = memo(() => { - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - const showOnlyRasterLayersWhileStaging = useAppSelector(selectShowOnlyRasterLayersWhileStaging); - const onChange = useCallback(() => { - dispatch(settingsShowOnlyRasterLayersWhileStagingToggled()); - }, [dispatch]); - - return ( - - - {t('controlLayers.settings.showOnlyRasterLayersWhileStaging')} - - - - ); -}); - -CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch.displayName = - 'CanvasSettingsShowOnlyRasterLayersWhileStagingSwitch'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx index 476086c38b..65021635ee 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx @@ -1,14 +1,24 @@ -import { Button, ButtonGroup, Flex, Heading, Spacer } from '@invoke-ai/ui-library'; +import { Button, ButtonGroup, Flex, FormControl, FormLabel, Heading, Spacer, Switch } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate'; import type { CanvasEntityAdapter } from 'features/controlLayers/konva/CanvasEntity/types'; -import { memo } from 'react'; +import { + selectIsolatedTransformingPreview, + settingsIsolatedTransformingPreviewToggled, +} from 'features/controlLayers/store/canvasSettingsSlice'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { PiArrowsCounterClockwiseBold, PiArrowsOutBold, PiCheckBold, PiXBold } from 'react-icons/pi'; const TransformBox = memo(({ adapter }: { adapter: CanvasEntityAdapter }) => { const { t } = useTranslation(); + const dispatch = useAppDispatch(); const isProcessing = useStore(adapter.transformer.$isProcessing); + const isolatedTransformingPreview = useAppSelector(selectIsolatedTransformingPreview); + const onChangeIsolatedPreview = useCallback(() => { + dispatch(settingsIsolatedTransformingPreviewToggled()); + }, [dispatch]); return ( { transitionProperty="height" transitionDuration="normal" > - - {t('controlLayers.transform.transform')} - + + + {t('controlLayers.transform.transform')} + + + + {t('controlLayers.settings.isolatedPreview')} + + +