aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/imageEditor/ImageEditor.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/imageEditor/ImageEditor.tsx')
-rw-r--r--src/client/views/nodes/imageEditor/ImageEditor.tsx91
1 files changed, 42 insertions, 49 deletions
diff --git a/src/client/views/nodes/imageEditor/ImageEditor.tsx b/src/client/views/nodes/imageEditor/ImageEditor.tsx
index 6b1d05031..657e689bb 100644
--- a/src/client/views/nodes/imageEditor/ImageEditor.tsx
+++ b/src/client/views/nodes/imageEditor/ImageEditor.tsx
@@ -90,18 +90,8 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
* @param type The new tool type we are changing to
*/
const changeTool = (type: ImageToolType) => {
- switch (type) {
- case ImageToolType.GenerativeFill:
- setCurrTool(genFillTool);
- setCursorData(prev => ({ ...prev, width: genFillTool.sliderDefault as number }));
- break;
- case ImageToolType.Cut:
- setCurrTool(cutTool);
- setCursorData(prev => ({ ...prev, width: cutTool.sliderDefault as number }));
- break;
- default:
- break;
- }
+ setCurrToolType(type);
+ setCursorData(prev => ({ ...prev, width: currTool().sliderDefault as number }));
};
// Undo and Redo
const handleUndo = () => {
@@ -171,9 +161,8 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
// handles brushing on pointer movement
useEffect(() => {
- if (!isBrushing) return undefined;
const canvas = canvasRef.current;
- if (!canvas) return undefined;
+ if (!isBrushing || !canvas) return undefined;
const ctx = ImageUtility.getCanvasContext(canvasRef);
if (!ctx) return undefined;
@@ -188,33 +177,29 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
};
drawingAreaRef.current?.addEventListener('pointermove', handlePointerMove);
- return () => {
- drawingAreaRef.current?.removeEventListener('pointermove', handlePointerMove);
- };
+ return () => drawingAreaRef.current?.removeEventListener('pointermove', handlePointerMove);
}, [isBrushing]);
// first load
useEffect(() => {
- const loadInitial = async () => {
- if (!imageEditorSource || imageEditorSource === '') return;
- const img = new Image();
- const res = await ImageUtility.urlToBase64(imageEditorSource);
- if (!res) return;
- img.src = `data:image/png;base64,${res}`;
-
- img.onload = () => {
- currImg.current = img;
- originalImg.current = img;
- const imgWidth = img.naturalWidth;
- const imgHeight = img.naturalHeight;
- const scale = Math.min(canvasSize / imgWidth, canvasSize / imgHeight);
- const width = imgWidth * scale;
- const height = imgHeight * scale;
- setCanvasDims({ width, height });
- };
- };
-
- loadInitial();
+ if (imageEditorSource && imageEditorSource) {
+ ImageUtility.urlToBase64(imageEditorSource).then(res => {
+ if (res) {
+ const img = new Image();
+ img.src = `data:image/png;base64,${res}`;
+ img.onload = () => {
+ currImg.current = img;
+ originalImg.current = img;
+ const imgWidth = img.naturalWidth;
+ const imgHeight = img.naturalHeight;
+ const scale = Math.min(canvasSize / imgWidth, canvasSize / imgHeight);
+ const width = imgWidth * scale;
+ const height = imgHeight * scale;
+ setCanvasDims({ width, height });
+ };
+ }
+ });
+ }
// cleanup
return () => {
@@ -300,7 +285,7 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
if (!canvasMask) return;
const maskBlob = await ImageUtility.canvasToBlob(canvasMask);
const imgBlob = await ImageUtility.canvasToBlob(canvasOriginalImg);
- const res = await ImageUtility.getEdit(imgBlob, maskBlob, input !== '' ? input + ' in the same style' : 'Fill in the image in the same style', 2);
+ const res = await ImageUtility.getEdit(imgBlob, maskBlob, input || 'Fill in the image in the same style', 2);
// create first image
if (!newCollectionRef.current) {
@@ -569,11 +554,15 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
setIsFirstDoc(true);
};
+ function currTool() {
+ return imageEditTools.find(tool => tool.type === currToolType) ?? genFillTool;
+ }
+
// defines the tools and sets current tool
- const genFillTool: ImageEditTool = { type: ImageToolType.GenerativeFill, name: 'Generative Fill', btnText: 'GET EDITS', icon: 'fill', applyFunc: getEdit, sliderMin: 25, sliderMax: 500, sliderDefault: 150 };
- const cutTool: ImageEditTool = { type: ImageToolType.Cut, name: 'Cut', btnText: 'CUT IMAGE', icon: 'scissors', applyFunc: cutImage, sliderMin: 1, sliderMax: 50, sliderDefault: 5 };
+ const genFillTool: ImageEditTool = { type: ImageToolType.GenerativeFill, btnText: 'GET EDITS', icon: 'fill', applyFunc: getEdit, sliderMin: 25, sliderMax: 500, sliderDefault: 150 };
+ const cutTool: ImageEditTool = { type: ImageToolType.Cut, btnText: 'CUT IMAGE', icon: 'scissors', applyFunc: cutImage, sliderMin: 1, sliderMax: 50, sliderDefault: 5 };
const imageEditTools: ImageEditTool[] = [genFillTool, cutTool];
- const [currTool, setCurrTool] = useState<ImageEditTool>(genFillTool);
+ const [currToolType, setCurrToolType] = useState<ImageToolType>(ImageToolType.GenerativeFill);
// the top controls for making a new collection, resetting, and applying edits,
function renderControls() {
@@ -595,7 +584,7 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
labelPlacement="end"
sx={{ whiteSpace: 'nowrap' }}
/>
- <ApplyFuncButtons onClick={() => currTool.applyFunc(cutType, cursorData.width, edits, isFirstDoc)} loading={loading} onReset={handleReset} btnText={currTool.btnText} />
+ <ApplyFuncButtons onClick={() => currTool().applyFunc(cutType, cursorData.width, edits, isFirstDoc)} loading={loading} onReset={handleReset} btnText={currTool().btnText} />
<IconButton color={activeColor} tooltip="close" icon={<CgClose size="16px" />} onClick={handleViewClose} />
</div>
</div>
@@ -607,8 +596,8 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
return (
<div className="sideControlsContainer" style={{ backgroundColor: bgColor }}>
<div className="sideControls">
- <div className="imageToolsContainer">{imageEditTools.map(tool => ImageToolButton(tool, tool.type === currTool.type, changeTool))}</div>
- {currTool.type == ImageToolType.Cut && (
+ <div className="imageToolsContainer">{imageEditTools.map(tool => ImageToolButton(tool, tool.type === currTool().type, changeTool))}</div>
+ {currTool().type == ImageToolType.Cut && (
<div className="cutToolsContainer">
<Button style={{ width: '100%' }} text="Keep in" type={Type.TERT} color={cutType == CutMode.IN ? SettingsManager.userColor : bgColor} onClick={() => setCutType(CutMode.IN)} />
<Button style={{ width: '100%' }} text="Keep out" type={Type.TERT} color={cutType == CutMode.OUT ? SettingsManager.userColor : bgColor} onClick={() => setCutType(CutMode.OUT)} />
@@ -617,11 +606,13 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
</div>
)}
<div className="sliderContainer" onPointerDown={e => e.stopPropagation()}>
- {currTool.type === ImageToolType.GenerativeFill && (
+ {currTool().type === ImageToolType.GenerativeFill && (
<Slider
sx={{
'& input[type="range"]': {
- WebkitAppearance: 'slider-vertical',
+ writingMode: 'vertical-lr',
+ direction: 'rtl',
+ // WebkitAppearance: 'slider-vertical',
},
}}
orientation="vertical"
@@ -633,11 +624,13 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
onChange={(e, val) => setCursorData(prev => ({ ...prev, width: val as number }))}
/>
)}
- {currTool.type === ImageToolType.Cut && (
+ {currTool().type === ImageToolType.Cut && (
<Slider
sx={{
'& input[type="range"]': {
- WebkitAppearance: 'slider-vertical',
+ writingMode: 'vertical-lr',
+ direction: 'rtl',
+ // WebkitAppearance: 'slider-vertical',
},
}}
orientation="vertical"
@@ -780,7 +773,7 @@ const ImageEditor = ({ imageEditorOpen, imageEditorSource, imageRootDoc, addDoc
{renderSideIcons()}
{renderEditThumbnails()}
</div>
- {currTool.type === ImageToolType.GenerativeFill && renderPromptBox()}
+ {currTool().type === ImageToolType.GenerativeFill && renderPromptBox()}
</div>
);
};