feat(App): enhance generate tool behavior and layer management

This commit is contained in:
syntaxbullet
2026-07-05 09:45:15 +02:00
parent 04a7275143
commit dd0c1df730

View File

@@ -35,9 +35,18 @@ export function App({ app }: AppProps) {
const generateOpen = tools.activeTool === "generate"; const generateOpen = tools.activeTool === "generate";
useEffect(() => { useEffect(() => {
if (tools.activeTool !== "generate") previousGenerateTool.current = tools.activeTool; if (tools.activeTool !== "generate") {
previousGenerateTool.current = tools.activeTool;
return;
}
setLayersOpen(false);
}, [tools.activeTool]); }, [tools.activeTool]);
const getGenerateReturnTool = useCallback((): ToolId => {
return previousGenerateTool.current === "generate" ? "select" : previousGenerateTool.current;
}, []);
const openGenerate = useCallback(() => { const openGenerate = useCallback(() => {
const activeTool = app.store.getState().editor.tools.activeTool; const activeTool = app.store.getState().editor.tools.activeTool;
if (activeTool !== "generate") previousGenerateTool.current = activeTool; if (activeTool !== "generate") previousGenerateTool.current = activeTool;
@@ -47,15 +56,21 @@ export function App({ app }: AppProps) {
const closeGenerate = useCallback(() => { const closeGenerate = useCallback(() => {
if (app.store.getState().editor.tools.activeTool === "generate") { if (app.store.getState().editor.tools.activeTool === "generate") {
app.store.dispatch(commandIds.toolSetActive, { tool: previousGenerateTool.current }); app.store.dispatch(commandIds.toolSetActive, { tool: getGenerateReturnTool() });
} }
}, [app.store]); }, [app.store, getGenerateReturnTool]);
const toggleGenerate = useCallback(() => { const toggleGenerate = useCallback(() => {
if (generateOpen) closeGenerate(); if (generateOpen) closeGenerate();
else openGenerate(); else openGenerate();
}, [closeGenerate, generateOpen, openGenerate]); }, [closeGenerate, generateOpen, openGenerate]);
const toggleLayers = useCallback(() => {
const nextOpen = !layersOpen;
if (nextOpen) closeGenerate();
setLayersOpen(nextOpen);
}, [closeGenerate, layersOpen]);
useEffect(() => { useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {
const target = event.target; const target = event.target;
@@ -89,8 +104,7 @@ export function App({ app }: AppProps) {
} }
if (key === "l") { if (key === "l") {
closeGenerate(); toggleLayers();
setLayersOpen((open) => !open);
event.preventDefault(); event.preventDefault();
return; return;
} }
@@ -105,7 +119,7 @@ export function App({ app }: AppProps) {
window.addEventListener("keydown", handleKeyDown); window.addEventListener("keydown", handleKeyDown);
return () => window.removeEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown);
}, [app.store, closeGenerate, toggleGenerate]); }, [app.store, toggleLayers]);
const transformBounds = transformTarget ? resolveTransformTargetBounds(document, transformTarget) : undefined; const transformBounds = transformTarget ? resolveTransformTargetBounds(document, transformTarget) : undefined;
const brushHint = brushUnavailableHint(document, { selection, tools, maskEdit }); const brushHint = brushUnavailableHint(document, { selection, tools, maskEdit });
@@ -123,7 +137,7 @@ export function App({ app }: AppProps) {
<button type="button" className={topBarButtonClass()} disabled={!activeArtboard} onClick={() => activeArtboard && void downloadArtboardPng(activeArtboard, document.assets)}> <button type="button" className={topBarButtonClass()} disabled={!activeArtboard} onClick={() => activeArtboard && void downloadArtboardPng(activeArtboard, document.assets)}>
<DownloadSimple size={24} /> <DownloadSimple size={24} />
</button> </button>
<button type="button" className={topBarButtonClass(layersOpen)} aria-pressed={layersOpen} onClick={() => { closeGenerate(); setLayersOpen((open) => !open); }}> <button type="button" className={topBarButtonClass(layersOpen)} aria-pressed={layersOpen} onClick={toggleLayers}>
<Stack size={24} weight={layersOpen ? "fill" : "regular"} /> <Stack size={24} weight={layersOpen ? "fill" : "regular"} />
</button> </button>
</div> </div>