diff --git a/js/comboBoolMigration.js b/js/comboBoolMigration.js deleted file mode 100644 index fa55216..0000000 --- a/js/comboBoolMigration.js +++ /dev/null @@ -1,35 +0,0 @@ -import { ComfyApp, app } from "../../scripts/app.js"; - -let conflict_check = undefined; - -app.registerExtension({ - name: "Comfy.impact.comboBoolMigration", - - nodeCreated(node, app) { - for(let i in node.widgets) { - let widget = node.widgets[i]; - - if(conflict_check == undefined) { - conflict_check = !!app.extensions.find((ext) => ext.name === "Comfy.comboBoolMigration"); - } - - if(conflict_check) - return; - - if(widget.type == "toggle") { - let value = widget.value; - - var v = Object.getOwnPropertyDescriptor(widget, 'value'); - if(!v) { - Object.defineProperty(widget, "value", { - set: (value) => { - delete widget.value; - widget.value = value == true || value == widget.options.on; - }, - get: () => { return value; } - }); - } - } - } - } -}); diff --git a/js/impact-pack.js b/js/impact-pack.js index efd816c..92bce27 100644 --- a/js/impact-pack.js +++ b/js/impact-pack.js @@ -93,7 +93,7 @@ const input_dirty = {}; const output_tracking = {}; function progressExecuteHandler(event) { - if(event.detail.output.aux){ + if(event.detail?.output?.aux){ const id = event.detail.node; if(input_tracking.hasOwnProperty(id)) { if(input_tracking.hasOwnProperty(id) && input_tracking[id][0] != event.detail.output.aux[0]) { @@ -273,7 +273,7 @@ app.registerExtension({ } else { const node = app.graph.getNodeById(link_info.origin_id); - slot_type = node.outputs[link_info.origin_slot].type; + slot_type = node.outputs[link_info.origin_slot]?.type; } this.inputs[0].type = slot_type; @@ -759,14 +759,20 @@ app.registerExtension({ // mode combo Object.defineProperty(mode_widget, "value", { set: (value) => { - node._mode_value = value == true || value == "Populate"; - populated_text_widget.inputEl.disabled = value == true || value == "Populate"; + if(value == true) + node._mode_value = "populate"; + else if(value == false) + node._mode_value = "fixed"; + else + node._mode_value = value; // combo value + + populated_text_widget.inputEl.disabled = node._mode_value != 'populate'; }, get: () => { if(node._mode_value != undefined) return node._mode_value; else - return true; + return 'populate'; } }); } diff --git a/modules/impact/config.py b/modules/impact/config.py index d4411df..1de0734 100644 --- a/modules/impact/config.py +++ b/modules/impact/config.py @@ -1,7 +1,7 @@ import configparser import os -version_code = [8, 4, 1] +version_code = [8, 5] version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') dependency_version = 24 diff --git a/modules/impact/impact_pack.py b/modules/impact/impact_pack.py index ef20cb1..e67928f 100644 --- a/modules/impact/impact_pack.py +++ b/modules/impact/impact_pack.py @@ -2343,7 +2343,11 @@ class ImpactWildcardProcessor: return {"required": { "wildcard_text": ("STRING", {"multiline": True, "dynamicPrompts": False, "tooltip": "Enter a prompt using wildcard syntax."}), "populated_text": ("STRING", {"multiline": True, "dynamicPrompts": False, "tooltip": "The actual value passed during the execution of 'ImpactWildcardProcessor' is what is shown here. The behavior varies slightly depending on the mode. Wildcard syntax can also be used in 'populated_text'."}), - "mode": ("BOOLEAN", {"default": True, "label_on": "Populate", "label_off": "Fixed", "tooltip": "Populate: Before running the workflow, it overwrites the existing value of 'populated_text' with the prompt processed from 'wildcard_text'. In this mode, 'populated_text' cannot be edited.\nFixed: Ignores wildcard_text and keeps 'populated_text' as is. You can edit 'populated_text' in this mode."}), + "mode": (["populate", "fixed", "reproduce"], {"default": "populate", "tooltip": + "populate: Before running the workflow, it overwrites the existing value of 'populated_text' with the prompt processed from 'wildcard_text'. In this mode, 'populated_text' cannot be edited.\n" + "fixed: Ignores wildcard_text and keeps 'populated_text' as is. You can edit 'populated_text' in this mode.\n" + "reproduce: This mode operates as 'fixed' mode only once for reproduction, and then it switches to 'populate' mode." + }), "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "tooltip": "Determines the random seed to be used for wildcard processing."}), "Select to add Wildcard": (["Select the Wildcard to add to the text"],), }, @@ -2352,7 +2356,7 @@ class ImpactWildcardProcessor: CATEGORY = "ImpactPack/Prompt" DESCRIPTION = ("The 'ImpactWildcardProcessor' processes text prompts written in wildcard syntax and outputs the processed text prompt.\n\n" - "TIP: Before the workflow is executed, the processing result of 'wildcard_text' is displayed in 'populated_text', and the populated text is saved along with the workflow. If you want to use a seed converted as input, write the prompt directly in 'populated_text' instead of 'wildcard_text', and set the mode to 'Fixed'.") + "TIP: Before the workflow is executed, the processing result of 'wildcard_text' is displayed in 'populated_text', and the populated text is saved along with the workflow. If you want to use a seed converted as input, write the prompt directly in 'populated_text' instead of 'wildcard_text', and set the mode to 'fixed'.") RETURN_TYPES = ("STRING", ) FUNCTION = "doit" @@ -2374,8 +2378,10 @@ class ImpactWildcardEncode: "clip": ("CLIP",), "wildcard_text": ("STRING", {"multiline": True, "dynamicPrompts": False, "tooltip": "Enter a prompt using wildcard syntax."}), "populated_text": ("STRING", {"multiline": True, "dynamicPrompts": False, "tooltip": "The actual value passed during the execution of 'ImpactWildcardEncode' is what is shown here. The behavior varies slightly depending on the mode. Wildcard syntax can also be used in 'populated_text'."}), - "mode": ("BOOLEAN", {"default": True, "label_on": "Populate", "label_off": "Fixed", "tooltip": "Populate: Before running the workflow, it overwrites the existing value of 'populated_text' with the prompt processed from 'wildcard_text'. In this mode, 'populated_text' cannot be edited.\n" - "Fixed: Ignores wildcard_text and keeps 'populated_text' as is. You can edit 'populated_text' in this mode."}), + "mode": (["populate", "fixed", "reproduce"], {"tooltip": + "populate: Before running the workflow, it overwrites the existing value of 'populated_text' with the prompt processed from 'wildcard_text'. In this mode, 'populated_text' cannot be edited.\n" + "fixed: Ignores wildcard_text and keeps 'populated_text' as is. You can edit 'populated_text' in this mode\n." + "reproduce: This mode operates as 'fixed' mode only once for reproduction, and then it switches to 'populate' mode."}), "Select to add LoRA": (["Select the LoRA to add to the text"] + folder_paths.get_filename_list("loras"), ), "Select to add Wildcard": (["Select the Wildcard to add to the text"], ), "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "tooltip": "Determines the random seed to be used for wildcard processing."}), @@ -2385,7 +2391,7 @@ class ImpactWildcardEncode: CATEGORY = "ImpactPack/Prompt" DESCRIPTION = ("The 'ImpactWildcardEncode' node processes text prompts written in wildcard syntax and outputs them as conditioning. It also supports LoRA syntax, with the applied LoRA reflected in the model's output.\n\n" - "TIP1: Before the workflow is executed, the processing result of 'wildcard_text' is displayed in 'populated_text', and the populated text is saved along with the workflow. If you want to use a seed converted as input, write the prompt directly in 'populated_text' instead of 'wildcard_text', and set the mode to 'Fixed'.\n" + "TIP1: Before the workflow is executed, the processing result of 'wildcard_text' is displayed in 'populated_text', and the populated text is saved along with the workflow. If you want to use a seed converted as input, write the prompt directly in 'populated_text' instead of 'wildcard_text', and set the mode to 'fixed'.\n" "TIP2: If the 'Inspire Pack' is installed, LBW(LoRA Block Weight) syntax can also be applied.") RETURN_TYPES = ("MODEL", "CLIP", "CONDITIONING", "STRING") diff --git a/modules/impact/impact_server.py b/modules/impact/impact_server.py index 869dfce..7748876 100644 --- a/modules/impact/impact_server.py +++ b/modules/impact/impact_server.py @@ -478,7 +478,17 @@ def onprompt_populate_wildcards(json_data): for k, v in prompt.items(): if 'class_type' in v and (v['class_type'] == 'ImpactWildcardEncode' or v['class_type'] == 'ImpactWildcardProcessor'): inputs = v['inputs'] - if inputs['mode'] and isinstance(inputs['populated_text'], str): + + # legacy adapter + if isinstance(inputs['mode'], bool): + if inputs['mode']: + new_mode = 'populate' + else: + new_mode = 'fixed' + + inputs['mode'] = new_mode + + if inputs['mode'] == 'populate' and isinstance(inputs['populated_text'], str): if isinstance(inputs['seed'], list): try: input_node = prompt[inputs['seed'][0]] @@ -499,10 +509,15 @@ def onprompt_populate_wildcards(json_data): input_seed = int(inputs['seed']) inputs['populated_text'] = wildcards.process(inputs['wildcard_text'], input_seed) - inputs['mode'] = False + inputs['mode'] = 'reproduce' PromptServer.instance.send_sync("impact-node-feedback", {"node_id": k, "widget_name": "populated_text", "type": "STRING", "value": inputs['populated_text']}) updated_widget_values[k] = inputs['populated_text'] + + if inputs['mode'] == 'reproduce': + PromptServer.instance.send_sync("impact-node-feedback", {"node_id": k, "widget_name": "mode", "type": "STRING", "value": 'populate'}) + + if 'extra_data' in json_data and 'extra_pnginfo' in json_data['extra_data']: for node in json_data['extra_data']['extra_pnginfo']['workflow']['nodes']: diff --git a/pyproject.toml b/pyproject.toml index 162d6ef..b57647f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-impact-pack" description = "This node pack offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler." -version = "8.4.1" +version = "8.5" license = { file = "LICENSE.txt" } dependencies = ["segment-anything", "scikit-image", "piexif", "transformers", "opencv-python-headless", "GitPython", "scipy>=1.11.4"]