Skip to content

Commit e3df1ae

Browse files
author
Attila Cseh
committed
ui elements isolated per tab/canvas
1 parent 10f2427 commit e3df1ae

File tree

8 files changed

+49
-19
lines changed

8 files changed

+49
-19
lines changed

invokeai/frontend/web/src/common/components/Picker/Picker.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { createSelector } from '@reduxjs/toolkit';
1515
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
1616
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
1717
import { typedMemo } from 'common/util/typedMemo';
18+
import { selectActiveCanvasId, selectActiveTab } from 'features/controlLayers/store/selectors';
1819
import { NO_DRAG_CLASS, NO_WHEEL_CLASS } from 'features/nodes/types/constants';
1920
import { selectPickerCompactViewStates } from 'features/ui/store/uiSelectors';
2021
import { pickerCompactViewStateChanged } from 'features/ui/store/uiSlice';
@@ -893,7 +894,10 @@ GroupToggleButtons.displayName = 'GroupToggleButtons';
893894
const CompactViewToggleButton = typedMemo(<T extends object>() => {
894895
const { t } = useTranslation();
895896
const dispatch = useAppDispatch();
896-
const { isCompactView, pickerId } = usePickerContext<T>();
897+
const { isCompactView, pickerId: id } = usePickerContext<T>();
898+
const activeTab = useAppSelector(selectActiveTab);
899+
const activeCanvasId = useAppSelector(selectActiveCanvasId);
900+
const pickerId = activeTab === 'canvas' ? `${activeCanvasId}-${id}` : `${activeTab}-${id}`;
897901

898902
const onClick = useCallback(() => {
899903
if (pickerId) {

invokeai/frontend/web/src/common/hooks/usePersistedTextareaSize.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { useAppStore } from 'app/store/storeHooks';
1+
import { useAppSelector, useAppStore } from 'app/store/storeHooks';
22
import { debounce } from 'es-toolkit/compat';
3+
import { selectActiveCanvasId, selectActiveTab } from 'features/controlLayers/store/selectors';
34
import type { Dimensions } from 'features/controlLayers/store/types';
45
import { selectUiSlice, textAreaSizesStateChanged } from 'features/ui/store/uiSlice';
56
import { type RefObject, useCallback, useEffect, useMemo } from 'react';
@@ -22,12 +23,15 @@ type Options = {
2223
*/
2324
export const usePersistedTextAreaSize = (id: string, ref: RefObject<HTMLTextAreaElement>, options: Options) => {
2425
const { dispatch, getState } = useAppStore();
26+
const activeTab = useAppSelector(selectActiveTab);
27+
const activeCanvasId = useAppSelector(selectActiveCanvasId);
28+
const textAreaSizesId = activeTab === 'canvas' ? `${activeCanvasId}-${id}` : `${activeTab}-${id}`;
2529

2630
const onResize = useCallback(
2731
(size: Partial<Dimensions>) => {
28-
dispatch(textAreaSizesStateChanged({ id, size }));
32+
dispatch(textAreaSizesStateChanged({ id: textAreaSizesId, size }));
2933
},
30-
[dispatch, id]
34+
[dispatch, textAreaSizesId]
3135
);
3236

3337
const debouncedOnResize = useMemo(() => debounce(onResize, 300), [onResize]);

invokeai/frontend/web/src/features/controlLayers/store/tabSlice.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const getInitialTabInstanceParamsState = (): TabInstanceParamsState => ({
1919
});
2020

2121
const getInitialTabState = (): TabState => ({
22-
activeTab: 'generate' as const,
22+
activeTab: 'canvas' as const,
2323
generate: getInitialTabInstanceParamsState(),
2424
upscaling: getInitialTabInstanceParamsState(),
2525
video: getInitialTabInstanceParamsState(),

invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const AdvancedSettingsAccordion = memo(() => {
7979
const badges = useAppSelector(selectBadges);
8080
const { t } = useTranslation();
8181
const { isOpen, onToggle } = useStandaloneAccordionToggle({
82-
id: `'advanced-settings-generate`,
82+
id: 'advanced-settings-generate',
8383
defaultIsOpen: false,
8484
});
8585

invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export const UpscaleTabAdvancedSettingsAccordion = memo(() => {
6969
const badges = useAppSelector(selectBadges);
7070
const { t } = useTranslation();
7171
const { isOpen, onToggle } = useStandaloneAccordionToggle({
72-
id: `'advanced-settings-upscaling`,
72+
id: 'advanced-settings-upscaling',
7373
defaultIsOpen: false,
7474
});
7575

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createSelector } from '@reduxjs/toolkit';
22
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
3+
import { selectActiveCanvasId, selectActiveTab } from 'features/controlLayers/store/selectors';
34
import { expanderStateChanged, selectUiSlice } from 'features/ui/store/uiSlice';
45
import { useCallback, useMemo } from 'react';
56

@@ -10,13 +11,17 @@ type UseExpanderToggleArg = {
1011

1112
export const useExpanderToggle = (arg: UseExpanderToggleArg) => {
1213
const dispatch = useAppDispatch();
14+
const activeTab = useAppSelector(selectActiveTab);
15+
const activeCanvasId = useAppSelector(selectActiveCanvasId);
16+
const expanderId = activeTab === 'canvas' ? `${activeCanvasId}-${arg.id}` : `${activeTab}-${arg.id}`;
1317
const selectIsOpen = useMemo(
14-
() => createSelector(selectUiSlice, (ui) => ui.expanders[arg.id] ?? arg.defaultIsOpen),
15-
[arg]
18+
() => createSelector(selectUiSlice, (ui) => ui.expanders[expanderId] ?? arg.defaultIsOpen),
19+
[expanderId, arg]
1620
);
1721
const isOpen = useAppSelector(selectIsOpen);
22+
1823
const onToggle = useCallback(() => {
19-
dispatch(expanderStateChanged({ id: arg.id, isOpen: !isOpen }));
20-
}, [dispatch, arg.id, isOpen]);
24+
dispatch(expanderStateChanged({ id: expanderId, isOpen: !isOpen }));
25+
}, [dispatch, expanderId, isOpen]);
2126
return { isOpen, onToggle };
2227
};
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createSelector } from '@reduxjs/toolkit';
22
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
3+
import { selectActiveCanvasId, selectActiveTab } from 'features/controlLayers/store/selectors';
34
import { accordionStateChanged, selectUiSlice } from 'features/ui/store/uiSlice';
45
import { useCallback, useMemo } from 'react';
56

@@ -10,14 +11,18 @@ type UseStandaloneAccordionToggleArg = {
1011

1112
export const useStandaloneAccordionToggle = (arg: UseStandaloneAccordionToggleArg) => {
1213
const dispatch = useAppDispatch();
14+
const activeTab = useAppSelector(selectActiveTab);
15+
const activeCanvasId = useAppSelector(selectActiveCanvasId);
16+
const accordionId = activeTab === 'canvas' ? `${activeCanvasId}-${arg.id}` : `${activeTab}-${arg.id}`;
1317
const selectIsOpen = useMemo(
14-
() => createSelector(selectUiSlice, (ui) => ui.accordions[arg.id] ?? arg.defaultIsOpen),
15-
[arg]
18+
() => createSelector(selectUiSlice, (ui) => ui.accordions[accordionId] ?? arg.defaultIsOpen),
19+
[accordionId, arg]
1620
);
1721
const isOpen = useAppSelector(selectIsOpen);
22+
1823
const onToggle = useCallback(() => {
19-
dispatch(accordionStateChanged({ id: arg.id, isOpen: !isOpen }));
20-
}, [arg.id, dispatch, isOpen]);
24+
dispatch(accordionStateChanged({ id: accordionId, isOpen: !isOpen }));
25+
}, [dispatch, accordionId, isOpen]);
2126

2227
return { isOpen, onToggle };
2328
};

invokeai/frontend/web/src/features/ui/layouts/use-navigation-api.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import type { AppStore } from 'app/store/store';
12
import { useAppStore } from 'app/store/storeHooks';
23
import { useAssertSingleton } from 'common/hooks/useAssertSingleton';
3-
import { selectActiveTab } from 'features/controlLayers/store/selectors';
4+
import { selectActiveCanvasId, selectActiveTab } from 'features/controlLayers/store/selectors';
45
import { setActiveTab } from 'features/controlLayers/store/tabSlice';
56
import type { TabName } from 'features/controlLayers/store/types';
67
import { dockviewStorageKeyChanged } from 'features/ui/store/uiSlice';
@@ -9,6 +10,14 @@ import type { JsonObject } from 'type-fest';
910

1011
import { navigationApi } from './navigation-api';
1112

13+
const createStorageId = (store: AppStore, id: string) => {
14+
const state = store.getState();
15+
const activeTab = selectActiveTab(state);
16+
const activeCanvasId = selectActiveCanvasId(state);
17+
18+
return activeTab === 'canvas' ? `${activeCanvasId}-${id}` : `${activeTab}-${id}`;
19+
};
20+
1221
/**
1322
* Hook that initializes the global navigation API with callbacks to access and modify the active tab and handle
1423
* stored panel states.
@@ -29,13 +38,16 @@ export const useNavigationApi = () => {
2938
},
3039
storage: {
3140
get: (id: string) => {
32-
return store.getState().ui.panels[id];
41+
const storageId = createStorageId(store, id);
42+
return store.getState().ui.panels[storageId];
3343
},
3444
set: (id: string, state: JsonObject) => {
35-
store.dispatch(dockviewStorageKeyChanged({ id, state }));
45+
const storageId = createStorageId(store, id);
46+
store.dispatch(dockviewStorageKeyChanged({ id: storageId, state }));
3647
},
3748
delete: (id: string) => {
38-
store.dispatch(dockviewStorageKeyChanged({ id, state: undefined }));
49+
const storageId = createStorageId(store, id);
50+
store.dispatch(dockviewStorageKeyChanged({ id: storageId, state: undefined }));
3951
},
4052
},
4153
}),

0 commit comments

Comments
 (0)