Skip to content

Commit 35b483b

Browse files
feat(ui): rough out undo/redo on canvas UNDO ME?
1 parent 217b275 commit 35b483b

Some content is hidden

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

44 files changed

+84
-81
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export const addStagingListeners = (startAppListening: AppStartListening) => {
5858
const stagingAreaImage = state.canvasSession.stagedImages[index];
5959

6060
assert(stagingAreaImage, 'No staged image found to accept');
61-
const { x, y } = state.canvasV2.bbox.rect;
61+
const { x, y } = state.canvasV2.present.bbox.rect;
6262

6363
const { imageDTO, offsetX, offsetY } = stagingAreaImage;
6464
const imageObject = imageDTOToImageObject(imageDTO);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const addDeleteBoardAndImagesFulfilledListener = (startAppListening: AppS
1616
const { nodes, canvasV2 } = getState();
1717

1818
deleted_images.forEach((image_name) => {
19-
const imageUsage = getImageUsage(nodes.present, canvasV2, image_name);
19+
const imageUsage = getImageUsage(nodes.present, canvasV2.present, image_name);
2020

2121
if (imageUsage.isNodesImage && !wasNodeEditorReset) {
2222
dispatch(nodeEditorReset());

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const deleteNodesImages = (state: RootState, dispatch: AppDispatch, imageDTO: Im
4040
};
4141

4242
// const deleteControlAdapterImages = (state: RootState, dispatch: AppDispatch, imageDTO: ImageDTO) => {
43-
// state.canvasV2.controlAdapters.entities.forEach(({ id, imageObject, processedImageObject }) => {
43+
// state.canvasV2.present.controlAdapters.entities.forEach(({ id, imageObject, processedImageObject }) => {
4444
// if (
4545
// imageObject?.image.image_name === imageDTO.image_name ||
4646
// processedImageObject?.image.image_name === imageDTO.image_name
@@ -52,15 +52,15 @@ const deleteNodesImages = (state: RootState, dispatch: AppDispatch, imageDTO: Im
5252
// };
5353

5454
const deleteIPAdapterImages = (state: RootState, dispatch: AppDispatch, imageDTO: ImageDTO) => {
55-
state.canvasV2.ipAdapters.entities.forEach((entity) => {
55+
state.canvasV2.present.ipAdapters.entities.forEach((entity) => {
5656
if (entity.ipAdapter.image?.image_name === imageDTO.image_name) {
5757
dispatch(ipaImageChanged({ entityIdentifier: getEntityIdentifier(entity), imageDTO: null }));
5858
}
5959
});
6060
};
6161

6262
const deleteLayerImages = (state: RootState, dispatch: AppDispatch, imageDTO: ImageDTO) => {
63-
state.canvasV2.rasterLayers.entities.forEach(({ id, objects }) => {
63+
state.canvasV2.present.rasterLayers.entities.forEach(({ id, objects }) => {
6464
let shouldDelete = false;
6565
for (const obj of objects) {
6666
if (obj.type === 'image' && obj.image.image_name === imageDTO.image_name) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export const addImageDroppedListener = (startAppListening: AppStartListening) =>
8585
activeData.payload.imageDTO
8686
) {
8787
const imageObject = imageDTOToImageObject(activeData.payload.imageDTO);
88-
const { x, y } = getState().canvasV2.bbox.rect;
88+
const { x, y } = getState().canvasV2.present.bbox.rect;
8989
const overrides: Partial<CanvasRasterLayerState> = {
9090
objects: [imageObject],
9191
position: { x, y },
@@ -103,7 +103,7 @@ export const addImageDroppedListener = (startAppListening: AppStartListening) =>
103103
activeData.payload.imageDTO
104104
) {
105105
const imageObject = imageDTOToImageObject(activeData.payload.imageDTO);
106-
const { x, y } = getState().canvasV2.bbox.rect;
106+
const { x, y } = getState().canvasV2.present.bbox.rect;
107107
const overrides: Partial<CanvasControlLayerState> = {
108108
objects: [imageObject],
109109
position: { x, y },

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) =
4646
}
4747

4848
// handle incompatible controlnets
49-
// state.canvasV2.controlAdapters.entities.forEach((ca) => {
49+
// state.canvasV2.present.controlAdapters.entities.forEach((ca) => {
5050
// if (ca.model?.base !== newBaseModel) {
5151
// modelsCleared += 1;
5252
// if (ca.isEnabled) {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ const handleMainModels: ModelHandler = (models, state, dispatch, log) => {
8383
dispatch(modelChanged({ model: defaultModelInList, previousModel: currentModel }));
8484

8585
const optimalDimension = getOptimalDimension(defaultModelInList);
86-
if (getIsSizeOptimal(state.canvasV2.bbox.rect.width, state.canvasV2.bbox.rect.height, optimalDimension)) {
86+
if (getIsSizeOptimal(state.canvasV2.present.bbox.rect.width, state.canvasV2.present.bbox.rect.height, optimalDimension)) {
8787
return;
8888
}
8989
const { width, height } = calculateNewSize(
90-
state.canvasV2.bbox.aspectRatio.value,
90+
state.canvasV2.present.bbox.aspectRatio.value,
9191
optimalDimension * optimalDimension
9292
);
9393

@@ -172,7 +172,7 @@ const handleLoRAModels: ModelHandler = (models, state, dispatch, _log) => {
172172

173173
const handleControlAdapterModels: ModelHandler = (models, state, dispatch, _log) => {
174174
const caModels = models.filter(isControlNetOrT2IAdapterModelConfig);
175-
state.canvasV2.controlLayers.entities.forEach((entity) => {
175+
state.canvasV2.present.controlLayers.entities.forEach((entity) => {
176176
const isModelAvailable = caModels.some((m) => m.key === entity.controlAdapter.model?.key);
177177
if (isModelAvailable) {
178178
return;
@@ -183,15 +183,15 @@ const handleControlAdapterModels: ModelHandler = (models, state, dispatch, _log)
183183

184184
const handleIPAdapterModels: ModelHandler = (models, state, dispatch, _log) => {
185185
const ipaModels = models.filter(isIPAdapterModelConfig);
186-
state.canvasV2.ipAdapters.entities.forEach((entity) => {
186+
state.canvasV2.present.ipAdapters.entities.forEach((entity) => {
187187
const isModelAvailable = ipaModels.some((m) => m.key === entity.ipAdapter.model?.key);
188188
if (isModelAvailable) {
189189
return;
190190
}
191191
dispatch(ipaModelChanged({ entityIdentifier: getEntityIdentifier(entity), modelConfig: null }));
192192
});
193193

194-
state.canvasV2.regions.entities.forEach((entity) => {
194+
state.canvasV2.present.regions.entities.forEach((entity) => {
195195
entity.ipAdapters.forEach(({ id: ipAdapterId, model }) => {
196196
const isModelAvailable = ipaModels.some((m) => m.key === model?.key);
197197
if (isModelAvailable) {

invokeai/frontend/web/src/app/store/store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const allReducers = {
5858
[queueSlice.name]: queueSlice.reducer,
5959
[workflowSlice.name]: workflowSlice.reducer,
6060
[hrfSlice.name]: hrfSlice.reducer,
61-
[canvasV2Slice.name]: canvasV2Slice.reducer,
61+
[canvasV2Slice.name]: undoable(canvasV2Slice.reducer),
6262
[workflowSettingsSlice.name]: workflowSettingsSlice.reducer,
6363
[upscaleSlice.name]: upscaleSlice.reducer,
6464
[stylePresetSlice.name]: stylePresetSlice.reducer,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const ControlLayerBadges = memo(() => {
99
const entityIdentifier = useEntityIdentifierContext('control_layer');
1010
const { t } = useTranslation();
1111
const withTransparencyEffect = useAppSelector(
12-
(s) => selectEntityOrThrow(s.canvasV2, entityIdentifier).withTransparencyEffect
12+
(s) => selectEntityOrThrow(s.canvasV2.present, entityIdentifier).withTransparencyEffect
1313
);
1414

1515
return (

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const selectEntityIds = createMemoizedSelector(selectCanvasV2Slice, (canvasV2) =
1111
});
1212

1313
export const ControlLayerEntityList = memo(() => {
14-
const isSelected = useAppSelector((s) => Boolean(s.canvasV2.selectedEntityIdentifier?.type === 'control_layer'));
14+
const isSelected = useAppSelector((s) => Boolean(s.canvasV2.present.selectedEntityIdentifier?.type === 'control_layer'));
1515
const layerIds = useAppSelector(selectEntityIds);
1616

1717
if (layerIds.length === 0) {

invokeai/frontend/web/src/features/controlLayers/components/HeadsUpDisplay.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const HeadsUpDisplay = memo(() => {
1313
const isMouseDown = useStore(canvasManager.stateApi.$isMouseDown);
1414
const lastMouseDownPos = useStore(canvasManager.stateApi.$lastMouseDownPos);
1515
const lastAddedPoint = useStore(canvasManager.stateApi.$lastAddedPoint);
16-
const bbox = useAppSelector((s) => s.canvasV2.bbox);
16+
const bbox = useAppSelector((s) => s.canvasV2.present.bbox);
1717

1818
return (
1919
<Flex flexDir="column" bg="blackAlpha.400" borderBottomEndRadius="base" p={2} minW={64} gap={2}>

0 commit comments

Comments
 (0)