81 lines
3.2 KiB
JavaScript
81 lines
3.2 KiB
JavaScript
export class RemoveBgManager {
|
|
constructor(node, maskManager) {
|
|
this.node = node;
|
|
this.maskManager = maskManager;
|
|
this.button = null; // Référence au bouton pour le feedback visuel
|
|
}
|
|
|
|
async performRemoveBg() {
|
|
const activeLayer = this.maskManager.getActiveLayer();
|
|
if (!activeLayer) return;
|
|
const layerIndex = activeLayer.index;
|
|
const layerName = activeLayer.name;
|
|
const previewInfo = this.node.preview_data?.[layerName];
|
|
const sourceFilename = previewInfo?.filename;
|
|
|
|
if (!sourceFilename) {
|
|
alert("Erreur : Impossible de trouver le nom du fichier source.");
|
|
return;
|
|
}
|
|
|
|
if (this.button) {
|
|
this.button.textContent = "Traitement...";
|
|
this.button.disabled = true;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch("/layersystem/remove_bg", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ filename: sourceFilename, layer_index_str: String(layerIndex)}),
|
|
});
|
|
|
|
if (!response.ok) throw new Error(`Erreur du serveur : ${await response.text()}`);
|
|
|
|
const newMasks = await response.json();
|
|
const previewMaskDetails = newMasks.preview_mask_details;
|
|
const renderMaskDetails = newMasks.render_mask_details;
|
|
|
|
// --- On distribue les masques à la bonne destination ---
|
|
|
|
// 1. Pour le BACKEND : on stocke les détails du masque de RENDU (noir/blanc)
|
|
const layerProps = this.node.layer_properties[layerName];
|
|
layerProps.internal_mask_filename = renderMaskDetails.name;
|
|
layerProps.internal_mask_details = renderMaskDetails;
|
|
layerProps.internal_preview_mask_details = previewMaskDetails;
|
|
layerProps.mask_last_update = Date.now();
|
|
// On ne touche PAS au toggle, il reste à sa valeur manuelle.
|
|
this.node.updatePropertiesJSON();
|
|
|
|
// 2. Pour la PREVIEW LIVE : on charge le masque de PREVIEW (blanc/noir)
|
|
const previewMaskUrl = new URL("/view", window.location.origin);
|
|
previewMaskUrl.searchParams.set("filename", previewMaskDetails.name);
|
|
previewMaskUrl.searchParams.set("type", previewMaskDetails.type);
|
|
previewMaskUrl.searchParams.set("subfolder", previewMaskDetails.subfolder);
|
|
|
|
previewMaskUrl.searchParams.set("t", layerProps.mask_last_update);
|
|
|
|
const newMaskImage = new Image();
|
|
newMaskImage.crossOrigin = "anonymous";
|
|
newMaskImage.src = previewMaskUrl.href;
|
|
await new Promise((r, rj) => { newMaskImage.onload = r; newMaskImage.onerror = rj; });
|
|
|
|
const maskName = `mask_${activeLayer.index}`;
|
|
if (this.node.loaded_preview_images) {
|
|
this.node.loaded_preview_images[maskName] = newMaskImage;
|
|
}
|
|
|
|
this.maskManager.show();
|
|
this.node.redrawPreviewCanvas();
|
|
|
|
} catch (error) {
|
|
console.error("[LayerSystem] Erreur lors du Remove BG:", error);
|
|
alert(`Une erreur est survenue lors du Remove BG: ${error.message}`);
|
|
} finally {
|
|
if (this.button) {
|
|
this.button.textContent = "Remove BG";
|
|
this.button.disabled = false;
|
|
}
|
|
}
|
|
}
|
|
} |