diff --git a/CHANGELOG.md b/CHANGELOG.md index d122a9785..68471cc87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,10 @@ or even free speedups and quality improvements (regardless of which workflows yo - support for embedded previews - large database of art styles included by default can be disabled in *settings -> extra networks -> show built-in* + - styles can also be used in a prompt directly: `` + if style if an exact match, it will be used + otherwise it will rotate between styles that match the start of the name + that way you can use different styles as wildcards when processing batches - **VAE** - VAEs are now also listed as part of extra networks - **LoRA** diff --git a/javascript/style.css b/javascript/style.css index 00558c637..6a53dd02d 100644 --- a/javascript/style.css +++ b/javascript/style.css @@ -202,10 +202,12 @@ table.settings-value-table td { padding: 0.4em; border: 1px solid #ccc; max-widt .extra-network-cards .card .actions { font-size: 3em; display: none; text-align-last: right; cursor: pointer; font-variant: unicase; position: absolute; z-index: 100; right: 0; height: 0.7em; width: 100%; background: rgba(0, 0, 0, 0.40); } #txt2img_description, #img2img_description { max-height: 63px; overflow-y: auto !important; } #txt2img_description > label > textarea, #img2img_description > label > textarea { font-size: 0.9em } + +#txt2img_extra_details > div, #img2img_extra_details > div { overflow-y: auto; min-height: 40vh; max-height: 80vh; align-self: flex-start; } #txt2img_extra_details, #img2img_extra_details { position: fixed; bottom: 50%; left: 50%; transform: translate(-50%, 50%); padding: 0.8em; border: var(--block-border-width) solid var(--highlight-color) !important; z-index: 100; box-shadow: var(--button-shadow); } -#txt2img_extra_details > div, #img2img_extra_details > div { overflow-y: auto; min-height: 40vh; max-height: 80vh; align-self: flex-start; } #txt2img_extra_details td:first-child, #img2img_extra_details td:first-child { font-weight: bold; vertical-align: top; } +#txt2img_extra_details .gradio-image, #img2img_extra_details .gradio-image { max-height: 70vh; } /* controlnet .controlnet_control_type .controlnet_control_type_filter_group .wrap:last-of-type { display: grid; grid-auto-flow: row; grid-template-columns: repeat(4, minmax(0, 1fr)); } diff --git a/modules/extra_networks.py b/modules/extra_networks.py index 3793290ee..550f71279 100644 --- a/modules/extra_networks.py +++ b/modules/extra_networks.py @@ -17,6 +17,8 @@ def register_extra_network(extra_network): def register_default_extra_networks(): from modules.extra_networks_hypernet import ExtraNetworkHypernet register_extra_network(ExtraNetworkHypernet()) + from modules.ui_extra_networks_styles import ExtraNetworkStyles + register_extra_network(ExtraNetworkStyles()) class ExtraNetworkParams: @@ -70,7 +72,7 @@ def activate(p, extra_network_data): try: extra_network.activate(p, extra_network_args) except Exception as e: - errors.display(e, f"activating extra network {extra_network_name} with arguments {extra_network_args}") + errors.display(e, f"activating extra network: name={extra_network_name} args:{extra_network_args}") for extra_network_name, extra_network in extra_network_registry.items(): args = extra_network_data.get(extra_network_name, None) @@ -79,7 +81,7 @@ def activate(p, extra_network_data): try: extra_network.activate(p, []) except Exception as e: - errors.display(e, f"activating extra network {extra_network_name}") + errors.display(e, f"activating extra network: name={extra_network_name}") def deactivate(p, extra_network_data): diff --git a/modules/ui_extra_networks_styles.py b/modules/ui_extra_networks_styles.py index d55cc8fc6..767098a16 100644 --- a/modules/ui_extra_networks_styles.py +++ b/modules/ui_extra_networks_styles.py @@ -1,7 +1,7 @@ import os import html import json -from modules import shared, ui_extra_networks +from modules import shared, script_callbacks, extra_networks, ui_extra_networks, styles class ExtraNetworksPageStyles(ui_extra_networks.ExtraNetworksPage): @@ -92,3 +92,33 @@ class ExtraNetworksPageStyles(ui_extra_networks.ExtraNetworksPage): def allowed_directories_for_previews(self): return [v for v in [shared.opts.styles_dir] if v is not None] + ['html'] + + +class ExtraNetworkStyles(extra_networks.ExtraNetwork): + def __init__(self): + super().__init__('style') + self.indexes = {} + + def activate(self, p, params_list): + for param in params_list: + if len(param.items) > 0: + style = None + search = param.items[0] + # style = shared.prompt_styles.find_style(param.items[0]) + match = [s for s in shared.prompt_styles.styles.values() if s.name == search] + if len(match) > 0: + style = match[0] + else: + match = [s for s in shared.prompt_styles.styles.values() if s.name.startswith(search)] + if len(match) > 0: + i = self.indexes.get(search, 0) + self.indexes[search] = (i + 1) % len(match) + style = match[self.indexes[search]] + if style is not None: + p.styles.append(style.name) + p.prompts = [styles.merge_prompts(style.prompt, prompt) for prompt in p.prompts] + p.negative_prompts = [styles.merge_prompts(style.negative_prompt, prompt) for prompt in p.negative_prompts] + + + def deactivate(self, p): + pass