From cdd169bd5259e5accb27b584533f472a81c71c2c Mon Sep 17 00:00:00 2001 From: AlUlkesh <99896447+AlUlkesh@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:39:25 +0200 Subject: [PATCH 1/2] fix for pnginfo_saver, when extension is disabled, #177 --- sd_dynamic_prompts/dynamic_prompting.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sd_dynamic_prompts/dynamic_prompting.py b/sd_dynamic_prompts/dynamic_prompting.py index ae4c0128..0ba449de 100644 --- a/sd_dynamic_prompts/dynamic_prompting.py +++ b/sd_dynamic_prompts/dynamic_prompting.py @@ -368,14 +368,15 @@ def process( magic_model: str | None, magic_blocklist_regex: str | None, ): + self._pnginfo_saver.enabled = opts.dp_write_raw_template + self._prompt_writer.enabled = opts.dp_write_prompts_to_file + if not is_enabled: logger.debug("Dynamic prompts disabled - exiting") return p ignore_whitespace = opts.dp_ignore_whitespace - self._pnginfo_saver.enabled = opts.dp_write_raw_template - self._prompt_writer.enabled = opts.dp_write_prompts_to_file self._limit_jinja_prompts = opts.dp_limit_jinja_prompts self._auto_purge_cache = opts.dp_auto_purge_cache self._wildcard_manager.dedup_wildcards = not opts.dp_wildcard_manager_no_dedupe From 6b5016cbf6bc60c62f12488e745fe50f07691d64 Mon Sep 17 00:00:00 2001 From: Adi Eyal Date: Thu, 9 Nov 2023 01:00:13 +0200 Subject: [PATCH 2/2] Disable callbacks when extension is disabled Ensure that callbacks (apart from settings and wildcards manager), only run when dynamic prompts is enabled. This builds on #648 --- sd_dynamic_prompts/callbacks.py | 44 ++++++++++++++++--------- sd_dynamic_prompts/dynamic_prompting.py | 33 ++++++++++++++++--- sd_dynamic_prompts/settings.py | 9 ++++- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/sd_dynamic_prompts/callbacks.py b/sd_dynamic_prompts/callbacks.py index 42f67076..b9890c64 100644 --- a/sd_dynamic_prompts/callbacks.py +++ b/sd_dynamic_prompts/callbacks.py @@ -2,23 +2,28 @@ import logging from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any -from dynamicprompts.wildcards import WildcardManager from modules import script_callbacks from modules.generation_parameters_copypaste import parse_generation_parameters from modules.script_callbacks import ImageSaveParams -from sd_dynamic_prompts.pnginfo_saver import PngInfoSaver, PromptTemplates -from sd_dynamic_prompts.prompt_writer import PromptWriter +from sd_dynamic_prompts.pnginfo_saver import PromptTemplates from sd_dynamic_prompts.settings import on_ui_settings from sd_dynamic_prompts.wildcards_tab import initialize as initialize_wildcards_tab +if TYPE_CHECKING: + from sd_dynamic_prompts.sddp_script import SDDPScript + + logger = logging.getLogger(__name__) -def register_pnginfo_saver(pnginfo_saver: PngInfoSaver) -> None: +def register_pnginfo_saver(sddp: SDDPScript) -> None: def on_save(image_save_params: ImageSaveParams) -> None: + if not sddp.is_enabled: + return + try: if image_save_params.p: png_info = image_save_params.pnginfo["parameters"] @@ -27,7 +32,7 @@ def on_save(image_save_params: ImageSaveParams) -> None: negative_template=image_save_params.p.negative_prompt, ) - updated_png_info = pnginfo_saver.update_pnginfo( + updated_png_info = sddp.pnginfo_saver.update_pnginfo( png_info, image_prompts, ) @@ -38,26 +43,32 @@ def on_save(image_save_params: ImageSaveParams) -> None: script_callbacks.on_before_image_saved(on_save) -def register_prompt_writer(prompt_writer: PromptWriter) -> None: +def register_prompt_writer(sddp: SDDPScript) -> None: def on_save(image_save_params: ImageSaveParams) -> None: + if not sddp.is_enabled: + return + image_name = Path(image_save_params.filename) prompt_filename = image_name.with_suffix(".csv") - prompt_writer.write_prompts(prompt_filename) + sddp.prompt_writer.write_prompts(prompt_filename) script_callbacks.on_before_image_saved(on_save) -def register_on_infotext_pasted(pnginfo_saver: PngInfoSaver) -> None: +def register_on_infotext_pasted(sddp: SDDPScript) -> None: def on_infotext_pasted(infotext: str, parameters: dict[str, Any]) -> None: + if not sddp.is_enabled: + return + new_parameters = {} if "Prompt" in parameters and "Template:" in parameters["Prompt"]: - parameters = pnginfo_saver.strip_template_info(parameters) + parameters = sddp.pnginfo_saver.strip_template_info(parameters) new_parameters = parse_generation_parameters(parameters["Prompt"]) elif ( "Negative prompt" in parameters and "Template:" in parameters["Negative prompt"] ): - parameters = pnginfo_saver.strip_template_info(parameters) + parameters = sddp.pnginfo_saver.strip_template_info(parameters) new_parameters = parse_generation_parameters(parameters["Negative prompt"]) new_parameters["Negative prompt"] = new_parameters["Prompt"] new_parameters["Prompt"] = parameters["Prompt"] @@ -66,9 +77,12 @@ def on_infotext_pasted(infotext: str, parameters: dict[str, Any]) -> None: script_callbacks.on_infotext_pasted(on_infotext_pasted) -def register_settings(): - script_callbacks.on_ui_settings(on_ui_settings) +def register_settings(sddp: SDDPScript) -> None: + def on_ui_settings_callback(): + on_ui_settings(sddp) + + script_callbacks.on_ui_settings(on_ui_settings_callback) -def register_wildcards_tab(wildcard_manager: WildcardManager): - initialize_wildcards_tab(wildcard_manager) +def register_wildcards_tab(sddp: SDDPScript) -> None: + initialize_wildcards_tab(sddp.wildcard_manager) diff --git a/sd_dynamic_prompts/dynamic_prompting.py b/sd_dynamic_prompts/dynamic_prompting.py index 0ba449de..2e4b42ae 100644 --- a/sd_dynamic_prompts/dynamic_prompting.py +++ b/sd_dynamic_prompts/dynamic_prompting.py @@ -99,15 +99,32 @@ def __init__(self): self._pnginfo_saver = PngInfoSaver() self._prompt_writer = PromptWriter() self._wildcard_manager = WildcardManager(get_wildcard_dir()) + self._is_enabled = False if loaded_count % 2 == 0: return - callbacks.register_pnginfo_saver(self._pnginfo_saver) - callbacks.register_prompt_writer(self._prompt_writer) - callbacks.register_on_infotext_pasted(self._pnginfo_saver) - callbacks.register_settings() - callbacks.register_wildcards_tab(self._wildcard_manager) + callbacks.register_pnginfo_saver(self) + callbacks.register_prompt_writer(self) + callbacks.register_on_infotext_pasted(self) + callbacks.register_settings(self) + callbacks.register_wildcards_tab(self) + + @property + def is_enabled(self): + return self._is_enabled + + @property + def pnginfo_saver(self): + return self._pnginfo_saver + + @property + def prompt_writer(self): + return self._prompt_writer + + @property + def wildcard_manager(self): + return self._wildcard_manager def title(self): return f"Dynamic Prompts v{VERSION}" @@ -383,6 +400,12 @@ def process( self._wildcard_manager.sort_wildcards = not opts.dp_wildcard_manager_no_sort self._wildcard_manager.shuffle_wildcards = opts.dp_wildcard_manager_shuffle + if not is_enabled: + logger.debug("Dynamic prompts disabled - exiting") + return p + + ignore_whitespace = opts.dp_ignore_whitespace + magicprompt_batch_size = opts.dp_magicprompt_batch_size parser_config = ParserConfig( diff --git a/sd_dynamic_prompts/settings.py b/sd_dynamic_prompts/settings.py index 70c28481..aa31d4d6 100644 --- a/sd_dynamic_prompts/settings.py +++ b/sd_dynamic_prompts/settings.py @@ -1,10 +1,17 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + import gradio as gr from modules import shared from sd_dynamic_prompts.helpers import load_magicprompt_models +if TYPE_CHECKING: + from sd_dynamic_prompts.dynamicprompting import Script as SDDPScript + -def on_ui_settings(): +def on_ui_settings(script_protocol: SDDPScript): section = "dynamicprompts", "Dynamic Prompts" shared.opts.add_option( key="dp_ignore_whitespace",