feat: convert external input
This commit is contained in:
parent
a82e315d6c
commit
2bd8b23c60
@ -122,6 +122,144 @@ function setSelectedWorkflowInfo(info) {
|
||||
context.selectedWorkflowInfo = info;
|
||||
}
|
||||
|
||||
const VALID_TYPES = [
|
||||
"STRING",
|
||||
"combo",
|
||||
"number",
|
||||
"toggle",
|
||||
"BOOLEAN",
|
||||
"text",
|
||||
"string",
|
||||
];
|
||||
|
||||
function hideWidget(node, widget, suffix = "") {
|
||||
if (widget.type?.startsWith(CONVERTED_TYPE)) return;
|
||||
widget.origType = widget.type;
|
||||
widget.origComputeSize = widget.computeSize;
|
||||
widget.origSerializeValue = widget.serializeValue;
|
||||
widget.computeSize = () => [0, -4];
|
||||
widget.type = CONVERTED_TYPE + suffix;
|
||||
widget.serializeValue = () => {
|
||||
if (!node.inputs) {
|
||||
return void 0;
|
||||
}
|
||||
let node_input = node.inputs.find((i) => i.widget?.name === widget.name);
|
||||
if (!node_input || !node_input.link) {
|
||||
return void 0;
|
||||
}
|
||||
return widget.origSerializeValue
|
||||
? widget.origSerializeValue()
|
||||
: widget.value;
|
||||
};
|
||||
if (widget.linkedWidgets) {
|
||||
for (const w of widget.linkedWidgets) {
|
||||
hideWidget(node, w, ":" + widget.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getWidgetType(config) {
|
||||
let type = config[0];
|
||||
if (type instanceof Array) {
|
||||
type = "COMBO";
|
||||
}
|
||||
return { type };
|
||||
}
|
||||
|
||||
const GET_CONFIG = Symbol();
|
||||
|
||||
function convertToInput(node, widget, config) {
|
||||
console.log(node);
|
||||
if (node.type == "LoadImage") {
|
||||
var inputNode = LiteGraph.createNode("ComfyUIDeployExternalImage");
|
||||
console.log(widget);
|
||||
|
||||
const currentOutputsLinks = node.outputs[0].links;
|
||||
|
||||
// const index = node.inputs.findIndex((x) => x.name == widget.name);
|
||||
// console.log(node.widgets_values, index);
|
||||
// inputNode.configure({
|
||||
// widgets_values: ["input_text", widget.value],
|
||||
// });
|
||||
inputNode.pos = node.pos;
|
||||
// inputNode.pos[0] += node.size[0] + 40;
|
||||
node.pos[0] -= inputNode.size[0] + 20;
|
||||
console.log(inputNode);
|
||||
console.log(app.graph);
|
||||
app.graph.add(inputNode);
|
||||
|
||||
const links = app.graph.links
|
||||
|
||||
console.log(links);
|
||||
|
||||
|
||||
currentOutputsLinks.forEach((link) => {
|
||||
const llink = links[link]
|
||||
console.log(links[link]);
|
||||
inputNode.connect(0, llink.target_id, llink.target_slot)
|
||||
// const link = graph.links[link];
|
||||
// console.log(link);
|
||||
// inputNode.connect(0, )
|
||||
});
|
||||
|
||||
node.connect(0, inputNode, 0);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
hideWidget(node, widget);
|
||||
const { type } = getWidgetType(config);
|
||||
const sz = node.size;
|
||||
const inputIsOptional = !!widget.options?.inputIsOptional;
|
||||
const input = node.addInput(widget.name, type, {
|
||||
widget: { name: widget.name, [GET_CONFIG]: () => config },
|
||||
...(inputIsOptional ? { shape: LiteGraph.SlotShape.HollowCircle } : {}),
|
||||
});
|
||||
for (const widget2 of node.widgets) {
|
||||
widget2.last_y += LiteGraph.NODE_SLOT_HEIGHT;
|
||||
}
|
||||
node.setSize([Math.max(sz[0], node.size[0]), Math.max(sz[1], node.size[1])]);
|
||||
|
||||
if (type == "STRING") {
|
||||
var inputNode = LiteGraph.createNode("ComfyUIDeployExternalText");
|
||||
console.log(widget);
|
||||
const index = node.inputs.findIndex((x) => x.name == widget.name);
|
||||
console.log(node.widgets_values, index);
|
||||
inputNode.configure({
|
||||
widgets_values: ["input_text", widget.value],
|
||||
});
|
||||
inputNode.pos = node.pos;
|
||||
inputNode.pos[0] -= node.size[0] + 40;
|
||||
console.log(inputNode);
|
||||
console.log(app.graph);
|
||||
app.graph.add(inputNode);
|
||||
inputNode.connect(0, node, index);
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
const CONVERTED_TYPE = "converted-widget";
|
||||
|
||||
function getConfig(widgetName) {
|
||||
const { nodeData } = this.constructor;
|
||||
return (
|
||||
nodeData?.input?.required?.[widgetName] ??
|
||||
nodeData?.input?.optional?.[widgetName]
|
||||
);
|
||||
}
|
||||
|
||||
function isConvertibleWidget(widget, config) {
|
||||
return (
|
||||
(VALID_TYPES.includes(widget.type) || VALID_TYPES.includes(config[0])) &&
|
||||
!widget.options?.forceInput
|
||||
);
|
||||
}
|
||||
|
||||
var __defProp = Object.defineProperty;
|
||||
var __name = (target, value) =>
|
||||
__defProp(target, "name", { value, configurable: true });
|
||||
|
||||
/** @typedef {import('../../../web/types/comfy.js').ComfyExtension} ComfyExtension*/
|
||||
/** @type {ComfyExtension} */
|
||||
const ext = {
|
||||
@ -232,6 +370,115 @@ const ext = {
|
||||
}
|
||||
},
|
||||
|
||||
async beforeRegisterNodeDef(nodeType, nodeData, app2) {
|
||||
const origGetExtraMenuOptions = nodeType.prototype.getExtraMenuOptions;
|
||||
nodeType.prototype.getExtraMenuOptions = function (_, options) {
|
||||
const r = origGetExtraMenuOptions
|
||||
? origGetExtraMenuOptions.apply(this, arguments)
|
||||
: void 0;
|
||||
if (this.widgets) {
|
||||
let toInput = [];
|
||||
let toWidget = [];
|
||||
for (const w of this.widgets) {
|
||||
if (w.options?.forceInput) {
|
||||
continue;
|
||||
}
|
||||
if (w.type === CONVERTED_TYPE) {
|
||||
toWidget.push({
|
||||
content: `Convert ${w.name} to widget`,
|
||||
callback: /* @__PURE__ */ __name(
|
||||
() => convertToWidget(this, w),
|
||||
"callback",
|
||||
),
|
||||
});
|
||||
} else {
|
||||
const config = getConfig.call(this, w.name) ?? [
|
||||
w.type,
|
||||
w.options || {},
|
||||
];
|
||||
if (isConvertibleWidget(w, config)) {
|
||||
toInput.push({
|
||||
content: `Convert ${w.name} to input`,
|
||||
callback: /* @__PURE__ */ __name(
|
||||
() => convertToInput(this, w, config),
|
||||
"callback",
|
||||
),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
if (toInput.length) {
|
||||
if (true) {
|
||||
options.push();
|
||||
|
||||
let optionIndex = options.findIndex((o) => o.content === "Outputs");
|
||||
if (optionIndex === -1) optionIndex = options.length;
|
||||
else optionIndex++;
|
||||
options.splice(
|
||||
0,
|
||||
0,
|
||||
{
|
||||
content: "[ComfyDeploy] Convert to External Input",
|
||||
submenu: {
|
||||
options: toInput,
|
||||
},
|
||||
},
|
||||
null,
|
||||
);
|
||||
} else {
|
||||
options.push(...toInput, null);
|
||||
}
|
||||
}
|
||||
// if (toWidget.length) {
|
||||
// if (useConversionSubmenusSetting.value) {
|
||||
// options.push({
|
||||
// content: "Convert Input to Widget",
|
||||
// submenu: {
|
||||
// options: toWidget,
|
||||
// },
|
||||
// });
|
||||
// } else {
|
||||
// options.push(...toWidget, null);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
return r;
|
||||
};
|
||||
|
||||
// const origonNodeCreated = nodeType.prototype.onNodeCreated;
|
||||
// nodeType.prototype.onNodeCreated = function () {
|
||||
// const r = origonNodeCreated
|
||||
// ? origonNodeCreated.apply(this, arguments)
|
||||
// : void 0;
|
||||
|
||||
// if (!this.widgets) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// console.log(this.widgets);
|
||||
|
||||
// this.widgets.forEach(element => {
|
||||
// if (element.type != "customtext") return
|
||||
|
||||
// console.log(element.element);
|
||||
|
||||
// const parent = element.element.parentElement
|
||||
|
||||
// console.log(element.element.parentElement)
|
||||
// const btn = document.createElement("button");
|
||||
// // const div = document.createElement("div");
|
||||
// // parent.removeChild(element.element)
|
||||
// // div.appendChild(element.element)
|
||||
// // parent.appendChild(div)
|
||||
// // element.element = div
|
||||
// // console.log(element.element);
|
||||
// // btn.style = element.element.style
|
||||
// });
|
||||
|
||||
// return r
|
||||
// };
|
||||
},
|
||||
|
||||
registerCustomNodes() {
|
||||
/** @type {LGraphNode}*/
|
||||
class ComfyDeploy extends LGraphNode {
|
||||
@ -463,11 +710,11 @@ const ext = {
|
||||
await app.ui.settings.setSettingValueAsync("Comfy.UseNewMenu", "Top");
|
||||
await app.ui.settings.setSettingValueAsync(
|
||||
"Comfy.Sidebar.Size",
|
||||
"small"
|
||||
"small",
|
||||
);
|
||||
await app.ui.settings.setSettingValueAsync(
|
||||
"Comfy.Sidebar.Location",
|
||||
"right"
|
||||
"right",
|
||||
);
|
||||
localStorage.setItem("Comfy.MenuPosition.Docked", "true");
|
||||
console.log("native mode manmanman");
|
||||
|
Loading…
x
Reference in New Issue
Block a user