mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
tidy(ui): remove unused files, code
This commit is contained in:
parent
00737efc31
commit
8f4f3b773c
@ -1,128 +0,0 @@
|
||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||
import getScaledCursorPosition from 'features/canvas/util/getScaledCursorPosition';
|
||||
import { LayerBoundingBox } from 'features/regionalPrompts/components/LayerBoundingBox';
|
||||
import { LineComponent } from 'features/regionalPrompts/components/LineComponent';
|
||||
import { RectComponent } from 'features/regionalPrompts/components/RectComponent';
|
||||
import { useLayer } from 'features/regionalPrompts/hooks/layerStateHooks';
|
||||
import {
|
||||
getStage,
|
||||
layerBboxChanged,
|
||||
layerTranslated,
|
||||
REGIONAL_PROMPT_LAYER_NAME,
|
||||
REGIONAL_PROMPT_LAYER_OBJECT_GROUP_NAME,
|
||||
} from 'features/regionalPrompts/store/regionalPromptsSlice';
|
||||
import { getKonvaLayerBbox } from 'features/regionalPrompts/util/bbox';
|
||||
import type { Group as KonvaGroupType } from 'konva/lib/Group';
|
||||
import type { Layer as KonvaLayerType } from 'konva/lib/Layer';
|
||||
import type { KonvaEventObject, Node as KonvaNodeType, NodeConfig as KonvaNodeConfigType } from 'konva/lib/Node';
|
||||
import type { IRect, Vector2d } from 'konva/lib/types';
|
||||
import { memo, useCallback, useEffect, useRef } from 'react';
|
||||
import { Group as KonvaGroup, Layer as KonvaLayer } from 'react-konva';
|
||||
|
||||
type Props = {
|
||||
id: string;
|
||||
};
|
||||
|
||||
export const selectPromptLayerObjectGroup = (item: KonvaNodeType<KonvaNodeConfigType>) =>
|
||||
item.name() !== REGIONAL_PROMPT_LAYER_OBJECT_GROUP_NAME;
|
||||
|
||||
export const LayerComponent = memo(({ id }: Props) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const layer = useLayer(id);
|
||||
const promptLayerOpacity = useAppSelector((s) => s.regionalPrompts.promptLayerOpacity);
|
||||
const tool = useAppSelector((s) => s.regionalPrompts.tool);
|
||||
const layerRef = useRef<KonvaLayerType>(null);
|
||||
const groupRef = useRef<KonvaGroupType>(null);
|
||||
const onChangeBbox = useCallback(
|
||||
(bbox: IRect | null) => {
|
||||
dispatch(layerBboxChanged({ layerId: layer.id, bbox }));
|
||||
},
|
||||
[dispatch, layer.id]
|
||||
);
|
||||
|
||||
const onDragMove = useCallback(
|
||||
(e: KonvaEventObject<DragEvent>) => {
|
||||
// We must track the layer's coordinates to accurately position objects. For example, when drawing a line, the
|
||||
// mouse events are handled by the stage, but the line is drawn on the layer.
|
||||
dispatch(layerTranslated({ layerId: id, x: e.target.x(), y: e.target.y() }));
|
||||
},
|
||||
[dispatch, id]
|
||||
);
|
||||
|
||||
const dragBoundFunc = useCallback(function (this: KonvaNodeType<KonvaNodeConfigType>, pos: Vector2d) {
|
||||
const stage = getStage();
|
||||
const cursorPos = getScaledCursorPosition(stage);
|
||||
if (!cursorPos) {
|
||||
return this.getAbsolutePosition();
|
||||
}
|
||||
// This prevents the user from dragging the object out of the stage.
|
||||
if (cursorPos.x < 0 || cursorPos.x > stage.width() || cursorPos.y < 0 || cursorPos.y > stage.height()) {
|
||||
return this.getAbsolutePosition();
|
||||
}
|
||||
|
||||
return pos;
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!layerRef.current || tool !== 'move') {
|
||||
// This effectively makes the bbox only calculate as the tool is changed to 'move'.
|
||||
return;
|
||||
}
|
||||
if (layer.objects.length === 0) {
|
||||
// Reset the bbox when we have no objects.
|
||||
onChangeBbox(null);
|
||||
return;
|
||||
}
|
||||
// We could debounce this, remove the early return when the tool isn't move, and always show the bbox. For now,
|
||||
// it is only shown when we are using the move tool.
|
||||
onChangeBbox(getKonvaLayerBbox(layerRef.current, selectPromptLayerObjectGroup));
|
||||
}, [tool, layer.objects, onChangeBbox]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!groupRef.current) {
|
||||
return;
|
||||
}
|
||||
// Caching is not allowed for "empty" nodes. We must draw here to render the group instead. This is required
|
||||
// to clear the layer when the layer is reset and on first render, when the layer has no objects.
|
||||
if (layer.objects.length === 0) {
|
||||
groupRef.current.draw();
|
||||
return;
|
||||
}
|
||||
// Caching the group allows its opacity to apply to all shapes at once. We should cache only when the layer's
|
||||
// objects or attributes with a visual effect (e.g. color) change.
|
||||
// TODO: Figure out a more efficient way to handle opacity - maybe a separate rect w/ globalCompositeOperation...
|
||||
groupRef.current.cache();
|
||||
}, [layer.objects, layer.color, layer.isVisible]);
|
||||
|
||||
return (
|
||||
<KonvaLayer
|
||||
ref={layerRef}
|
||||
id={layer.id}
|
||||
name={REGIONAL_PROMPT_LAYER_NAME}
|
||||
onDragMove={onDragMove}
|
||||
dragBoundFunc={dragBoundFunc}
|
||||
visible={layer.isVisible}
|
||||
draggable
|
||||
>
|
||||
<KonvaGroup
|
||||
id={`layer-${layer.id}-group`}
|
||||
name={REGIONAL_PROMPT_LAYER_OBJECT_GROUP_NAME}
|
||||
ref={groupRef}
|
||||
listening={false}
|
||||
opacity={promptLayerOpacity}
|
||||
>
|
||||
{layer.objects.map((obj) => {
|
||||
if (obj.kind === 'line') {
|
||||
return <LineComponent key={obj.id} line={obj} color={layer.color} layerId={layer.id} />;
|
||||
}
|
||||
if (obj.kind === 'fillRect') {
|
||||
return <RectComponent key={obj.id} rect={obj} color={layer.color} />;
|
||||
}
|
||||
})}
|
||||
</KonvaGroup>
|
||||
<LayerBoundingBox layerId={layer.id} />
|
||||
</KonvaLayer>
|
||||
);
|
||||
});
|
||||
|
||||
LayerComponent.displayName = 'LayerComponent';
|
@ -1,31 +0,0 @@
|
||||
import { rgbColorToString } from 'features/canvas/util/colorToString';
|
||||
import type { LineObject } from 'features/regionalPrompts/store/regionalPromptsSlice';
|
||||
import { memo } from 'react';
|
||||
import type { RgbColor } from 'react-colorful';
|
||||
import { Line } from 'react-konva';
|
||||
|
||||
type Props = {
|
||||
layerId: string;
|
||||
line: LineObject;
|
||||
color: RgbColor;
|
||||
};
|
||||
|
||||
export const LineComponent = memo(({ layerId, line, color }: Props) => {
|
||||
return (
|
||||
<Line
|
||||
id={`layer-${layerId}.line-${line.id}`}
|
||||
key={line.id}
|
||||
points={line.points}
|
||||
strokeWidth={line.strokeWidth}
|
||||
stroke={rgbColorToString(color)}
|
||||
tension={0}
|
||||
lineCap="round"
|
||||
lineJoin="round"
|
||||
shadowForStrokeEnabled={false}
|
||||
globalCompositeOperation={line.tool === 'brush' ? 'source-over' : 'destination-out'}
|
||||
listening={false}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
LineComponent.displayName = 'LineComponent';
|
@ -1,26 +0,0 @@
|
||||
import { rgbColorToString } from 'features/canvas/util/colorToString';
|
||||
import type { FillRectObject } from 'features/regionalPrompts/store/regionalPromptsSlice';
|
||||
import { memo } from 'react';
|
||||
import type { RgbColor } from 'react-colorful';
|
||||
import { Rect } from 'react-konva';
|
||||
|
||||
type Props = {
|
||||
rect: FillRectObject;
|
||||
color: RgbColor;
|
||||
};
|
||||
|
||||
export const RectComponent = memo(({ rect, color }: Props) => {
|
||||
return (
|
||||
<Rect
|
||||
key={rect.id}
|
||||
x={rect.x}
|
||||
y={rect.y}
|
||||
width={rect.width}
|
||||
height={rect.height}
|
||||
fill={rgbColorToString(color)}
|
||||
listening={false}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
RectComponent.displayName = 'RectComponent';
|
@ -1,75 +0,0 @@
|
||||
import { chakra } from '@invoke-ai/ui-library';
|
||||
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
|
||||
import { useAppSelector } from 'app/store/storeHooks';
|
||||
import { BrushPreviewOutline } from 'features/regionalPrompts/components/BrushPreview';
|
||||
import { LayerComponent } from 'features/regionalPrompts/components/LayerComponent';
|
||||
import {
|
||||
useMouseDown,
|
||||
useMouseEnter,
|
||||
useMouseLeave,
|
||||
useMouseMove,
|
||||
useMouseUp,
|
||||
} from 'features/regionalPrompts/hooks/mouseEventHooks';
|
||||
import { $stage, selectRegionalPromptsSlice } from 'features/regionalPrompts/store/regionalPromptsSlice';
|
||||
import type Konva from 'konva';
|
||||
import { memo, useCallback, useMemo, useRef } from 'react';
|
||||
import { Layer, Stage } from 'react-konva';
|
||||
|
||||
const selectLayerIds = createMemoizedSelector(selectRegionalPromptsSlice, (regionalPrompts) =>
|
||||
regionalPrompts.layers.map((l) => l.id)
|
||||
);
|
||||
|
||||
const ChakraStage = chakra(Stage, {
|
||||
shouldForwardProp: (prop) => !['sx'].includes(prop),
|
||||
});
|
||||
|
||||
export const RegionalPromptsStage: React.FC = memo(() => {
|
||||
const layerIds = useAppSelector(selectLayerIds);
|
||||
const stageRef = useRef<Konva.Stage | null>(null);
|
||||
const width = useAppSelector((s) => s.generation.width);
|
||||
const height = useAppSelector((s) => s.generation.height);
|
||||
const tool = useAppSelector((s) => s.regionalPrompts.tool);
|
||||
const onMouseDown = useMouseDown(stageRef);
|
||||
const onMouseUp = useMouseUp(stageRef);
|
||||
const onMouseMove = useMouseMove(stageRef);
|
||||
const onMouseEnter = useMouseEnter(stageRef);
|
||||
const onMouseLeave = useMouseLeave(stageRef);
|
||||
const stageRefCallback = useCallback((el: Konva.Stage) => {
|
||||
$stage.set(el);
|
||||
stageRef.current = el;
|
||||
}, []);
|
||||
const sx = useMemo(
|
||||
() => ({
|
||||
borderRadius: 'base',
|
||||
borderWidth: 1,
|
||||
cursor: tool === 'move' ? 'default' : 'none',
|
||||
}),
|
||||
[tool]
|
||||
);
|
||||
|
||||
return (
|
||||
<ChakraStage
|
||||
ref={stageRefCallback}
|
||||
x={0}
|
||||
y={0}
|
||||
width={width}
|
||||
height={height}
|
||||
onMouseDown={onMouseDown}
|
||||
onMouseUp={onMouseUp}
|
||||
onMouseMove={onMouseMove}
|
||||
onMouseEnter={onMouseEnter}
|
||||
onMouseLeave={onMouseLeave}
|
||||
tabIndex={-1}
|
||||
sx={sx}
|
||||
>
|
||||
{layerIds.map((id) => (
|
||||
<LayerComponent key={id} id={id} />
|
||||
))}
|
||||
<Layer id="brushPreviewOutline">
|
||||
<BrushPreviewOutline />
|
||||
</Layer>
|
||||
</ChakraStage>
|
||||
);
|
||||
});
|
||||
|
||||
RegionalPromptsStage.displayName = 'RegionalPromptsStage';
|
@ -6,11 +6,9 @@ import {
|
||||
$cursorPosition,
|
||||
layerBboxChanged,
|
||||
layerTranslated,
|
||||
REGIONAL_PROMPT_LAYER_OBJECT_GROUP_NAME,
|
||||
selectRegionalPromptsSlice,
|
||||
} from 'features/regionalPrompts/store/regionalPromptsSlice';
|
||||
import Konva from 'konva';
|
||||
import type { Node, NodeConfig } from 'konva/lib/Node';
|
||||
import type { IRect } from 'konva/lib/types';
|
||||
import { atom } from 'nanostores';
|
||||
import { useCallback, useLayoutEffect } from 'react';
|
||||
@ -18,10 +16,7 @@ import { useCallback, useLayoutEffect } from 'react';
|
||||
import { useMouseDown, useMouseEnter, useMouseLeave, useMouseMove, useMouseUp } from './mouseEventHooks';
|
||||
import { renderBbox, renderBrushPreview, renderLayers } from './renderers';
|
||||
|
||||
export const $stage = atom<Konva.Stage | null>(null);
|
||||
|
||||
export const selectPromptLayerObjectGroup = (item: Node<NodeConfig>) =>
|
||||
item.name() !== REGIONAL_PROMPT_LAYER_OBJECT_GROUP_NAME;
|
||||
const $stage = atom<Konva.Stage | null>(null);
|
||||
|
||||
const selectSelectedLayerColor = createMemoizedSelector(selectRegionalPromptsSlice, (regionalPrompts) => {
|
||||
return regionalPrompts.layers.find((l) => l.id === regionalPrompts.selectedLayer)?.color;
|
||||
|
@ -1,22 +0,0 @@
|
||||
import type Konva from 'konva';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { Stage } from 'react-konva';
|
||||
|
||||
export const StageWrapper = () => {
|
||||
const [stage, setStage] = useState<Konva.Stage | null>(null);
|
||||
const stageRefCallback = useCallback(
|
||||
(el: Konva.Stage | null) => {
|
||||
setStage(el);
|
||||
},
|
||||
[setStage]
|
||||
);
|
||||
useEffect(() => {
|
||||
if (!stage) {
|
||||
return;
|
||||
}
|
||||
|
||||
// do something with stage
|
||||
}, [stage]);
|
||||
|
||||
return <Stage ref={stageRefCallback} />;
|
||||
};
|
Loading…
Reference in New Issue
Block a user