File size: 14,890 Bytes
54e3410
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
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}')
        
        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 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
            )
            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 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
                )
                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)