mirror of
https://git.datalinker.icu/kijai/ComfyUI-KJNodes.git
synced 2025-12-09 21:04:41 +08:00
95 lines
2.8 KiB
JavaScript
95 lines
2.8 KiB
JavaScript
const { app } = window.comfyAPI.app;
|
|
|
|
//from melmass
|
|
export function makeUUID() {
|
|
let dt = new Date().getTime()
|
|
const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
const r = ((dt + Math.random() * 16) % 16) | 0
|
|
dt = Math.floor(dt / 16)
|
|
return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16)
|
|
})
|
|
return uuid
|
|
}
|
|
|
|
function chainCallback(object, property, callback) {
|
|
if (object == undefined) {
|
|
//This should not happen.
|
|
console.error("Tried to add callback to non-existant object")
|
|
return;
|
|
}
|
|
if (property in object) {
|
|
const callback_orig = object[property]
|
|
object[property] = function () {
|
|
const r = callback_orig.apply(this, arguments);
|
|
callback.apply(this, arguments);
|
|
return r
|
|
};
|
|
} else {
|
|
object[property] = callback;
|
|
}
|
|
}
|
|
app.registerExtension({
|
|
name: 'KJNodes.FastPreview',
|
|
|
|
async beforeRegisterNodeDef(nodeType, nodeData) {
|
|
if (nodeData?.name === 'FastPreview') {
|
|
chainCallback(nodeType.prototype, "onNodeCreated", function () {
|
|
|
|
var element = document.createElement("div");
|
|
this.uuid = makeUUID()
|
|
element.id = `fast-preview-${this.uuid}`
|
|
|
|
this.previewWidget = this.addDOMWidget(nodeData.name, "FastPreviewWidget", element, {
|
|
serialize: false,
|
|
hideOnZoom: false,
|
|
});
|
|
|
|
this.previewer = new Previewer(this);
|
|
|
|
this.setSize([550, 550]);
|
|
this.resizable = false;
|
|
this.previewWidget.parentEl = document.createElement("div");
|
|
this.previewWidget.parentEl.className = "fast-preview";
|
|
this.previewWidget.parentEl.id = `fast-preview-${this.uuid}`
|
|
element.appendChild(this.previewWidget.parentEl);
|
|
|
|
chainCallback(this, "onExecuted", function (message) {
|
|
let bg_image = message["bg_image"];
|
|
this.properties.imgData = {
|
|
name: "bg_image",
|
|
base64: bg_image
|
|
};
|
|
this.previewer.refreshBackgroundImage(this);
|
|
});
|
|
|
|
|
|
}); // onAfterGraphConfigured
|
|
}//node created
|
|
} //before register
|
|
})//register
|
|
|
|
class Previewer {
|
|
constructor(context) {
|
|
this.node = context;
|
|
this.previousWidth = null;
|
|
this.previousHeight = null;
|
|
}
|
|
refreshBackgroundImage = () => {
|
|
const imgData = this.node?.properties?.imgData;
|
|
if (imgData?.base64) {
|
|
const base64String = imgData.base64;
|
|
const imageUrl = `data:${imgData.type};base64,${base64String}`;
|
|
const img = new Image();
|
|
img.src = imageUrl;
|
|
img.onload = () => {
|
|
const { width, height } = img;
|
|
if (width !== this.previousWidth || height !== this.previousHeight) {
|
|
this.node.setSize([width, height]);
|
|
this.previousWidth = width;
|
|
this.previousHeight = height;
|
|
}
|
|
this.node.previewWidget.element.style.backgroundImage = `url(${imageUrl})`;
|
|
};
|
|
}
|
|
};
|
|
} |