Skip to content

Commit 2039cee

Browse files
feat(ui): get layouts working
1 parent ce5f48e commit 2039cee

22 files changed

+641
-352
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const CanvasLayersPanel = memo(() => {
1414

1515
return (
1616
<CanvasManagerProviderGate>
17-
<Flex flexDir="column" gap={2} w="full" h="full">
17+
<Flex flexDir="column" gap={2} w="full" h="full" p={2}>
1818
<EntityListSelectedEntityActionBar />
1919
<Divider py={0} />
2020
<ParamDenoisingStrength />

invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const CanvasLaunchpadPanel = memo(() => {
1111
return (
1212
<Flex flexDir="column" h="full" w="full" alignItems="center" gap={2}>
1313
<Flex flexDir="column" w="full" h="full" gap={4} px={12} maxW={768} pt="20%">
14-
<Heading mb={4}>Get started with Invoke.</Heading>
14+
<Heading mb={4}>Edit and refine on Canvas.</Heading>
1515
<Flex flexDir="column" gap={8}>
1616
<Grid gridTemplateColumns="1fr 1fr" gap={8}>
1717
<InitialStateMainModelPicker />

invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const GenerateLaunchpadPanel = memo(() => {
1616
return (
1717
<Flex flexDir="column" h="full" w="full" alignItems="center" justifyContent="center" gap={2}>
1818
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={12} maxW={768}>
19-
<Heading mb={4}>Get started with Invoke.</Heading>
19+
<Heading mb={4}>Generate images from text prompts.</Heading>
2020
<Flex flexDir="column" gap={8}>
2121
<Grid gridTemplateColumns="1fr 1fr" gap={8}>
2222
<InitialStateMainModelPicker />
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Flex, Heading } from '@invoke-ai/ui-library';
2+
import { memo } from 'react';
3+
4+
export const UpscalingLaunchpadPanel = memo(() => {
5+
return (
6+
<Flex flexDir="column" h="full" w="full" alignItems="center" justifyContent="center" gap={2}>
7+
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={12} maxW={768}>
8+
<Heading mb={4}>Upscale and add detail.</Heading>
9+
</Flex>
10+
</Flex>
11+
);
12+
});
13+
UpscalingLaunchpadPanel.displayName = 'UpscalingLaunchpadPanel';

invokeai/frontend/web/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Divider, Flex, Heading } from '@invoke-ai/ui-library';
1+
import { Divider, Flex } from '@invoke-ai/ui-library';
22
import { CanvasSettingsPopover } from 'features/controlLayers/components/Settings/CanvasSettingsPopover';
33
import { ToolColorPicker } from 'features/controlLayers/components/Tool/ToolFillColorPicker';
44
import { ToolSettings } from 'features/controlLayers/components/Tool/ToolSettings';
@@ -29,10 +29,6 @@ export const CanvasToolbar = memo(() => {
2929

3030
return (
3131
<Flex w="full" gap={2} alignItems="center" px={2}>
32-
<Heading size="sm" me={2}>
33-
Canvas
34-
</Heading>
35-
<Divider orientation="vertical" />
3632
<ToolColorPicker />
3733
<ToolSettings />
3834
<Flex alignItems="center" h="full" flexGrow={1} justifyContent="flex-end">
@@ -48,7 +44,6 @@ export const CanvasToolbar = memo(() => {
4844
<CanvasToolbarNewSessionMenuButton />
4945
<CanvasSettingsPopover />
5046
</Flex>
51-
<Divider orientation="vertical" />
5247
</Flex>
5348
);
5449
});

invokeai/frontend/web/src/features/system/store/configSlice.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import type { PayloadAction, Selector } from '@reduxjs/toolkit';
22
import { createSelector, createSlice } from '@reduxjs/toolkit';
33
import type { RootState } from 'app/store/store';
44
import type { AppConfig, NumericalParameterConfig, PartialAppConfig } from 'app/types/invokeai';
5+
import type { TabName } from 'features/ui/store/uiTypes';
6+
import { ALL_TABS } from 'features/ui/store/uiTypes';
57
import { merge } from 'lodash-es';
68

79
const baseDimensionConfig: NumericalParameterConfig = {
@@ -225,3 +227,12 @@ export const selectIsClientSideUploadEnabled = createConfigSelector((config) =>
225227
export const selectAllowPublishWorkflows = createConfigSelector((config) => config.allowPublishWorkflows);
226228
export const selectIsLocal = createSelector(selectConfigSlice, (config) => config.isLocal);
227229
export const selectShouldShowCredits = createConfigSelector((config) => config.shouldShowCredits);
230+
export const selectEnabledTabs = createConfigSelector((config) => {
231+
const enabledTabs: TabName[] = [];
232+
for (const tab of ALL_TABS) {
233+
if (!config.disabledTabs.includes(tab)) {
234+
enabledTabs.push(tab);
235+
}
236+
}
237+
return enabledTabs;
238+
});

invokeai/frontend/web/src/features/ui/components/AppContent.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import 'dockview/dist/styles/dockview.css';
22
import 'features/ui/styles/dockview-theme-invoke.css';
33

4-
import { Flex } from '@invoke-ai/ui-library';
4+
import { TabList, TabPanel, TabPanels, Tabs } from '@invoke-ai/ui-library';
5+
import { useAppSelector } from 'app/store/storeHooks';
56
import { useDndMonitor } from 'features/dnd/useDndMonitor';
67
import { VerticalNavBar } from 'features/ui/components/VerticalNavBar';
7-
import { AutoLayout } from 'features/ui/layouts/AutoLayout';
8+
import { CanvasTabAutoLayout } from 'features/ui/layouts/canvas-tab-auto-layout';
9+
import { GenerateTabAutoLayout } from 'features/ui/layouts/generate-tab-auto-layout';
10+
import { UpscalingTabAutoLayout } from 'features/ui/layouts/upscaling-tab-auto-layout';
11+
import { selectActiveTabIndex } from 'features/ui/store/uiSelectors';
812
import { $isLeftPanelOpen, $isRightPanelOpen } from 'features/ui/store/uiSlice';
913
import type { CSSProperties } from 'react';
1014
import { memo } from 'react';
@@ -16,6 +20,7 @@ const onRightPanelCollapse = (isCollapsed: boolean) => $isRightPanelOpen.set(!is
1620

1721
export const AppContent = memo(() => {
1822
// const tab = useAppSelector(selectActiveTab);
23+
const tabIndex = useAppSelector(selectActiveTabIndex);
1924
// const imperativePanelGroupRef = useRef<ImperativePanelGroupHandle>(null);
2025
useDndMonitor();
2126

@@ -93,10 +98,22 @@ export const AppContent = memo(() => {
9398
// });
9499

95100
return (
96-
<Flex id="invoke-app-tabs" w="full" h="full" p={0} overflow="hidden">
97-
<VerticalNavBar />
98-
<AutoLayout />
99-
</Flex>
101+
<Tabs index={tabIndex} display="flex" w="full" h="full" p={0} overflow="hidden">
102+
<TabList>
103+
<VerticalNavBar />
104+
</TabList>
105+
<TabPanels w="full" h="full" p={0}>
106+
<TabPanel w="full" h="full" p={0}>
107+
<GenerateTabAutoLayout />
108+
</TabPanel>
109+
<TabPanel w="full" h="full" p={0}>
110+
<CanvasTabAutoLayout />
111+
</TabPanel>
112+
<TabPanel w="full" h="full" p={0}>
113+
<UpscalingTabAutoLayout />
114+
</TabPanel>
115+
</TabPanels>
116+
</Tabs>
100117
);
101118
});
102119
AppContent.displayName = 'AppContent';

invokeai/frontend/web/src/features/ui/components/ParametersPanels/ParametersPanelTextToImage.tsx renamed to invokeai/frontend/web/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const overlayScrollbarsStyles: CSSProperties = {
2222
width: '100%',
2323
};
2424

25-
const ParametersPanelTextToImage = () => {
25+
export const ParametersPanelCanvas = memo(() => {
2626
const isSDXL = useAppSelector(selectIsSDXL);
2727
const isCogview4 = useAppSelector(selectIsCogView4);
2828
const isStylePresetsMenuOpen = useStore($isStylePresetsMenuOpen);
@@ -55,6 +55,6 @@ const ParametersPanelTextToImage = () => {
5555
</Flex>
5656
</Flex>
5757
);
58-
};
58+
});
5959

60-
export default memo(ParametersPanelTextToImage);
60+
ParametersPanelCanvas.displayName = 'ParametersPanelCanvas';
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { Box, Flex } from '@invoke-ai/ui-library';
2+
import { useStore } from '@nanostores/react';
3+
import { useAppSelector } from 'app/store/storeHooks';
4+
import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants';
5+
import { selectIsCogView4, selectIsSDXL } from 'features/controlLayers/store/paramsSlice';
6+
import { Prompts } from 'features/parameters/components/Prompts/Prompts';
7+
import { useIsApiModel } from 'features/parameters/hooks/useIsApiModel';
8+
import { AdvancedSettingsAccordion } from 'features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion';
9+
import { GenerationSettingsAccordion } from 'features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion';
10+
import { ImageSettingsAccordion } from 'features/settingsAccordions/components/ImageSettingsAccordion/ImageSettingsAccordion';
11+
import { RefinerSettingsAccordion } from 'features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion';
12+
import { StylePresetMenu } from 'features/stylePresets/components/StylePresetMenu';
13+
import { StylePresetMenuTrigger } from 'features/stylePresets/components/StylePresetMenuTrigger';
14+
import { $isStylePresetsMenuOpen } from 'features/stylePresets/store/stylePresetSlice';
15+
import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
16+
import type { CSSProperties } from 'react';
17+
import { memo } from 'react';
18+
19+
const overlayScrollbarsStyles: CSSProperties = {
20+
height: '100%',
21+
width: '100%',
22+
};
23+
24+
export const ParametersPanelGenerate = memo(() => {
25+
const isSDXL = useAppSelector(selectIsSDXL);
26+
const isCogview4 = useAppSelector(selectIsCogView4);
27+
const isStylePresetsMenuOpen = useStore($isStylePresetsMenuOpen);
28+
29+
const isApiModel = useIsApiModel();
30+
31+
return (
32+
<Flex w="full" h="full" flexDir="column" gap={2}>
33+
<StylePresetMenuTrigger />
34+
<Flex w="full" h="full" position="relative">
35+
<Box position="absolute" top={0} left={0} right={0} bottom={0}>
36+
{isStylePresetsMenuOpen && (
37+
<OverlayScrollbarsComponent defer style={overlayScrollbarsStyles} options={overlayScrollbarsParams.options}>
38+
<Flex gap={2} flexDirection="column" h="full" w="full">
39+
<StylePresetMenu />
40+
</Flex>
41+
</OverlayScrollbarsComponent>
42+
)}
43+
<OverlayScrollbarsComponent defer style={overlayScrollbarsStyles} options={overlayScrollbarsParams.options}>
44+
<Flex gap={2} flexDirection="column" h="full" w="full">
45+
<Prompts />
46+
<ImageSettingsAccordion />
47+
<GenerationSettingsAccordion />
48+
{isSDXL && <RefinerSettingsAccordion />}
49+
{!isCogview4 && !isApiModel && <AdvancedSettingsAccordion />}
50+
</Flex>
51+
</OverlayScrollbarsComponent>
52+
</Box>
53+
</Flex>
54+
</Flex>
55+
);
56+
});
57+
58+
ParametersPanelGenerate.displayName = 'ParametersPanelGenerate';

invokeai/frontend/web/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const overlayScrollbarsStyles: CSSProperties = {
1717
width: '100%',
1818
};
1919

20-
const ParametersPanelUpscale = () => {
20+
export const ParametersPanelUpscale = memo(() => {
2121
const isStylePresetsMenuOpen = useStore($isStylePresetsMenuOpen);
2222

2323
return (
@@ -44,6 +44,6 @@ const ParametersPanelUpscale = () => {
4444
</Flex>
4545
</Flex>
4646
);
47-
};
47+
});
4848

49-
export default memo(ParametersPanelUpscale);
49+
ParametersPanelUpscale.displayName = 'ParametersPanelUpscale';

0 commit comments

Comments
 (0)