Skip to content

Commit 9295e3a

Browse files
feat(ui): restore floating panel buttons
1 parent bcd1a64 commit 9295e3a

12 files changed

+502
-176
lines changed

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

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

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

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

1616
return (
1717
<Flex flexDir="column" h="full" w="full" alignItems="center" justifyContent="center" gap={2}>
18-
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={12} maxW={768}>
18+
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={14} maxW={768}>
1919
<Heading mb={4}>Generate images from text prompts.</Heading>
2020
<Flex flexDir="column" gap={8}>
2121
<Grid gridTemplateColumns="1fr 1fr" gap={8}>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { memo } from 'react';
44
export const UpscalingLaunchpadPanel = memo(() => {
55
return (
66
<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}>
7+
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={14} maxW={768}>
88
<Heading mb={4}>Upscale and add detail.</Heading>
99
</Flex>
1010
</Flex>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { memo } from 'react';
44
export const WorkflowsLaunchpadPanel = memo(() => {
55
return (
66
<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}>
7+
<Flex flexDir="column" w="full" h="full" justifyContent="center" gap={4} px={14} maxW={768}>
88
<Heading mb={4}>Go deep with Workflows.</Heading>
99
</Flex>
1010
</Flex>

invokeai/frontend/web/src/features/gallery/components/GalleryTopBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const GalleryTopBar = memo(() => {
1717
const dispatch = useAppDispatch();
1818
const boardSearchText = useAppSelector(selectBoardSearchText);
1919
const boardSearchDisclosure = useBoardSearchDisclosure();
20-
const $api = useAutoLayoutContext();
20+
const { $api } = useAutoLayoutContext();
2121
const api = useStore($api);
2222
const boardsPanel = useCollapsibleGridviewPanel(api, 'Boards', 'vertical', 256);
2323
const isBoardsPanelCollapsed = useStore(boardsPanel.$isCollapsed);

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { ButtonGroup, Flex, Icon, IconButton, spinAnimation, Tooltip, useShiftModifier } from '@invoke-ai/ui-library';
2-
import { useAppSelector } from 'app/store/storeHooks';
32
import { ToolChooser } from 'features/controlLayers/components/Tool/ToolChooser';
43
import { CanvasManagerProviderGate } from 'features/controlLayers/contexts/CanvasManagerProviderGate';
54
import { useDeleteAllExceptCurrentQueueItemDialog } from 'features/queue/components/DeleteAllExceptCurrentQueueItemConfirmationAlertDialog';
65
import { InvokeButtonTooltip } from 'features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip';
76
import { useDeleteCurrentQueueItem } from 'features/queue/hooks/useDeleteCurrentQueueItem';
87
import { useInvoke } from 'features/queue/hooks/useInvoke';
9-
import { selectActiveTab } from 'features/ui/store/uiSelectors';
8+
import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData';
9+
import { useAutoLayoutContext } from 'features/ui/layouts/auto-layout-context';
1010
import { memo } from 'react';
1111
import { useTranslation } from 'react-i18next';
1212
import {
@@ -19,18 +19,11 @@ import {
1919
} from 'react-icons/pi';
2020
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
2121

22-
export const FloatingLeftPanelButtons = memo((props: { onToggle: () => void }) => {
23-
const tab = useAppSelector(selectActiveTab);
24-
22+
export const FloatingLeftPanelButtons = memo(() => {
2523
return (
2624
<Flex pos="absolute" transform="translate(0, -50%)" top="50%" insetInlineStart={2} direction="column" gap={2}>
27-
{tab === 'canvas' && (
28-
<CanvasManagerProviderGate>
29-
<ToolChooser />
30-
</CanvasManagerProviderGate>
31-
)}
3225
<ButtonGroup orientation="vertical" h={48}>
33-
<ToggleLeftPanelButton onToggle={props.onToggle} />
26+
<ToggleLeftPanelButton />
3427
<InvokeIconButton />
3528
<DeleteCurrentIconButton />
3629
<DeleteAllExceptCurrentIconButton />
@@ -41,13 +34,37 @@ export const FloatingLeftPanelButtons = memo((props: { onToggle: () => void }) =
4134

4235
FloatingLeftPanelButtons.displayName = 'FloatingLeftPanelButtons';
4336

44-
const ToggleLeftPanelButton = memo((props: { onToggle: () => void }) => {
37+
export const FloatingCanvasLeftPanelButtons = memo(() => {
38+
return (
39+
<Flex pos="absolute" transform="translate(0, -50%)" top="50%" insetInlineStart={2} direction="column" gap={2}>
40+
<CanvasManagerProviderGate>
41+
<ToolChooser />
42+
</CanvasManagerProviderGate>
43+
<ButtonGroup orientation="vertical" h={48}>
44+
<ToggleLeftPanelButton />
45+
<InvokeIconButton />
46+
<DeleteCurrentIconButton />
47+
<DeleteAllExceptCurrentIconButton />
48+
</ButtonGroup>
49+
</Flex>
50+
);
51+
});
52+
53+
FloatingCanvasLeftPanelButtons.displayName = 'FloatingCanvasLeftPanelButtons';
54+
55+
const ToggleLeftPanelButton = memo(() => {
56+
const { toggleLeftPanel } = useAutoLayoutContext();
57+
useRegisteredHotkeys({
58+
category: 'app',
59+
id: 'toggleLeftPanel',
60+
callback: toggleLeftPanel,
61+
});
4562
const { t } = useTranslation();
4663
return (
4764
<Tooltip label={t('accessibility.toggleLeftPanel')} placement="end">
4865
<IconButton
4966
aria-label={t('accessibility.toggleLeftPanel')}
50-
onClick={props.onToggle}
67+
onClick={toggleLeftPanel}
5168
icon={<PiSlidersHorizontalBold />}
5269
flexGrow={1}
5370
/>

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
11
import { Flex, IconButton, Tooltip } from '@invoke-ai/ui-library';
2+
import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData';
3+
import { useAutoLayoutContext } from 'features/ui/layouts/auto-layout-context';
24
import { memo } from 'react';
35
import { useTranslation } from 'react-i18next';
46
import { PiImagesSquareBold } from 'react-icons/pi';
57

6-
export const FloatingRightPanelButtons = memo((props: { onToggle: () => void }) => {
8+
export const FloatingRightPanelButtons = memo(() => {
79
return (
810
<Flex pos="absolute" transform="translate(0, -50%)" minW={8} top="50%" insetInlineEnd={2}>
9-
<ToggleRightPanelButton onToggle={props.onToggle} />
11+
<ToggleRightPanelButton />
1012
</Flex>
1113
);
1214
});
1315
FloatingRightPanelButtons.displayName = 'FloatingRightPanelButtons';
1416

15-
const ToggleRightPanelButton = memo((props: { onToggle: () => void }) => {
17+
const ToggleRightPanelButton = memo(() => {
1618
const { t } = useTranslation();
19+
const { toggleRightPanel } = useAutoLayoutContext();
20+
useRegisteredHotkeys({
21+
category: 'app',
22+
id: 'toggleRightPanel',
23+
callback: toggleRightPanel,
24+
});
25+
1726
return (
1827
<Tooltip label={t('accessibility.toggleRightPanel')} placement="start">
1928
<IconButton
2029
aria-label={t('accessibility.toggleRightPanel')}
21-
onClick={props.onToggle}
30+
onClick={toggleRightPanel}
2231
icon={<PiImagesSquareBold />}
2332
h={48}
2433
/>
Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
11
import type { GridviewApi } from 'dockview';
22
import type { Atom } from 'nanostores';
33
import type { PropsWithChildren } from 'react';
4-
import { createContext, useContext } from 'react';
4+
import { createContext, useContext, useMemo } from 'react';
55

6-
const AutoLayoutContext = createContext<Atom<GridviewApi | null> | null>(null);
6+
type AutoLayoutContextValue = {
7+
$api: Atom<GridviewApi | null>;
8+
toggleLeftPanel: () => void;
9+
toggleRightPanel: () => void;
10+
};
11+
12+
const AutoLayoutContext = createContext<AutoLayoutContextValue | null>(null);
713

8-
export const AutoLayoutProvider = (props: PropsWithChildren<{ $api: Atom<GridviewApi | null> }>) => {
9-
return <AutoLayoutContext.Provider value={props.$api}>{props.children}</AutoLayoutContext.Provider>;
14+
export const AutoLayoutProvider = (props: PropsWithChildren<AutoLayoutContextValue>) => {
15+
const value = useMemo<AutoLayoutContextValue>(
16+
() => ({
17+
$api: props.$api,
18+
toggleLeftPanel: props.toggleLeftPanel,
19+
toggleRightPanel: props.toggleRightPanel,
20+
}),
21+
[props.$api, props.toggleLeftPanel, props.toggleRightPanel]
22+
);
23+
return <AutoLayoutContext.Provider value={value}>{props.children}</AutoLayoutContext.Provider>;
1024
};
1125

1226
export const useAutoLayoutContext = () => {
13-
const api = useContext(AutoLayoutContext);
14-
if (!api) {
27+
const value = useContext(AutoLayoutContext);
28+
if (!value) {
1529
throw new Error('useAutoLayoutContext must be used within an AutoLayoutProvider');
1630
}
17-
return api;
31+
return value;
1832
};

0 commit comments

Comments
 (0)