Spaces:
Runtime error
Runtime error
| 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})`; | |
| }; | |
| } | |
| }; | |
| } |