diff --git a/nodes.py b/nodes.py index b42d462..4bd3f17 100644 --- a/nodes.py +++ b/nodes.py @@ -1404,6 +1404,7 @@ class RandomInt: RETURN_NAMES = ("rand_int", ) INPUT_IS_LIST = True OUTPUT_IS_LIST = (True, ) + # NOT_IDEMPOTENT = True FUNCTION = "execute" CATEGORY = "0246" @@ -1475,7 +1476,7 @@ class RandomInt: @classmethod def IS_CHANGED(cls, val = None, *args, **kwargs): - if ("rand", "sub", "add") in map(lambda _: _.strip(), val[0].split(",")): + if any(x in map(lambda _: _.strip(), val[0].split(",")) for x in ("rand", "sub", "add")): return float("NaN") return val[0] @@ -1486,7 +1487,7 @@ class Hold: def INPUT_TYPES(cls): return { "required": { - "_mode": (["save", "clear", "pin"], ), + "_mode": (["save", "clear", "pin", "share"], ), "_key_id": ("STRING", { "default": "", "multiline": False @@ -1509,11 +1510,16 @@ class Hold: RETURN_NAMES = ("_data_out", "_data_out_all") INPUT_IS_LIST = True OUTPUT_IS_LIST = (True, True) - NOT_IDEMPOTENT = True # Since this node is similar to CheckpointLoaderSimple (to save resources) + # NOT_IDEMPOTENT = True # Since this node is similar to CheckpointLoaderSimple (to save resources) FUNCTION = "execute" CATEGORY = "0246" - def execute(self, _data_in = None, _id = None, _prompt = None, _workflow = None, _hold = None, _mode = None, _key_id = None, **kwargs): + def execute( + self, _data_in = None, + _id = None, _prompt = None, _workflow = None, + _hold = None, _mode = None, _key_id = None, + **kwargs + ): for key in kwargs: if key.startswith("_data_in"): _data_in = kwargs[key] @@ -1572,11 +1578,21 @@ class Hold: mode_flag = _key_id in Hold.HOLD_DB and "mode" in Hold.HOLD_DB[_key_id] if ( + mode_flag and \ + Hold.HOLD_DB[_key_id]["mode"] == "share" and \ + _key_id in _prompt and _prompt[_key_id]["inputs"]["_mode"] == "share" + ): + result = Hold.HOLD_DB[_key_id]["data"] if \ + "data" in Hold.HOLD_DB[_key_id] and \ + len(Hold.HOLD_DB[_key_id]["data"]) > 0 and \ + Hold.HOLD_DB[_key_id].get("track") != PROMPT_ID else \ + [[None]] + elif ( mode_flag and \ Hold.HOLD_DB[_key_id]["mode"] == "pin" and \ _key_id in _prompt and _prompt[_key_id]["inputs"]["_mode"] == "pin" ): - result = [[None]] if _data_in is None or len(_data_in) == 0 else _data_in + result = [[None]] if _data_in is None or len(_data_in) == 0 else [_data_in] elif ( mode_flag and \ Hold.HOLD_DB[_key_id]["mode"] == "save" and \ @@ -1597,10 +1613,9 @@ class Hold: Hold.HOLD_DB[_id]["mode"] = _mode if "data" in Hold.HOLD_DB[_key_id]: - if len(Hold.HOLD_DB[_key_id]["data"]) > 0 and len(Hold.HOLD_DB[_key_id]["data"][0]) > 0 and _mode == "pin": - result.append(Hold.HOLD_DB[_key_id]["data"][0]) + result.append(sum(Hold.HOLD_DB[_key_id]["data"], [])) else: - result.append([None]) + result.append(sum(Hold.HOLD_DB[_id]["data"], [])) ui_text += f"Key: {_key_id}, Size: {len(result[0])}, " else: @@ -1610,12 +1625,10 @@ class Hold: Hold.HOLD_DB[_id]["mode"] = _mode Hold.HOLD_DB[_id]["data"].append(_data_in) - result = [_data_in, [None]] + result = [_data_in, sum(Hold.HOLD_DB[_id]["data"], [])] - # [TODO] Support "pin" which is to store data across different prompt - # To nuke data implement right cick action then call API - # if _mode == "pin": - # result.append(Hold.HOLD_DB[_id]["data"]) + if _mode == "share": + Hold.HOLD_DB[_id]["data"] = [_data_in] ui_text += f"Size: {len(result[0])}, "