Files
2025-01-22 07:31:27 +08:00

152 lines
6.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { app } from "../../../scripts/app.js";
import { ComfyWidgets } from "../../../scripts/widgets.js";
app.registerExtension({
name: "PaintingCoder.ShowTextPlus",
async beforeRegisterNodeDef(nodeType, nodeData, app) {
// console.log("[ShowTextPlus] Registering node:", nodeData.name);
if (nodeData.name === "ShowTextPlus" || nodeData.name === "PaintingCoder::ShowTextPlus") {
function populate(text) {
// console.log("[ShowTextPlus] Populating with:", text);
// 清理现有widgets(保留第一个输入框和显示开关)
if (this.widgets) {
// 从第三个开始删除
for (let i = 2; i < this.widgets.length; i++) {
this.widgets[i].onRemove?.();
}
this.widgets.length = 2;
}
// 处理文本数组
const v = Array.isArray(text) ? text : [...text]; // 确保 text 是数组
if (v.length > 0 && !v[0]) { // 处理第一个元素为空字符串的情况
v.shift();
}
// 获取显示开关状态
const showOutput = this.widgets[1].value;
// 为每个文本创建widget
v.forEach((list, index) => {
// 跳过值为 "true" 的情况
if (list === true || list === "" || list === null || list === undefined || list === false) {
return;
}
// console.log(`[ShowTextPlus] Creating widget ${index + 1} for:`, list);
const w = ComfyWidgets["STRING"](
this,
`text_output_${index}`, // 为每个文本输出widget设置不同的name
["STRING", { multiline: true }],
app
).widget;
w.inputEl.readOnly = true;
w.inputEl.style.opacity = 0.6;
w.value = list;
// 根据开关状态设置显示
updateWidgetDisplay(w, showOutput);
});
// 调整节点大小
requestAnimationFrame(() => {
adjustNodeSize.call(this);
});
}
function updateWidgetDisplay(widget, show) {
if (widget && widget.inputEl) {
widget.inputEl.style.display = show ? "block" : "none";
widget.inputEl.style.visibility = show ? "visible" : "hidden";
// 尝试手动触发大小计算
if (!show) {
widget.inputEl.style.height = "0px"
widget.inputEl.style.padding = "0px";
// 设置高度为 0, 并移除padding
} else {
widget.inputEl.style.height = "";
widget.inputEl.style.padding = "";
}
// 动态计算并设置文本框的高度,修复高度设置为0px之后不能完全展开的问题
requestAnimationFrame(() => {
if (show) {
widget.inputEl.style.height = `${widget.inputEl.scrollHeight}px`;
}
});
}
}
function adjustNodeSize() {
const sz = this.computeSize();
if (sz[0] < this.size[0]) {
sz[0] = this.size[0];
}
if (sz[1] < this.size[1]) {
sz[1] = this.size[1];
}
this.onResize?.(sz);
app.graph.setDirtyCanvas(true, false);
}
// 添加显示开关的创建
const onNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function () {
onNodeCreated?.apply(this, arguments);
// 添加显示开关
this.addWidget("toggle", "show_output", true, (value) => {
// console.log("[ShowTextPlus] Toggle output display:", value);
// 更新所有输出文本框的显示状态
for (let i = 2; i < this.widgets.length; i++) {
if (this.widgets[i].inputEl) {
updateWidgetDisplay(this.widgets[i], value);
}
}
// 重新计算节点大小
requestAnimationFrame(() => {
adjustNodeSize.call(this);
});
});
};
// 执行时更新显示
const onExecuted = nodeType.prototype.onExecuted;
nodeType.prototype.onExecuted = function (message) {
// console.log("[ShowTextPlus] Node executed, message:", message);
onExecuted?.apply(this, arguments);
if (message?.text) {
// console.log("[ShowTextPlus] Updating from execution:", message.text);
populate.call(this, message.text);
}
// 在执行完成后调整节点大小
requestAnimationFrame(() => {
adjustNodeSize.call(this);
});
};
// 加载时恢复显示
const onConfigure = nodeType.prototype.onConfigure;
nodeType.prototype.onConfigure = function () {
// console.log("[ShowTextPlus] Node configured, values:", this.widgets_values);
onConfigure?.apply(this, arguments);
if (this.widgets_values?.length) {
// console.log("[ShowTextPlus] Restoring from config:", this.widgets_values);
const textValues = this.widgets_values.slice(1); //从第二个值开始,跳过toggle
populate.call(this, textValues);
}
// 在配置完成后调整节点大小
requestAnimationFrame(() => {
adjustNodeSize.call(this);
});
};
}
},
});