|
@@ -20,7 +20,7 @@ import numpy as np
|
|
|
from PIL import Image, PngImagePlugin
|
|
|
from modules.call_queue import wrap_gradio_gpu_call, wrap_queued_call, wrap_gradio_call
|
|
|
|
|
|
-from modules import sd_hijack, sd_models, localization, script_callbacks, ui_extensions, deepbooru, sd_vae
|
|
|
+from modules import sd_hijack, sd_models, localization, script_callbacks, ui_extensions, deepbooru, sd_vae, extra_networks
|
|
|
from modules.ui_components import FormRow, FormGroup, ToolButton, FormHTML
|
|
|
from modules.paths import script_path
|
|
|
|
|
@@ -90,6 +90,7 @@ refresh_symbol = '\U0001f504' # 🔄
|
|
|
save_style_symbol = '\U0001f4be' # 💾
|
|
|
apply_style_symbol = '\U0001f4cb' # 📋
|
|
|
clear_prompt_symbol = '\U0001F5D1' # 🗑️
|
|
|
+extra_networks_symbol = '\U0001F3B4' # 🎴
|
|
|
|
|
|
|
|
|
def plaintext_to_html(text):
|
|
@@ -324,6 +325,8 @@ def connect_reuse_seed(seed: gr.Number, reuse_seed: gr.Button, generation_info:
|
|
|
|
|
|
def update_token_counter(text, steps):
|
|
|
try:
|
|
|
+ text, _ = extra_networks.parse_prompt(text)
|
|
|
+
|
|
|
_, prompt_flat_list, _ = prompt_parser.get_multicond_prompt_list([text])
|
|
|
prompt_schedules = prompt_parser.get_learned_conditioning_prompt_schedules(prompt_flat_list, steps)
|
|
|
|
|
@@ -354,10 +357,10 @@ def create_toprow(is_img2img):
|
|
|
negative_prompt = gr.Textbox(label="Negative prompt", elem_id=f"{id_part}_neg_prompt", show_label=False, lines=2, placeholder="Negative prompt (press Ctrl+Enter or Alt+Enter to generate)")
|
|
|
|
|
|
with gr.Column(scale=1, elem_id="roll_col"):
|
|
|
- paste = gr.Button(value=paste_symbol, elem_id="paste")
|
|
|
- save_style = gr.Button(value=save_style_symbol, elem_id="style_create")
|
|
|
- prompt_style_apply = gr.Button(value=apply_style_symbol, elem_id="style_apply")
|
|
|
- clear_prompt_button = gr.Button(value=clear_prompt_symbol, elem_id=f"{id_part}_clear_prompt")
|
|
|
+ paste = ToolButton(value=paste_symbol, elem_id="paste")
|
|
|
+ clear_prompt_button = ToolButton(value=clear_prompt_symbol, elem_id=f"{id_part}_clear_prompt")
|
|
|
+ extra_networks_button = ToolButton(value=extra_networks_symbol, elem_id=f"{id_part}_extra_networks")
|
|
|
+
|
|
|
token_counter = gr.HTML(value="<span></span>", elem_id=f"{id_part}_token_counter")
|
|
|
token_button = gr.Button(visible=False, elem_id=f"{id_part}_token_button")
|
|
|
negative_token_counter = gr.HTML(value="<span></span>", elem_id=f"{id_part}_negative_token_counter")
|
|
@@ -395,11 +398,14 @@ def create_toprow(is_img2img):
|
|
|
outputs=[],
|
|
|
)
|
|
|
|
|
|
- with gr.Row():
|
|
|
+ with gr.Row(elem_id=f"{id_part}_styles_row"):
|
|
|
prompt_styles = gr.Dropdown(label="Styles", elem_id=f"{id_part}_styles", choices=[k for k, v in shared.prompt_styles.styles.items()], value=[], multiselect=True)
|
|
|
create_refresh_button(prompt_styles, shared.prompt_styles.reload, lambda: {"choices": [k for k, v in shared.prompt_styles.styles.items()]}, f"refresh_{id_part}_styles")
|
|
|
|
|
|
- return prompt, prompt_styles, negative_prompt, submit, button_interrogate, button_deepbooru, prompt_style_apply, save_style, paste, token_counter, token_button, negative_token_counter, negative_token_button
|
|
|
+ prompt_style_apply = ToolButton(value=apply_style_symbol, elem_id="style_apply")
|
|
|
+ save_style = ToolButton(value=save_style_symbol, elem_id="style_create")
|
|
|
+
|
|
|
+ return prompt, prompt_styles, negative_prompt, submit, button_interrogate, button_deepbooru, prompt_style_apply, save_style, paste, extra_networks_button, token_counter, token_button, negative_token_counter, negative_token_button
|
|
|
|
|
|
|
|
|
def setup_progressbar(*args, **kwargs):
|
|
@@ -616,11 +622,15 @@ def create_ui():
|
|
|
modules.scripts.scripts_txt2img.initialize_scripts(is_img2img=False)
|
|
|
|
|
|
with gr.Blocks(analytics_enabled=False) as txt2img_interface:
|
|
|
- txt2img_prompt, txt2img_prompt_styles, txt2img_negative_prompt, submit, _, _, txt2img_prompt_style_apply, txt2img_save_style, txt2img_paste, token_counter, token_button, negative_token_counter, negative_token_button = create_toprow(is_img2img=False)
|
|
|
+ txt2img_prompt, txt2img_prompt_styles, txt2img_negative_prompt, submit, _, _, txt2img_prompt_style_apply, txt2img_save_style, txt2img_paste, extra_networks_button, token_counter, token_button, negative_token_counter, negative_token_button = create_toprow(is_img2img=False)
|
|
|
|
|
|
dummy_component = gr.Label(visible=False)
|
|
|
txt_prompt_img = gr.File(label="", elem_id="txt2img_prompt_image", file_count="single", type="binary", visible=False)
|
|
|
|
|
|
+ with FormRow(variant='compact', elem_id="txt2img_extra_networks", visible=False) as extra_networks:
|
|
|
+ from modules import ui_extra_networks
|
|
|
+ extra_networks_ui = ui_extra_networks.create_ui(extra_networks, extra_networks_button, 'txt2img')
|
|
|
+
|
|
|
with gr.Row().style(equal_height=False):
|
|
|
with gr.Column(variant='compact', elem_id="txt2img_settings"):
|
|
|
for category in ordered_ui_categories():
|
|
@@ -794,14 +804,20 @@ def create_ui():
|
|
|
token_button.click(fn=wrap_queued_call(update_token_counter), inputs=[txt2img_prompt, steps], outputs=[token_counter])
|
|
|
negative_token_button.click(fn=wrap_queued_call(update_token_counter), inputs=[txt2img_negative_prompt, steps], outputs=[negative_token_counter])
|
|
|
|
|
|
+ ui_extra_networks.setup_ui(extra_networks_ui, txt2img_gallery)
|
|
|
+
|
|
|
modules.scripts.scripts_current = modules.scripts.scripts_img2img
|
|
|
modules.scripts.scripts_img2img.initialize_scripts(is_img2img=True)
|
|
|
|
|
|
with gr.Blocks(analytics_enabled=False) as img2img_interface:
|
|
|
- img2img_prompt, img2img_prompt_styles, img2img_negative_prompt, submit, img2img_interrogate, img2img_deepbooru, img2img_prompt_style_apply, img2img_save_style, img2img_paste, token_counter, token_button, negative_token_counter, negative_token_button = create_toprow(is_img2img=True)
|
|
|
+ img2img_prompt, img2img_prompt_styles, img2img_negative_prompt, submit, img2img_interrogate, img2img_deepbooru, img2img_prompt_style_apply, img2img_save_style, img2img_paste, extra_networks_button, token_counter, token_button, negative_token_counter, negative_token_button = create_toprow(is_img2img=True)
|
|
|
|
|
|
img2img_prompt_img = gr.File(label="", elem_id="img2img_prompt_image", file_count="single", type="binary", visible=False)
|
|
|
|
|
|
+ with FormRow(variant='compact', elem_id="img2img_extra_networks", visible=False) as extra_networks:
|
|
|
+ from modules import ui_extra_networks
|
|
|
+ extra_networks_ui_img2img = ui_extra_networks.create_ui(extra_networks, extra_networks_button, 'img2img')
|
|
|
+
|
|
|
with FormRow().style(equal_height=False):
|
|
|
with gr.Column(variant='compact', elem_id="img2img_settings"):
|
|
|
copy_image_buttons = []
|
|
@@ -1064,6 +1080,8 @@ def create_ui():
|
|
|
token_button.click(fn=update_token_counter, inputs=[img2img_prompt, steps], outputs=[token_counter])
|
|
|
negative_token_button.click(fn=wrap_queued_call(update_token_counter), inputs=[txt2img_negative_prompt, steps], outputs=[negative_token_counter])
|
|
|
|
|
|
+ ui_extra_networks.setup_ui(extra_networks_ui_img2img, img2img_gallery)
|
|
|
+
|
|
|
img2img_paste_fields = [
|
|
|
(img2img_prompt, "Prompt"),
|
|
|
(img2img_negative_prompt, "Negative prompt"),
|
|
@@ -1666,10 +1684,8 @@ def create_ui():
|
|
|
download_localization = gr.Button(value='Download localization template', elem_id="download_localization")
|
|
|
reload_script_bodies = gr.Button(value='Reload custom script bodies (No ui updates, No restart)', variant='secondary', elem_id="settings_reload_script_bodies")
|
|
|
|
|
|
- if os.path.exists("html/licenses.html"):
|
|
|
- with open("html/licenses.html", encoding="utf8") as file:
|
|
|
- with gr.TabItem("Licenses"):
|
|
|
- gr.HTML(file.read(), elem_id="licenses")
|
|
|
+ with gr.TabItem("Licenses"):
|
|
|
+ gr.HTML(shared.html("licenses.html"), elem_id="licenses")
|
|
|
|
|
|
gr.Button(value="Show all pages", elem_id="settings_show_all_pages")
|
|
|
|
|
@@ -1756,11 +1772,9 @@ def create_ui():
|
|
|
if os.path.exists(os.path.join(script_path, "notification.mp3")):
|
|
|
audio_notification = gr.Audio(interactive=False, value=os.path.join(script_path, "notification.mp3"), elem_id="audio_notification", visible=False)
|
|
|
|
|
|
- if os.path.exists("html/footer.html"):
|
|
|
- with open("html/footer.html", encoding="utf8") as file:
|
|
|
- footer = file.read()
|
|
|
- footer = footer.format(versions=versions_html())
|
|
|
- gr.HTML(footer, elem_id="footer")
|
|
|
+ footer = shared.html("footer.html")
|
|
|
+ footer = footer.format(versions=versions_html())
|
|
|
+ gr.HTML(footer, elem_id="footer")
|
|
|
|
|
|
text_settings = gr.Textbox(elem_id="settings_json", value=lambda: opts.dumpjson(), visible=False)
|
|
|
settings_submit.click(
|