147 lines
4.7 KiB
JavaScript
147 lines
4.7 KiB
JavaScript
export const CONVERTED_TYPE = "converted-widget"
|
|
|
|
export function hideWidgetForGood(node, widget, suffix = "") {
|
|
widget.origType = widget.type
|
|
widget.origComputeSize = widget.computeSize
|
|
widget.computeSize = () => [0, -4] // -4 is due to the gap litegraph adds between widgets automatically
|
|
widget.type = CONVERTED_TYPE + suffix
|
|
|
|
// Hide any linked widgets, e.g. seed+seedControl
|
|
if (widget.linkedWidgets) {
|
|
for (const w of widget.linkedWidgets) {
|
|
hideWidgetForGood(node, w, ":" + widget.name)
|
|
}
|
|
}
|
|
}
|
|
|
|
const doesInputWithNameExist = (node, name) => {
|
|
return node.inputs ? node.inputs.some(input => input.name === name) : false
|
|
}
|
|
|
|
const HIDDEN_TAG = "tschide"
|
|
const origProps = {}
|
|
|
|
// Toggle Widget + change size
|
|
export function toggleWidget(node, widget, show = false, suffix = "", updateSize = true) {
|
|
if (!widget || doesInputWithNameExist(node, widget.name)) return
|
|
|
|
// Store the original properties of the widget if not already stored
|
|
if (!origProps[widget.name]) {
|
|
origProps[widget.name] = {
|
|
origType: widget.type,
|
|
origComputeSize: widget.computeSize,
|
|
}
|
|
}
|
|
|
|
const origSize = node.size
|
|
|
|
// Set the widget type and computeSize based on the show flag
|
|
widget.type = show ? origProps[widget.name].origType : HIDDEN_TAG + suffix
|
|
widget.computeSize = show ? origProps[widget.name].origComputeSize : () => [0, -4]
|
|
|
|
// Recursively handle linked widgets if they exist
|
|
widget.linkedWidgets?.forEach(w => toggleWidget(node, w, ":" + widget.name, show))
|
|
|
|
// Calculate the new height for the node based on its computeSize method
|
|
if (updateSize) {
|
|
const newHeight = node.computeSize()[1]
|
|
node.setSize([node.size[0], newHeight])
|
|
}
|
|
}
|
|
|
|
export function addWidgetChangeCallback(widget, callback) {
|
|
let widgetValue = widget.value
|
|
let originalDescriptor = Object.getOwnPropertyDescriptor(widget, "value")
|
|
Object.defineProperty(widget, "value", {
|
|
get() {
|
|
return originalDescriptor && originalDescriptor.get ? originalDescriptor.get.call(widget) : widgetValue
|
|
},
|
|
set(newVal) {
|
|
if (originalDescriptor && originalDescriptor.set) {
|
|
originalDescriptor.set.call(widget, newVal)
|
|
} else {
|
|
widgetValue = newVal
|
|
}
|
|
|
|
callback(newVal)
|
|
},
|
|
})
|
|
}
|
|
|
|
export 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
|
|
}
|
|
}
|
|
|
|
export function addKVState(nodeType) {
|
|
chainCallback(nodeType.prototype, "onNodeCreated", function () {
|
|
chainCallback(this, "onConfigure", function (info) {
|
|
if (!this.widgets) {
|
|
//Node has no widgets, there is nothing to restore
|
|
return
|
|
}
|
|
if (typeof info.widgets_values != "object") {
|
|
//widgets_values is in some unknown inactionable format
|
|
return
|
|
}
|
|
let widgetDict = info.widgets_values
|
|
if (widgetDict.length == undefined) {
|
|
for (let w of this.widgets) {
|
|
if (w.name in widgetDict) {
|
|
w.value = widgetDict[w.name]
|
|
if (w.type !== "button") {
|
|
w.callback?.(w.value)
|
|
}
|
|
} else {
|
|
//attempt to restore default value
|
|
let inputs = LiteGraph.getNodeType(this.type).nodeData.input
|
|
let initialValue = null
|
|
if (inputs?.required?.hasOwnProperty(w.name)) {
|
|
if (inputs.required[w.name][1]?.hasOwnProperty("default")) {
|
|
initialValue = inputs.required[w.name][1].default
|
|
} else if (inputs.required[w.name][0].length) {
|
|
initialValue = inputs.required[w.name][0][0]
|
|
}
|
|
} else if (inputs?.optional?.hasOwnProperty(w.name)) {
|
|
if (inputs.optional[w.name][1]?.hasOwnProperty("default")) {
|
|
initialValue = inputs.optional[w.name][1].default
|
|
} else if (inputs.optional[w.name][0].length) {
|
|
initialValue = inputs.optional[w.name][0][0]
|
|
}
|
|
}
|
|
if (initialValue) {
|
|
w.value = initialValue
|
|
if (w.type !== "button") {
|
|
w.callback?.(w.value)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
chainCallback(this, "onSerialize", function (info) {
|
|
info.widgets_values = {}
|
|
if (!this.widgets) {
|
|
//object has no widgets, there is nothing to store
|
|
return
|
|
}
|
|
for (let w of this.widgets) {
|
|
info.widgets_values[w.name] = w.value
|
|
}
|
|
})
|
|
})
|
|
}
|