feat: convert external input
This commit is contained in:
		
							parent
							
								
									a82e315d6c
								
							
						
					
					
						commit
						2bd8b23c60
					
				@ -122,6 +122,144 @@ function setSelectedWorkflowInfo(info) {
 | 
				
			|||||||
  context.selectedWorkflowInfo = 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*/
 | 
					/** @typedef {import('../../../web/types/comfy.js').ComfyExtension} ComfyExtension*/
 | 
				
			||||||
/** @type {ComfyExtension} */
 | 
					/** @type {ComfyExtension} */
 | 
				
			||||||
const ext = {
 | 
					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() {
 | 
					  registerCustomNodes() {
 | 
				
			||||||
    /** @type {LGraphNode}*/
 | 
					    /** @type {LGraphNode}*/
 | 
				
			||||||
    class ComfyDeploy extends 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.UseNewMenu", "Top");
 | 
				
			||||||
        await app.ui.settings.setSettingValueAsync(
 | 
					        await app.ui.settings.setSettingValueAsync(
 | 
				
			||||||
          "Comfy.Sidebar.Size",
 | 
					          "Comfy.Sidebar.Size",
 | 
				
			||||||
          "small"
 | 
					          "small",
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        await app.ui.settings.setSettingValueAsync(
 | 
					        await app.ui.settings.setSettingValueAsync(
 | 
				
			||||||
          "Comfy.Sidebar.Location",
 | 
					          "Comfy.Sidebar.Location",
 | 
				
			||||||
          "right"
 | 
					          "right",
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        localStorage.setItem("Comfy.MenuPosition.Docked", "true");
 | 
					        localStorage.setItem("Comfy.MenuPosition.Docked", "true");
 | 
				
			||||||
        console.log("native mode manmanman");
 | 
					        console.log("native mode manmanman");
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user