You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.1 KiB
166 lines
4.1 KiB
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!"); |
|
}; |
|
} |
|
}); |