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
2 years ago
|
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!");
|
||
|
};
|
||
|
}
|
||
|
});
|