Skip to content

Commit 34db96a

Browse files
author
Attila Cseh
committed
canvas slice refactored to support tabbed canvases
1 parent 3707c3b commit 34db96a

File tree

55 files changed

+693
-452
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+693
-452
lines changed

invokeai/frontend/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"@invoke-ai/ui-library": "^0.0.47",
4949
"@nanostores/react": "^1.0.0",
5050
"@observ33r/object-equals": "^1.1.5",
51-
"@reduxjs/toolkit": "2.8.2",
51+
"@reduxjs/toolkit": "2.9.0",
5252
"@roarr/browser-log-writer": "^1.3.0",
5353
"@xyflow/react": "^12.8.2",
5454
"ag-psd": "^28.2.2",

invokeai/frontend/web/pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { AppStartListening } from 'app/store/store';
22
import { selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlice';
3-
import { selectCanvasSlice } from 'features/controlLayers/store/selectors';
3+
import { selectSelectedCanvas } from 'features/controlLayers/store/selectors';
44
import { getImageUsage } from 'features/deleteImageModal/store/state';
55
import { nodeEditorReset } from 'features/nodes/store/nodesSlice';
66
import { selectNodesSlice } from 'features/nodes/store/selectors';
@@ -19,7 +19,7 @@ export const addDeleteBoardAndImagesFulfilledListener = (startAppListening: AppS
1919

2020
const state = getState();
2121
const nodes = selectNodesSlice(state);
22-
const canvas = selectCanvasSlice(state);
22+
const canvas = selectSelectedCanvas(state);
2323
const upscale = selectUpscaleSlice(state);
2424
const refImages = selectRefImagesSlice(state);
2525

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { refImageModelChanged, selectReferenceImageEntities } from 'features/con
88
import {
99
selectAllEntitiesOfType,
1010
selectBboxModelBase,
11-
selectCanvasSlice,
11+
selectSelectedCanvas,
1212
} from 'features/controlLayers/store/selectors';
1313
import { getEntityIdentifier } from 'features/controlLayers/store/types';
1414
import { modelSelected } from 'features/parameters/store/actions';
@@ -118,7 +118,7 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) =
118118
const newRegionalRefImageModel = selectRegionalRefImageModels(state)[0] ?? null;
119119

120120
// All regional guidance entities are updated to use the same new model.
121-
const canvasState = selectCanvasSlice(state);
121+
const canvasState = selectSelectedCanvas(state);
122122
const canvasRegionalGuidanceEntities = selectAllEntitiesOfType(canvasState, 'regional_guidance');
123123
for (const entity of canvasRegionalGuidanceEntities) {
124124
for (const refImage of entity.referenceImages) {

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
vaeSelected,
1212
} from 'features/controlLayers/store/paramsSlice';
1313
import { refImageModelChanged, selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlice';
14-
import { selectCanvasSlice } from 'features/controlLayers/store/selectors';
14+
import { selectSelectedCanvas } from 'features/controlLayers/store/selectors';
1515
import {
1616
getEntityIdentifier,
1717
isFLUXReduxConfig,
@@ -221,7 +221,7 @@ const handleVideoModels: ModelHandler = (models, state, dispatch, log) => {
221221

222222
const handleControlAdapterModels: ModelHandler = (models, state, dispatch, log) => {
223223
const caModels = models.filter(isControlLayerModelConfig);
224-
selectCanvasSlice(state).controlLayers.entities.forEach((entity) => {
224+
selectSelectedCanvas(state).controlLayers.entities.forEach((entity) => {
225225
const selectedControlAdapterModel = entity.controlAdapter.model;
226226
// `null` is a valid control adapter model - no need to do anything.
227227
if (!selectedControlAdapterModel) {
@@ -256,7 +256,7 @@ const handleIPAdapterModels: ModelHandler = (models, state, dispatch, log) => {
256256
dispatch(refImageModelChanged({ id: entity.id, modelConfig: null }));
257257
});
258258

259-
selectCanvasSlice(state).regionalGuidance.entities.forEach((entity) => {
259+
selectSelectedCanvas(state).regionalGuidance.entities.forEach((entity) => {
260260
entity.referenceImages.forEach(({ id: referenceImageId, config }) => {
261261
if (!isRegionalGuidanceIPAdapterConfig(config)) {
262262
return;
@@ -299,7 +299,7 @@ const handleFLUXReduxModels: ModelHandler = (models, state, dispatch, log) => {
299299
dispatch(refImageModelChanged({ id: entity.id, modelConfig: null }));
300300
});
301301

302-
selectCanvasSlice(state).regionalGuidance.entities.forEach((entity) => {
302+
selectSelectedCanvas(state).regionalGuidance.entities.forEach((entity) => {
303303
entity.referenceImages.forEach(({ id: referenceImageId, config }) => {
304304
if (!isRegionalGuidanceFLUXReduxConfig(config)) {
305305
return;

invokeai/frontend/web/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import { useEntityTitle } from 'features/controlLayers/hooks/useEntityTitle';
99
import { useEntityTypeIsHidden } from 'features/controlLayers/hooks/useEntityTypeIsHidden';
1010
import type { CanvasEntityAdapter } from 'features/controlLayers/konva/CanvasEntity/types';
1111
import {
12-
selectCanvasSlice,
1312
selectEntityOrThrow,
13+
selectSelectedCanvas,
1414
selectSelectedEntityIdentifier,
1515
} from 'features/controlLayers/store/selectors';
1616
import type { CanvasEntityIdentifier } from 'features/controlLayers/store/types';
@@ -32,13 +32,13 @@ type AlertData = {
3232

3333
const buildSelectIsEnabled = (entityIdentifier: CanvasEntityIdentifier) =>
3434
createSelector(
35-
selectCanvasSlice,
35+
selectSelectedCanvas,
3636
(canvas) => selectEntityOrThrow(canvas, entityIdentifier, 'CanvasAlertsSelectedEntityStatusContent').isEnabled
3737
);
3838

3939
const buildSelectIsLocked = (entityIdentifier: CanvasEntityIdentifier) =>
4040
createSelector(
41-
selectCanvasSlice,
41+
selectSelectedCanvas,
4242
(canvas) => selectEntityOrThrow(canvas, entityIdentifier, 'CanvasAlertsSelectedEntityStatusContent').isLocked
4343
);
4444

invokeai/frontend/web/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import { clamp, round } from 'es-toolkit/compat';
2020
import { snapToNearest } from 'features/controlLayers/konva/util';
2121
import { entityOpacityChanged } from 'features/controlLayers/store/canvasSlice';
2222
import {
23-
selectCanvasSlice,
2423
selectEntity,
24+
selectSelectedCanvas,
2525
selectSelectedEntityIdentifier,
2626
} from 'features/controlLayers/store/selectors';
2727
import type { KeyboardEvent } from 'react';
@@ -61,7 +61,7 @@ const sliderDefaultValue = mapRawValueToSliderValue(1);
6161

6262
const snapCandidates = marks.slice(1, marks.length - 1);
6363

64-
const selectOpacity = createSelector(selectCanvasSlice, (canvas) => {
64+
const selectOpacity = createSelector(selectSelectedCanvas, (canvas) => {
6565
const selectedEntityIdentifier = canvas.selectedEntityIdentifier;
6666
if (!selectedEntityIdentifier) {
6767
return 1; // fallback to 100% opacity

invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { createSelector } from '@reduxjs/toolkit';
33
import { useAppSelector } from 'app/store/storeHooks';
44
import { CanvasEntityStateGate } from 'features/controlLayers/contexts/CanvasEntityStateGate';
55
import { useEntityIdentifierContext } from 'features/controlLayers/contexts/EntityIdentifierContext';
6-
import { selectCanvasSlice, selectEntityOrThrow } from 'features/controlLayers/store/selectors';
6+
import { selectEntityOrThrow, selectSelectedCanvas } from 'features/controlLayers/store/selectors';
77
import type { CanvasEntityIdentifier } from 'features/controlLayers/store/types';
88
import { memo, useMemo } from 'react';
99
import { useTranslation } from 'react-i18next';
1010

1111
const buildSelectWithTransparencyEffect = (entityIdentifier: CanvasEntityIdentifier<'control_layer'>) =>
1212
createSelector(
13-
selectCanvasSlice,
13+
selectSelectedCanvas,
1414
(canvas) => selectEntityOrThrow(canvas, entityIdentifier, 'ControlLayerBadgesContent').withTransparencyEffect
1515
);
1616

invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
} from 'features/controlLayers/store/canvasSlice';
2020
import { getFilterForModel } from 'features/controlLayers/store/filters';
2121
import { selectIsFLUX } from 'features/controlLayers/store/paramsSlice';
22-
import { selectCanvasSlice, selectEntityOrThrow } from 'features/controlLayers/store/selectors';
22+
import { selectEntityOrThrow, selectSelectedCanvas } from 'features/controlLayers/store/selectors';
2323
import type { CanvasEntityIdentifier, ControlModeV2 } from 'features/controlLayers/store/types';
2424
import { replaceCanvasEntityObjectsWithImage } from 'features/imageActions/actions';
2525
import { memo, useCallback, useMemo } from 'react';
@@ -33,7 +33,7 @@ import type {
3333
} from 'services/api/types';
3434

3535
const buildSelectControlAdapter = (entityIdentifier: CanvasEntityIdentifier<'control_layer'>) =>
36-
createSelector(selectCanvasSlice, (canvas) => {
36+
createSelector(selectSelectedCanvas, (canvas) => {
3737
const layer = selectEntityOrThrow(canvas, entityIdentifier, 'ControlLayerControlAdapter');
3838
return layer.controlAdapter;
3939
});

invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
33
import { useAppSelector } from 'app/store/storeHooks';
44
import { CanvasEntityGroupList } from 'features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList';
55
import { ControlLayer } from 'features/controlLayers/components/ControlLayer/ControlLayer';
6-
import { selectCanvasSlice, selectSelectedEntityIdentifier } from 'features/controlLayers/store/selectors';
6+
import { selectSelectedCanvas, selectSelectedEntityIdentifier } from 'features/controlLayers/store/selectors';
77
import { getEntityIdentifier } from 'features/controlLayers/store/types';
88
import { memo } from 'react';
99

10-
const selectEntityIdentifiers = createMemoizedSelector(selectCanvasSlice, (canvas) => {
10+
const selectEntityIdentifiers = createMemoizedSelector(selectSelectedCanvas, (canvas) => {
1111
return canvas.controlLayers.entities.map(getEntityIdentifier).toReversed();
1212
});
1313

0 commit comments

Comments
 (0)