stable-diffusion-webui
144 строки · 4.0 Кб
1import gradio as gr
2
3
4class FormComponent:
5def get_expected_parent(self):
6return gr.components.Form
7
8
9gr.Dropdown.get_expected_parent = FormComponent.get_expected_parent
10
11
12class ToolButton(FormComponent, gr.Button):
13"""Small button with single emoji as text, fits inside gradio forms"""
14
15def __init__(self, *args, **kwargs):
16classes = kwargs.pop("elem_classes", [])
17super().__init__(*args, elem_classes=["tool", *classes], **kwargs)
18
19def get_block_name(self):
20return "button"
21
22
23class ResizeHandleRow(gr.Row):
24"""Same as gr.Row but fits inside gradio forms"""
25
26def __init__(self, **kwargs):
27super().__init__(**kwargs)
28
29self.elem_classes.append("resize-handle-row")
30
31def get_block_name(self):
32return "row"
33
34
35class FormRow(FormComponent, gr.Row):
36"""Same as gr.Row but fits inside gradio forms"""
37
38def get_block_name(self):
39return "row"
40
41
42class FormColumn(FormComponent, gr.Column):
43"""Same as gr.Column but fits inside gradio forms"""
44
45def get_block_name(self):
46return "column"
47
48
49class FormGroup(FormComponent, gr.Group):
50"""Same as gr.Group but fits inside gradio forms"""
51
52def get_block_name(self):
53return "group"
54
55
56class FormHTML(FormComponent, gr.HTML):
57"""Same as gr.HTML but fits inside gradio forms"""
58
59def get_block_name(self):
60return "html"
61
62
63class FormColorPicker(FormComponent, gr.ColorPicker):
64"""Same as gr.ColorPicker but fits inside gradio forms"""
65
66def get_block_name(self):
67return "colorpicker"
68
69
70class DropdownMulti(FormComponent, gr.Dropdown):
71"""Same as gr.Dropdown but always multiselect"""
72def __init__(self, **kwargs):
73super().__init__(multiselect=True, **kwargs)
74
75def get_block_name(self):
76return "dropdown"
77
78
79class DropdownEditable(FormComponent, gr.Dropdown):
80"""Same as gr.Dropdown but allows editing value"""
81def __init__(self, **kwargs):
82super().__init__(allow_custom_value=True, **kwargs)
83
84def get_block_name(self):
85return "dropdown"
86
87
88class InputAccordion(gr.Checkbox):
89"""A gr.Accordion that can be used as an input - returns True if open, False if closed.
90
91Actaully just a hidden checkbox, but creates an accordion that follows and is followed by the state of the checkbox.
92"""
93
94global_index = 0
95
96def __init__(self, value, **kwargs):
97self.accordion_id = kwargs.get('elem_id')
98if self.accordion_id is None:
99self.accordion_id = f"input-accordion-{InputAccordion.global_index}"
100InputAccordion.global_index += 1
101
102kwargs_checkbox = {
103**kwargs,
104"elem_id": f"{self.accordion_id}-checkbox",
105"visible": False,
106}
107super().__init__(value, **kwargs_checkbox)
108
109self.change(fn=None, _js='function(checked){ inputAccordionChecked("' + self.accordion_id + '", checked); }', inputs=[self])
110
111kwargs_accordion = {
112**kwargs,
113"elem_id": self.accordion_id,
114"label": kwargs.get('label', 'Accordion'),
115"elem_classes": ['input-accordion'],
116"open": value,
117}
118self.accordion = gr.Accordion(**kwargs_accordion)
119
120def extra(self):
121"""Allows you to put something into the label of the accordion.
122
123Use it like this:
124
125```
126with InputAccordion(False, label="Accordion") as acc:
127with acc.extra():
128FormHTML(value="hello", min_width=0)
129
130...
131```
132"""
133
134return gr.Column(elem_id=self.accordion_id + '-extra', elem_classes='input-accordion-extra', min_width=0)
135
136def __enter__(self):
137self.accordion.__enter__()
138return self
139
140def __exit__(self, exc_type, exc_val, exc_tb):
141self.accordion.__exit__(exc_type, exc_val, exc_tb)
142
143def get_block_name(self):
144return "checkbox"
145
146