Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AUTOMATIC1111
GitHub Repository: AUTOMATIC1111/stable-diffusion-webui
Path: blob/master/extensions-builtin/extra-options-section/scripts/extra_options_section.py
2448 views
1
import math
2
3
import gradio as gr
4
from modules import scripts, shared, ui_components, ui_settings, infotext_utils, errors
5
from modules.ui_components import FormColumn
6
7
8
class ExtraOptionsSection(scripts.Script):
9
section = "extra_options"
10
11
def __init__(self):
12
self.comps = None
13
self.setting_names = None
14
15
def title(self):
16
return "Extra options"
17
18
def show(self, is_img2img):
19
return scripts.AlwaysVisible
20
21
def ui(self, is_img2img):
22
self.comps = []
23
self.setting_names = []
24
self.infotext_fields = []
25
extra_options = shared.opts.extra_options_img2img if is_img2img else shared.opts.extra_options_txt2img
26
elem_id_tabname = "extra_options_" + ("img2img" if is_img2img else "txt2img")
27
28
mapping = {k: v for v, k in infotext_utils.infotext_to_setting_name_mapping}
29
30
with gr.Blocks() as interface:
31
with gr.Accordion("Options", open=False, elem_id=elem_id_tabname) if shared.opts.extra_options_accordion and extra_options else gr.Group(elem_id=elem_id_tabname):
32
33
row_count = math.ceil(len(extra_options) / shared.opts.extra_options_cols)
34
35
for row in range(row_count):
36
with gr.Row():
37
for col in range(shared.opts.extra_options_cols):
38
index = row * shared.opts.extra_options_cols + col
39
if index >= len(extra_options):
40
break
41
42
setting_name = extra_options[index]
43
44
with FormColumn():
45
try:
46
comp = ui_settings.create_setting_component(setting_name)
47
except KeyError:
48
errors.report(f"Can't add extra options for {setting_name} in ui")
49
continue
50
51
self.comps.append(comp)
52
self.setting_names.append(setting_name)
53
54
setting_infotext_name = mapping.get(setting_name)
55
if setting_infotext_name is not None:
56
self.infotext_fields.append((comp, setting_infotext_name))
57
58
def get_settings_values():
59
res = [ui_settings.get_value_for_setting(key) for key in self.setting_names]
60
return res[0] if len(res) == 1 else res
61
62
interface.load(fn=get_settings_values, inputs=[], outputs=self.comps, queue=False, show_progress=False)
63
64
return self.comps
65
66
def before_process(self, p, *args):
67
for name, value in zip(self.setting_names, args):
68
if name not in p.override_settings:
69
p.override_settings[name] = value
70
71
72
shared.options_templates.update(shared.options_section(('settings_in_ui', "Settings in UI", "ui"), {
73
"settings_in_ui": shared.OptionHTML("""
74
This page allows you to add some settings to the main interface of txt2img and img2img tabs.
75
"""),
76
"extra_options_txt2img": shared.OptionInfo([], "Settings for txt2img", ui_components.DropdownMulti, lambda: {"choices": list(shared.opts.data_labels.keys())}).js("info", "settingsHintsShowQuicksettings").info("setting entries that also appear in txt2img interfaces").needs_reload_ui(),
77
"extra_options_img2img": shared.OptionInfo([], "Settings for img2img", ui_components.DropdownMulti, lambda: {"choices": list(shared.opts.data_labels.keys())}).js("info", "settingsHintsShowQuicksettings").info("setting entries that also appear in img2img interfaces").needs_reload_ui(),
78
"extra_options_cols": shared.OptionInfo(1, "Number of columns for added settings", gr.Slider, {"step": 1, "minimum": 1, "maximum": 20}).info("displayed amount will depend on the actual browser window width").needs_reload_ui(),
79
"extra_options_accordion": shared.OptionInfo(False, "Place added settings into an accordion").needs_reload_ui()
80
}))
81
82
83
84