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