Skip to content

Commit 35a088e

Browse files
perf(ui): optimize <CanvasToolbarScale />
1 parent b936cab commit 35a088e

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

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

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { SystemStyleObject } from '@invoke-ai/ui-library';
12
import {
23
$shift,
34
CompositeSlider,
@@ -16,7 +17,6 @@ import { useStore } from '@nanostores/react';
1617
import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate';
1718
import { snapToNearest } from 'features/controlLayers/konva/util';
1819
import { round } from 'lodash-es';
19-
import { computed } from 'nanostores';
2020
import type { KeyboardEvent } from 'react';
2121
import { memo, useCallback, useEffect, useState } from 'react';
2222
import { PiCaretDownBold, PiMagnifyingGlassMinusBold, PiMagnifyingGlassPlusBold } from 'react-icons/pi';
@@ -68,9 +68,16 @@ const sliderDefaultValue = mapRawValueToSliderValue(100);
6868

6969
const snapCandidates = marks.slice(1, marks.length - 1);
7070

71+
const inputFieldSx = {
72+
paddingInlineEnd: 7,
73+
_focusVisible: {
74+
zIndex: 0,
75+
},
76+
} satisfies SystemStyleObject;
77+
7178
export const CanvasToolbarScale = memo(() => {
7279
const canvasManager = useCanvasManager();
73-
const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
80+
const scale = useStore(canvasManager.stage.$scale);
7481
const [localScale, setLocalScale] = useState(scale * 100);
7582

7683
const onChangeSlider = useCallback(
@@ -132,7 +139,7 @@ export const CanvasToolbarScale = memo(() => {
132139
onKeyDown={onKeyDown}
133140
clampValueOnBlur={false}
134141
>
135-
<NumberInputField paddingInlineEnd={7} title="" _focusVisible={{ zIndex: 0 }} />
142+
<NumberInputField title="" sx={inputFieldSx} />
136143
<PopoverTrigger>
137144
<IconButton
138145
aria-label="open-slider"
@@ -171,16 +178,17 @@ CanvasToolbarScale.displayName = 'CanvasToolbarScale';
171178

172179
const SCALE_SNAPS = [0.1, 0.15, 0.2, 0.25, 0.5, 0.75, 1, 1.5, 2, 2.5, 5, 7.5, 10, 15, 20];
173180

174-
const ZoomOutButton = () => {
181+
const ZoomOutButton = memo(() => {
175182
const canvasManager = useCanvasManager();
176-
const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
183+
const scale = useStore(canvasManager.stage.$scale);
177184
const onClick = useCallback(() => {
185+
const scale = canvasManager.stage.$scale.get();
178186
const nextScale =
179187
SCALE_SNAPS.slice()
180188
.reverse()
181189
.find((snap) => snap < scale) ?? canvasManager.stage.config.MIN_SCALE;
182190
canvasManager.stage.setScale(Math.max(nextScale, canvasManager.stage.config.MIN_SCALE));
183-
}, [canvasManager.stage, scale]);
191+
}, [canvasManager.stage]);
184192

185193
return (
186194
<IconButton
@@ -192,15 +200,17 @@ const ZoomOutButton = () => {
192200
isDisabled={scale <= canvasManager.stage.config.MIN_SCALE}
193201
/>
194202
);
195-
};
203+
});
204+
ZoomOutButton.displayName = 'ZoomOutButton';
196205

197-
const ZoomInButton = () => {
206+
const ZoomInButton = memo(() => {
198207
const canvasManager = useCanvasManager();
199-
const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
208+
const scale = useStore(canvasManager.stage.$scale);
200209
const onClick = useCallback(() => {
210+
const scale = canvasManager.stage.$scale.get();
201211
const nextScale = SCALE_SNAPS.find((snap) => snap > scale) ?? canvasManager.stage.config.MAX_SCALE;
202212
canvasManager.stage.setScale(Math.min(nextScale, canvasManager.stage.config.MAX_SCALE));
203-
}, [canvasManager.stage, scale]);
213+
}, [canvasManager.stage]);
204214

205215
return (
206216
<IconButton
@@ -212,4 +222,5 @@ const ZoomInButton = () => {
212222
isDisabled={scale >= canvasManager.stage.config.MAX_SCALE}
213223
/>
214224
);
215-
};
225+
});
226+
ZoomInButton.displayName = 'ZoomInButton';

0 commit comments

Comments
 (0)