Skip to content

Commit 7a5399e

Browse files
psychedelicioushipsterusername
authored andcommitted
feat(ui): display message when no layers are added
1 parent e907757 commit 7a5399e

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const useStageRenderer = (
5555
const selectedLayerIdColor = useAppSelector(selectSelectedLayerColor);
5656
const selectedLayerType = useAppSelector(selectSelectedLayerType);
5757
const layerIds = useMemo(() => state.layers.map((l) => l.id), [state.layers]);
58+
const layerCount = useMemo(() => state.layers.length, [state.layers]);
5859
const renderers = useMemo(() => (asPreview ? debouncedRenderers : normalRenderers), [asPreview]);
5960
const dpr = useDevicePixelRatio({ round: false });
6061

@@ -200,6 +201,15 @@ const useStageRenderer = (
200201
renderers.arrangeLayers(stage, layerIds);
201202
}, [stage, layerIds, renderers]);
202203

204+
useLayoutEffect(() => {
205+
log.trace('Rendering no layers message');
206+
if (asPreview) {
207+
// The preview should not display the no layers message
208+
return;
209+
}
210+
renderers.renderNoLayersMessage(stage, layerCount, state.size.width, state.size.height);
211+
}, [stage, layerCount, renderers, asPreview, state.size.width, state.size.height]);
212+
203213
useLayoutEffect(() => {
204214
Konva.pixelRatio = dpr;
205215
}, [dpr]);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ export const TOOL_PREVIEW_BRUSH_BORDER_OUTER_ID = 'tool_preview_layer.brush_bord
597597
export const TOOL_PREVIEW_RECT_ID = 'tool_preview_layer.rect';
598598
export const BACKGROUND_LAYER_ID = 'background_layer';
599599
export const BACKGROUND_RECT_ID = 'background_layer.rect';
600+
export const NO_LAYERS_MESSAGE_LAYER_ID = 'no_layers_message';
600601

601602
// Names (aka classes) for Konva layers and objects
602603
export const CONTROLNET_LAYER_NAME = 'control_adapter_layer';

invokeai/frontend/web/src/features/controlLayers/util/renderers.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
isRegionalGuidanceLayer,
1515
isRenderableLayer,
1616
LAYER_BBOX_NAME,
17+
NO_LAYERS_MESSAGE_LAYER_ID,
1718
regional_guidance_layer_LINE_NAME,
1819
regional_guidance_layer_NAME,
1920
regional_guidance_layer_OBJECT_GROUP_NAME,
@@ -702,11 +703,47 @@ const arrangeLayers = (stage: Konva.Stage, layerIds: string[]): void => {
702703
stage.findOne<Konva.Layer>(`#${TOOL_PREVIEW_LAYER_ID}`)?.zIndex(nextZIndex++);
703704
};
704705

706+
const createNoLayersMessageLayer = (stage: Konva.Stage): Konva.Layer => {
707+
const noLayersMessageLayer = new Konva.Layer({
708+
id: NO_LAYERS_MESSAGE_LAYER_ID,
709+
opacity: 0.7,
710+
listening: false,
711+
});
712+
const text = new Konva.Text({
713+
x: 0,
714+
y: 0,
715+
align: 'center',
716+
verticalAlign: 'middle',
717+
text: 'No Layers Added',
718+
fontFamily: '"Inter Variable", sans-serif',
719+
fontStyle: '600',
720+
fill: 'white',
721+
});
722+
noLayersMessageLayer.add(text);
723+
stage.add(noLayersMessageLayer);
724+
return noLayersMessageLayer;
725+
};
726+
727+
const renderNoLayersMessage = (stage: Konva.Stage, layerCount: number, width: number, height: number) => {
728+
const noLayersMessageLayer =
729+
stage.findOne<Konva.Layer>(`#${NO_LAYERS_MESSAGE_LAYER_ID}`) ?? createNoLayersMessageLayer(stage);
730+
if (layerCount === 0) {
731+
noLayersMessageLayer.findOne<Konva.Text>('Text')?.setAttrs({
732+
width,
733+
height,
734+
fontSize: 32 / stage.scaleX(),
735+
});
736+
} else {
737+
noLayersMessageLayer?.destroy();
738+
}
739+
};
740+
705741
export const renderers = {
706742
renderToolPreview,
707743
renderLayers,
708744
renderBbox,
709745
renderBackground,
746+
renderNoLayersMessage,
710747
arrangeLayers,
711748
};
712749

@@ -717,6 +754,7 @@ export const debouncedRenderers = {
717754
renderLayers: debounce(renderLayers, DEBOUNCE_MS),
718755
renderBbox: debounce(renderBbox, DEBOUNCE_MS),
719756
renderBackground: debounce(renderBackground, DEBOUNCE_MS),
757+
renderNoLayersMessage: debounce(renderNoLayersMessage, DEBOUNCE_MS),
720758
arrangeLayers: debounce(arrangeLayers, DEBOUNCE_MS),
721759
};
722760

0 commit comments

Comments
 (0)