| import gradio as gr |
| from .chain_handlers import ( |
| create_lora_event_handlers, |
| create_controlnet_event_handlers, |
| create_anima_controlnet_lllite_event_handlers, |
| create_diffsynth_controlnet_event_handlers, |
| create_ipadapter_event_handlers, |
| create_embedding_event_handlers, |
| create_conditioning_event_handlers, |
| create_flux1_ipadapter_event_handlers, |
| create_sd3_ipadapter_event_handlers, |
| create_style_event_handlers, |
| create_reference_latent_event_handlers, |
| create_hidream_o1_reference_event_handlers |
| ) |
| from .change_handlers import ( |
| make_update_fn, |
| make_model_change_fn, |
| run_on_load, |
| on_aspect_ratio_change |
| ) |
| from .run_handlers import create_run_event |
|
|
| def attach_event_handlers(ui_components, demo): |
| for prefix, task_type in [ |
| ("txt2img", "txt2img"), ("img2img", "img2img"), ("inpaint", "inpaint"), |
| ("outpaint", "outpaint"), ("hires_fix", "hires_fix"), |
| ]: |
|
|
| arch_comp = ui_components.get(f'model_arch_{prefix}') |
| cat_comp = ui_components.get(f'model_cat_{prefix}') |
| model_comp = ui_components.get(f'base_model_{prefix}') |
| clip_skip_comp = ui_components.get(f'clip_skip_{prefix}') or ui_components.get(f'{prefix}_clip_skip') |
| guidance_comp = ui_components.get(f'guidance_{prefix}') or ui_components.get(f'{prefix}_guidance') |
| aspect_ratio_comp = ui_components.get(f'aspect_ratio_{prefix}') or ui_components.get(f'{prefix}_aspect_ratio_dropdown') |
| width_comp = ui_components.get(f'width_{prefix}') or ui_components.get(f'{prefix}_width') |
| height_comp = ui_components.get(f'height_{prefix}') or ui_components.get(f'{prefix}_height') |
| |
| cn_types_list = ui_components.get(f'controlnet_types_{prefix}', []) |
| cn_series_list = ui_components.get(f'controlnet_series_{prefix}', []) |
| cn_filepaths_list = ui_components.get(f'controlnet_filepaths_{prefix}', []) |
| |
| anima_cn_types_list = ui_components.get(f'anima_controlnet_lllite_types_{prefix}', []) |
| anima_cn_series_list = ui_components.get(f'anima_controlnet_lllite_series_{prefix}', []) |
| anima_cn_filepaths_list = ui_components.get(f'anima_controlnet_lllite_filepaths_{prefix}', []) |
|
|
| diffsynth_cn_types_list = ui_components.get(f'diffsynth_controlnet_types_{prefix}', []) |
| diffsynth_cn_series_list = ui_components.get(f'diffsynth_controlnet_series_{prefix}', []) |
| diffsynth_cn_filepaths_list = ui_components.get(f'diffsynth_controlnet_filepaths_{prefix}', []) |
| |
| lora_accordion = ui_components.get(f'lora_accordion_{prefix}') |
| cn_accordion = ui_components.get(f'controlnet_accordion_{prefix}') |
| anima_cn_accordion = ui_components.get(f'anima_controlnet_lllite_accordion_{prefix}') |
| diffsynth_cn_accordion = ui_components.get(f'diffsynth_controlnet_accordion_{prefix}') |
| ipa_accordion = ui_components.get(f'ipadapter_accordion_{prefix}') |
| sd3_ipa_accordion = ui_components.get(f'sd3_ipadapter_accordion_{prefix}') |
| flux1_ipa_accordion = ui_components.get(f'flux1_ipadapter_accordion_{prefix}') |
| style_accordion = ui_components.get(f'style_accordion_{prefix}') |
| embedding_accordion = ui_components.get(f'embedding_accordion_{prefix}') |
| conditioning_accordion = ui_components.get(f'conditioning_accordion_{prefix}') |
| ref_latent_accordion = ui_components.get(f'reference_latent_accordion_{prefix}') |
| hidream_o1_ref_accordion = ui_components.get(f'hidream_o1_reference_accordion_{prefix}') |
| pid_accordion = ui_components.get(f'pid_accordion_{prefix}') |
| vae_accordion = ui_components.get(f'vae_accordion_{prefix}') |
| |
| ipa_preset_list = ui_components.get(f'ipadapter_final_preset_{prefix}') |
| |
| prompt_comp = ui_components.get(f'prompt_{prefix}') or ui_components.get(f'{prefix}_positive_prompt') |
| neg_prompt_comp = ui_components.get(f'neg_prompt_{prefix}') or ui_components.get(f'{prefix}_negative_prompt') |
| steps_comp = ui_components.get(f'steps_{prefix}') or ui_components.get(f'{prefix}_steps') |
| cfg_comp = ui_components.get(f'cfg_{prefix}') or ui_components.get(f'{prefix}_cfg') |
| sampler_comp = ui_components.get(f'sampler_{prefix}') or ui_components.get(f'{prefix}_sampler_name') |
| scheduler_comp = ui_components.get(f'scheduler_{prefix}') or ui_components.get(f'{prefix}_scheduler') |
| |
| extra_comps = [prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, width_comp, height_comp] |
| valid_extra_comps = [c for c in extra_comps if c is not None] |
| |
| if arch_comp and cat_comp and model_comp: |
| outputs = [model_comp, cat_comp] |
| if clip_skip_comp: outputs.append(clip_skip_comp) |
| if guidance_comp: outputs.append(guidance_comp) |
| if aspect_ratio_comp: outputs.append(aspect_ratio_comp) |
| outputs.extend(cn_types_list + cn_series_list + cn_filepaths_list) |
| outputs.extend(anima_cn_types_list + anima_cn_series_list + anima_cn_filepaths_list) |
| outputs.extend(diffsynth_cn_types_list + diffsynth_cn_series_list + diffsynth_cn_filepaths_list) |
| if lora_accordion: outputs.append(lora_accordion) |
| if cn_accordion: outputs.append(cn_accordion) |
| if anima_cn_accordion: outputs.append(anima_cn_accordion) |
| if diffsynth_cn_accordion: outputs.append(diffsynth_cn_accordion) |
| if ipa_accordion: outputs.append(ipa_accordion) |
| if sd3_ipa_accordion: outputs.append(sd3_ipa_accordion) |
| if flux1_ipa_accordion: outputs.append(flux1_ipa_accordion) |
| if style_accordion: outputs.append(style_accordion) |
| if embedding_accordion: outputs.append(embedding_accordion) |
| if conditioning_accordion: outputs.append(conditioning_accordion) |
| if ref_latent_accordion: outputs.append(ref_latent_accordion) |
| if hidream_o1_ref_accordion: outputs.append(hidream_o1_ref_accordion) |
| if pid_accordion: outputs.append(pid_accordion) |
| if vae_accordion: outputs.append(vae_accordion) |
| if ipa_preset_list: outputs.append(ipa_preset_list) |
| |
| outputs.extend(valid_extra_comps) |
| |
| update_fn = make_update_fn( |
| model_comp, cat_comp, clip_skip_comp, aspect_ratio_comp, width_comp, height_comp, |
| cn_types_list, cn_series_list, cn_filepaths_list, |
| anima_cn_types_list, anima_cn_series_list, anima_cn_filepaths_list, |
| diffsynth_cn_types_list, diffsynth_cn_series_list, diffsynth_cn_filepaths_list, |
| ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion, |
| ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, |
| pid_acc=pid_accordion, vae_acc=vae_accordion |
| ) |
| inputs = [arch_comp, cat_comp] |
| if aspect_ratio_comp: |
| inputs.append(aspect_ratio_comp) |
| arch_comp.change(fn=update_fn, inputs=inputs, outputs=outputs) |
| cat_comp.change(fn=update_fn, inputs=inputs, outputs=outputs) |
|
|
| if model_comp: |
| outputs2 = [] |
| if arch_comp: outputs2.append(arch_comp) |
| if cat_comp: outputs2.append(cat_comp) |
| if clip_skip_comp: outputs2.append(clip_skip_comp) |
| if guidance_comp: outputs2.append(guidance_comp) |
| if aspect_ratio_comp: outputs2.append(aspect_ratio_comp) |
| outputs2.extend(cn_types_list + cn_series_list + cn_filepaths_list) |
| outputs2.extend(anima_cn_types_list + anima_cn_series_list + anima_cn_filepaths_list) |
| outputs2.extend(diffsynth_cn_types_list + diffsynth_cn_series_list + diffsynth_cn_filepaths_list) |
| if lora_accordion: outputs2.append(lora_accordion) |
| if cn_accordion: outputs2.append(cn_accordion) |
| if anima_cn_accordion: outputs2.append(anima_cn_accordion) |
| if diffsynth_cn_accordion: outputs2.append(diffsynth_cn_accordion) |
| if ipa_accordion: outputs2.append(ipa_accordion) |
| if sd3_ipa_accordion: outputs2.append(sd3_ipa_accordion) |
| if flux1_ipa_accordion: outputs2.append(flux1_ipa_accordion) |
| if style_accordion: outputs2.append(style_accordion) |
| if embedding_accordion: outputs2.append(embedding_accordion) |
| if conditioning_accordion: outputs2.append(conditioning_accordion) |
| if ref_latent_accordion: outputs2.append(ref_latent_accordion) |
| if hidream_o1_ref_accordion: outputs2.append(hidream_o1_ref_accordion) |
| if pid_accordion: outputs2.append(pid_accordion) |
| if vae_accordion: outputs2.append(vae_accordion) |
| if ipa_preset_list: outputs2.append(ipa_preset_list) |
| |
| outputs2.extend(valid_extra_comps) |
| |
| if outputs2: |
| inputs2 = [model_comp] |
| if arch_comp: inputs2.append(arch_comp) |
| if cat_comp: inputs2.append(cat_comp) |
| if aspect_ratio_comp: inputs2.append(aspect_ratio_comp) |
| change_fn = make_model_change_fn( |
| cat_comp, clip_skip_comp, aspect_ratio_comp, width_comp, height_comp, |
| cn_types_list, cn_series_list, cn_filepaths_list, |
| anima_cn_types_list, anima_cn_series_list, anima_cn_filepaths_list, |
| diffsynth_cn_types_list, diffsynth_cn_series_list, diffsynth_cn_filepaths_list, |
| arch_comp, ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion, |
| ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, |
| pid_acc=pid_accordion, vae_acc=vae_accordion |
| ) |
| model_comp.change(fn=change_fn, inputs=inputs2, outputs=outputs2) |
|
|
| create_lora_event_handlers(prefix, ui_components) |
| create_controlnet_event_handlers(prefix, ui_components) |
| create_anima_controlnet_lllite_event_handlers(prefix, ui_components) |
| create_diffsynth_controlnet_event_handlers(prefix, ui_components) |
| create_ipadapter_event_handlers(prefix, ui_components) |
| create_embedding_event_handlers(prefix, ui_components) |
| create_conditioning_event_handlers(prefix, ui_components) |
| create_flux1_ipadapter_event_handlers(prefix, ui_components) |
| create_sd3_ipadapter_event_handlers(prefix, ui_components) |
| create_style_event_handlers(prefix, ui_components) |
| create_reference_latent_event_handlers(prefix, ui_components) |
| create_hidream_o1_reference_event_handlers(prefix, ui_components) |
| create_run_event(prefix, task_type, ui_components) |
|
|
| if 'view_mode_inpaint' in ui_components: |
| def toggle_inpaint_fullscreen_view(view_mode): |
| is_fullscreen = (view_mode == "Fullscreen View") |
| other_elements_visible = not is_fullscreen |
| editor_height = 800 if is_fullscreen else 272 |
| |
| updates = { |
| ui_components['prompts_column_inpaint']: gr.update(visible=other_elements_visible), |
| ui_components['params_and_gallery_row_inpaint']: gr.update(visible=other_elements_visible), |
| ui_components['accordion_wrapper_inpaint']: gr.update(visible=other_elements_visible), |
| ui_components['input_image_dict_inpaint']: gr.update(height=editor_height), |
| } |
| |
| model_and_run_rows = ui_components.get('model_and_run_row_inpaint', []) |
| for row in model_and_run_rows: |
| updates[row] = gr.update(visible=other_elements_visible) |
| |
| return updates |
| |
| output_components = [] |
| model_and_run_rows = ui_components.get('model_and_run_row_inpaint', []) |
| if isinstance(model_and_run_rows, list): |
| output_components.extend(model_and_run_rows) |
| else: |
| output_components.append(model_and_run_rows) |
| |
| output_components.extend([ |
| ui_components['prompts_column_inpaint'], |
| ui_components['params_and_gallery_row_inpaint'], |
| ui_components['accordion_wrapper_inpaint'], |
| ui_components['input_image_dict_inpaint'] |
| ]) |
| |
| ui_components['view_mode_inpaint'].change( |
| fn=toggle_inpaint_fullscreen_view, |
| inputs=[ui_components['view_mode_inpaint']], |
| outputs=output_components, |
| show_progress=False |
| ) |
|
|
| all_load_outputs = [] |
| for prefix in ["txt2img", "img2img", "inpaint", "outpaint", "hires_fix"]: |
| if f'controlnet_types_{prefix}' in ui_components: |
| all_load_outputs.extend(ui_components[f'controlnet_types_{prefix}']) |
| all_load_outputs.extend(ui_components[f'controlnet_series_{prefix}']) |
| all_load_outputs.extend(ui_components[f'controlnet_filepaths_{prefix}']) |
| if f'anima_controlnet_lllite_types_{prefix}' in ui_components: |
| all_load_outputs.extend(ui_components[f'anima_controlnet_lllite_types_{prefix}']) |
| all_load_outputs.extend(ui_components[f'anima_controlnet_lllite_series_{prefix}']) |
| all_load_outputs.extend(ui_components[f'anima_controlnet_lllite_filepaths_{prefix}']) |
| if f'diffsynth_controlnet_types_{prefix}' in ui_components: |
| all_load_outputs.extend(ui_components[f'diffsynth_controlnet_types_{prefix}']) |
| all_load_outputs.extend(ui_components[f'diffsynth_controlnet_series_{prefix}']) |
| all_load_outputs.extend(ui_components[f'diffsynth_controlnet_filepaths_{prefix}']) |
| if f'ipadapter_final_preset_{prefix}' in ui_components: |
| all_load_outputs.extend(ui_components[f'ipadapter_lora_strengths_{prefix}']) |
| all_load_outputs.append(ui_components[f'ipadapter_final_preset_{prefix}']) |
| all_load_outputs.append(ui_components[f'ipadapter_final_lora_strength_{prefix}']) |
|
|
| if all_load_outputs: |
| demo.load( |
| fn=lambda: run_on_load(ui_components), |
| outputs=all_load_outputs |
| ) |
|
|
| for prefix in ["txt2img", "img2img", "inpaint", "outpaint", "hires_fix"]: |
| aspect_ratio_dropdown = ui_components.get(f'aspect_ratio_{prefix}') or ui_components.get(f'{prefix}_aspect_ratio_dropdown') |
| width_component = ui_components.get(f'width_{prefix}') or ui_components.get(f'{prefix}_width') |
| height_component = ui_components.get(f'height_{prefix}') or ui_components.get(f'{prefix}_height') |
| model_dropdown = ui_components.get(f'base_model_{prefix}') |
| if aspect_ratio_dropdown and width_component and height_component and model_dropdown: |
| aspect_ratio_dropdown.change(fn=on_aspect_ratio_change, inputs=[aspect_ratio_dropdown, model_dropdown], outputs=[width_component, height_component], show_progress=False) |