|
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})`; |
|
}; |
|
} |
|
}; |
|
} |