import { app } from "/scripts/app.js"; import { ComfyDialog, $el } from "/scripts/ui.js"; import { ComfyApp } from "/scripts/app.js"; export class ClipspaceDialog extends ComfyDialog { static items = []; static instance = null; static registerButton(name, contextPredicate, callback) { const item = $el("button", { type: "button", textContent: name, contextPredicate: contextPredicate, onclick: callback }) ClipspaceDialog.items.push(item); } static invalidatePreview() { if(ComfyApp.clipspace && ComfyApp.clipspace.imgs && ComfyApp.clipspace.imgs.length > 0) { const img_preview = document.getElementById("clipspace_preview"); if(img_preview) { img_preview.src = ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src; img_preview.style.maxHeight = "100%"; img_preview.style.maxWidth = "100%"; } } } static invalidate() { if(ClipspaceDialog.instance) { const self = ClipspaceDialog.instance; // allow reconstruct controls when copying from non-image to image content. const children = $el("div.comfy-modal-content", [ self.createImgSettings(), ...self.createButtons() ]); if(self.element) { // update self.element.removeChild(self.element.firstChild); self.element.appendChild(children); } else { // new self.element = $el("div.comfy-modal", { parent: document.body }, [children,]); } if(self.element.children[0].children.length <= 1) { self.element.children[0].appendChild($el("p", {}, ["Unable to find the features to edit content of a format stored in the current Clipspace."])); } ClipspaceDialog.invalidatePreview(); } } constructor() { super(); } createButtons(self) { const buttons = []; for(let idx in ClipspaceDialog.items) { const item = ClipspaceDialog.items[idx]; if(!item.contextPredicate || item.contextPredicate()) buttons.push(ClipspaceDialog.items[idx]); } buttons.push( $el("button", { type: "button", textContent: "Close", onclick: () => { this.close(); } }) ); return buttons; } createImgSettings() { if(ComfyApp.clipspace.imgs) { const combo_items = []; const imgs = ComfyApp.clipspace.imgs; for(let i=0; i < imgs.length; i++) { combo_items.push($el("option", {value:i}, [`${i}`])); } const combo1 = $el("select", {id:"clipspace_img_selector", onchange:(event) => { ComfyApp.clipspace['selectedIndex'] = event.target.selectedIndex; ClipspaceDialog.invalidatePreview(); } }, combo_items); const row1 = $el("tr", {}, [ $el("td", {}, [$el("font", {color:"white"}, ["Select Image"])]), $el("td", {}, [combo1]) ]); const combo2 = $el("select", {id:"clipspace_img_paste_mode", onchange:(event) => { ComfyApp.clipspace['img_paste_mode'] = event.target.value; } }, [ $el("option", {value:'selected'}, 'selected'), $el("option", {value:'all'}, 'all') ]); combo2.value = ComfyApp.clipspace['img_paste_mode']; const row2 = $el("tr", {}, [ $el("td", {}, [$el("font", {color:"white"}, ["Paste Mode"])]), $el("td", {}, [combo2]) ]); const td = $el("td", {align:'center', width:'100px', height:'100px', colSpan:'2'}, [ $el("img",{id:"clipspace_preview", ondragstart:() => false},[]) ]); const row3 = $el("tr", {}, [td]); return $el("table", {}, [row1, row2, row3]); } else { return []; } } createImgPreview() { if(ComfyApp.clipspace.imgs) { return $el("img",{id:"clipspace_preview", ondragstart:() => false}); } else return []; } show() { const img_preview = document.getElementById("clipspace_preview"); ClipspaceDialog.invalidate(); this.element.style.display = "block"; } } app.registerExtension({ name: "Comfy.Clipspace", init(app) { app.openClipspace = function () { if(!ClipspaceDialog.instance) { ClipspaceDialog.instance = new ClipspaceDialog(app); ComfyApp.clipspace_invalidate_handler = ClipspaceDialog.invalidate; } if(ComfyApp.clipspace) { ClipspaceDialog.instance.show(); } else app.ui.dialog.show("Clipspace is Empty!"); }; } });