from modules.ui_components import ToolButton from PIL import Image import gradio as gr from .ui_funcs import DEFAULT_MAPPING, visualize_mapping, on_entry from .gr_version import js def couple_UI(script, is_img2img: bool, title: str): m: str = "i2i" if is_img2img else "t2i" with gr.Accordion( label=title, elem_id=f"forge_couple_{m}", open=False, ): with gr.Row(): enable = gr.Checkbox(label="Enable", elem_classes="fc_enable", scale=2) mode = gr.Radio( ["Basic", "Advanced"], label="Region Assignment", value="Basic", scale=3 ) separator = gr.Textbox( value="", label="Couple Separator", lines=1, max_lines=1, placeholder="\\n", elem_classes="fc_separator", scale=1, ) with gr.Group(visible=True, elem_classes="fc_bsc") as basic_settings: with gr.Row(): direction = gr.Radio( ["Horizontal", "Vertical"], label="Tile Direction", value="Horizontal", scale=2, ) background = gr.Radio( ["None", "First Line", "Last Line"], label="Global Effect", value="None", scale=3, ) background_weight = gr.Slider( minimum=0.1, maximum=1.0, step=0.1, value=0.5, label="Global Effect Weight", scale=1, ) with gr.Group(visible=False, elem_classes="fc_adv") as adv_settings: with gr.Row(elem_classes="fc_mapping_btns"): gr.Button("Default Mapping", elem_classes="fc_reset_btn") gr.HTML('
') mapping = gr.JSON(value=DEFAULT_MAPPING, visible=False) mapping_paste_field = gr.Textbox( visible=False, elem_classes="fc_paste_field" ) mapping_paste_field.change( on_entry, mapping_paste_field, mapping, show_progress="hidden" ).success(None, **js(f'() => {{ ForgeCouple.onPaste("{m}"); }}')) mapping_entry_field = gr.Textbox( visible=False, elem_classes="fc_entry_field" ) mapping_entry_field.change( on_entry, mapping_entry_field, mapping, show_progress="hidden" ).success(None, **js(f'() => {{ ForgeCouple.preview("{m}"); }}')) with gr.Group(elem_classes="fc_row_btns"): with gr.Row(): with gr.Column(): ToolButton( value="\U0001F195", elem_id="fc_up_btn", tooltip="Add a New Row above the Selected Row", ) ToolButton( value="\U0001F195", elem_id="fc_dn_btn", tooltip="Add a New Row below the Selected Row", ) ToolButton( value="\U0000274C", elem_id="fc_del_btn", tooltip="Delete the Selected Row", ) with gr.Column(elem_classes="fc_bg_btns"): ToolButton( value="\U0001F4C2", elem_id="fc_load_img_btn", tooltip="Load a background image for the mapping visualization", ) if is_img2img: ToolButton( value="\U000023CF", elem_id="fc_load_i2i_img_btn", tooltip="Load the img2img image as the background image", ) ToolButton( value="\U0001F5D1", elem_id="fc_clear_img_btn", tooltip="Remove the background image", ) preview_img = gr.Image( value=Image.new("RGB", (1, 1), "black"), image_mode="RGBA", label="Mapping Preview", elem_classes="fc_preview_img", type="pil", interactive=False, height=512, show_download_button=False, show_label=False, ) preview_res = gr.Textbox( lines=1, max_lines=1, visible=False, interactive=True, elem_classes="fc_preview_res", ) preview_btn = gr.Button( visible=False, interactive=True, elem_classes="fc_preview", ) preview_btn.click( visualize_mapping, [preview_res, mapping], preview_img, show_progress="hidden", ).success(None, **js(f'() => {{ ForgeCouple.updateColors("{m}"); }}')) def on_mode_change(choice): if choice == "Basic": return [ gr.update(visible=True), gr.update(visible=False), ] else: return [ gr.update(visible=False), gr.update(visible=True), ] mode.change(on_mode_change, mode, [basic_settings, adv_settings]).success( fn=None, **js(f'() => {{ ForgeCouple.preview("{m}"); }}') ) script.paste_field_names = [] script.infotext_fields = [ (enable, "forge_couple"), (mode, "forge_couple_mode"), (separator, "forge_couple_separator"), (direction, "forge_couple_direction"), (background, "forge_couple_background"), (background_weight, "forge_couple_background_weight"), (mapping_paste_field, "forge_couple_mapping"), ] for comp, name in script.infotext_fields: comp.do_not_save_to_config = True script.paste_field_names.append(name) for comp in (mapping, preview_res): comp.do_not_save_to_config = True return [ enable, mode, separator, direction, background, background_weight, mapping, ]