Spaces:
Running
on
L40S
Running
on
L40S
import { app } from '../../../scripts/app.js' | |
//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})`; | |
}; | |
} | |
}; | |
} |