aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/ImageBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/ImageBox.tsx')
-rw-r--r--src/client/views/nodes/ImageBox.tsx111
1 files changed, 53 insertions, 58 deletions
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 114d5226b..a7dd5de15 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -1,7 +1,6 @@
import { Button, Colors, Size, Type } from '@dash/components';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Slider, Tooltip } from '@mui/material';
-import { DimensionField } from '../../../fields/DimensionField';
import axios from 'axios';
import { action, computed, IReactionDisposer, makeObservable, observable, ObservableMap, reaction } from 'mobx';
import { observer } from 'mobx-react';
@@ -359,32 +358,31 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
processOutpainting = async () => {
const field = Cast(this.dataDoc[this.fieldKey], ImageField);
if (!field) return;
-
+
const origWidth = NumCast(this.Document._outpaintingOriginalWidth);
const origHeight = NumCast(this.Document._outpaintingOriginalHeight);
-
+
if (!origWidth || !origHeight) {
- console.error("Original dimensions (_outpaintingOriginalWidth/_outpaintingOriginalHeight) not set. Ensure resizeViewForOutpainting was called first.");
+ console.error('Original dimensions (_outpaintingOriginalWidth/_outpaintingOriginalHeight) not set. Ensure resizeViewForOutpainting was called first.');
return;
}
-
+
//alert(`Original dimensions: ${origWidth} x ${origHeight}`);
-
-
+
// Set flag that outpainting is in progress
this._outpaintingInProgress = true;
-
+
try {
// Get the current path to the image
const currentPath = this.choosePath(field.url);
-
+
// Get original and new dimensions for calculating mask
const newWidth = NumCast(this.Document._width);
const newHeight = NumCast(this.Document._height);
-
+
// Optional: Ask user for a prompt to guide the outpainting
- let prompt = "Extend this image naturally with matching content";
- const customPrompt = await new Promise<string>((resolve) => {
+ let prompt = 'Extend this image naturally with matching content';
+ const customPrompt = await new Promise<string>(resolve => {
const dialog = document.createElement('div');
Object.assign(dialog.style, {
position: 'fixed',
@@ -395,16 +393,16 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
padding: '20px',
borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0,0,0,0.2)',
- zIndex: '10000'
+ zIndex: '10000',
});
-
+
const title = document.createElement('h3');
title.style.marginTop = '0';
title.textContent = 'Outpaint Image';
-
+
const description = document.createElement('p');
description.textContent = 'Enter a prompt for extending the image:';
-
+
const input = document.createElement('input');
input.id = 'outpaint-prompt';
input.type = 'text';
@@ -412,50 +410,50 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
Object.assign(input.style, {
width: '300px',
padding: '8px',
- marginBottom: '10px'
+ marginBottom: '10px',
});
-
+
const buttonContainer = document.createElement('div');
Object.assign(buttonContainer.style, {
display: 'flex',
justifyContent: 'flex-end',
- gap: '10px'
+ gap: '10px',
});
-
+
const cancelButton = document.createElement('button');
cancelButton.textContent = 'Cancel';
-
+
const confirmButton = document.createElement('button');
confirmButton.textContent = 'Generate';
Object.assign(confirmButton.style, {
background: '#0078d4',
color: 'white',
border: 'none',
- padding: '8px 16px'
+ padding: '8px 16px',
});
-
+
buttonContainer.appendChild(cancelButton);
buttonContainer.appendChild(confirmButton);
-
+
dialog.appendChild(title);
dialog.appendChild(description);
dialog.appendChild(input);
dialog.appendChild(buttonContainer);
-
+
document.body.appendChild(dialog);
-
+
cancelButton.onclick = () => {
document.body.removeChild(dialog);
- resolve("");
+ resolve('');
};
-
+
confirmButton.onclick = () => {
const promptValue = input.value;
document.body.removeChild(dialog);
resolve(promptValue);
};
});
-
+
// If user cancelled, reset dimensions to original
if (!customPrompt) {
this.Document._width = origWidth;
@@ -463,7 +461,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
this._outpaintingInProgress = false;
return;
}
-
+
// Show loading indicator
const loadingOverlay = document.createElement('div');
loadingOverlay.style.position = 'absolute';
@@ -477,52 +475,50 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
loadingOverlay.style.alignItems = 'center';
loadingOverlay.innerHTML = '<div style="color: white; font-size: 16px;">Generating outpainted image...</div>';
this._mainCont?.appendChild(loadingOverlay);
-
+
// Call the outpaint API
- const response = await Networking.PostToServer('/outpaintImageFour', {
+ const response = await Networking.PostToServer('/outpaintImage', {
imageUrl: currentPath,
prompt: customPrompt,
originalDimensions: {
width: origWidth,
- height: origHeight
+ height: origHeight,
},
newDimensions: {
width: newWidth,
- height: newHeight
- }
+ height: newHeight,
+ },
});
if (response && typeof response === 'object' && 'url' in response && typeof response.url === 'string') {
- console.log("Response is valid and contains URL:", response.url);
-
+ console.log('Response is valid and contains URL:', response.url);
} else {
- console.error("Unexpected API response:", response);
- alert("Failed to receive a valid image URL from server.");
+ console.error('Unexpected API response:', response);
+ alert('Failed to receive a valid image URL from server.');
}
-
-
+
if (response && 'url' in response && typeof response.url === 'string') {
// Save the original image as an alternate
if (!this.dataDoc[this.fieldKey + '_alternates']) {
this.dataDoc[this.fieldKey + '_alternates'] = new List<Doc>();
}
-
+
// Create a copy of the current image as an alternate
const originalDoc = Docs.Create.ImageDocument(field.url.href, {
title: `Original: ${this.Document.title}`,
_nativeWidth: Doc.NativeWidth(this.dataDoc),
- _nativeHeight: Doc.NativeHeight(this.dataDoc)
+ _nativeHeight: Doc.NativeHeight(this.dataDoc),
});
-
+
// Add to alternates
Doc.AddDocToList(this.dataDoc, this.fieldKey + '_alternates', originalDoc);
-
+
// Update the image with the outpainted version
this.dataDoc[this.fieldKey] = new ImageField(response.url);
-
+
// Update native dimensions
Doc.SetNativeWidth(this.dataDoc, newWidth);
Doc.SetNativeHeight(this.dataDoc, newHeight);
-
+
// Add AI metadata
this.Document.ai = true;
this.Document.ai_outpainted = true;
@@ -531,18 +527,17 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
// If failed, revert to original dimensions
this.Document._width = origWidth;
this.Document._height = origHeight;
- alert("Failed to outpaint image. Please try again.");
+ alert('Failed to outpaint image. Please try again.');
}
-
+
// Remove loading overlay
this._mainCont?.removeChild(loadingOverlay);
-
} catch (error) {
- console.error("Error during outpainting:", error);
+ console.error('Error during outpainting:', error);
// Revert to original dimensions on error
- this.Document._width = origWidth
- this.Document._height = origHeight
- alert("An error occurred while outpainting. Please try again.");
+ this.Document._width = origWidth;
+ this.Document._height = origHeight;
+ alert('An error occurred while outpainting. Please try again.');
} finally {
// Clear the outpainting flags
this._outpaintingInProgress = false;
@@ -608,12 +603,12 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
icon: this.Document.savedAsSticker ? 'clipboard-check' : 'file-arrow-down',
});
// Add new outpainting option
- funcs.push({
- description: 'Outpaint Image',
+ funcs.push({
+ description: 'Outpaint Image',
event: () => {
this.processOutpainting();
- },
- icon: 'brush'
+ },
+ icon: 'brush',
});
// Add outpainting history option if the image was outpainted
this.Document.ai_outpainted &&