Skip to content

Commit e5b4e3f

Browse files
committed
add tags to extensions, and ability to filter out tags
list changed Settings keys in UI do not print VRAM/etc stats everywhere but in calls that use GPU
1 parent a2a1a2f commit e5b4e3f

File tree

4 files changed

+64
-23
lines changed

4 files changed

+64
-23
lines changed

Diff for: modules/ui.py

+14-11
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,9 @@ def save_pil_to_file(pil_image, dir=None):
174174
gr.processing_utils.save_pil_to_file = save_pil_to_file
175175

176176

177-
def wrap_gradio_call(func, extra_outputs=None):
177+
def wrap_gradio_call(func, extra_outputs=None, add_stats=False):
178178
def f(*args, extra_outputs_array=extra_outputs, **kwargs):
179-
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled
179+
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats
180180
if run_memmon:
181181
shared.mem_mon.monitor()
182182
t = time.perf_counter()
@@ -203,11 +203,18 @@ def f(*args, extra_outputs_array=extra_outputs, **kwargs):
203203

204204
res = extra_outputs_array + [f"<div class='error'>{plaintext_to_html(type(e).__name__+': '+str(e))}</div>"]
205205

206+
shared.state.skipped = False
207+
shared.state.interrupted = False
208+
shared.state.job_count = 0
209+
210+
if not add_stats:
211+
return tuple(res)
212+
206213
elapsed = time.perf_counter() - t
207214
elapsed_m = int(elapsed // 60)
208215
elapsed_s = elapsed % 60
209216
elapsed_text = f"{elapsed_s:.2f}s"
210-
if (elapsed_m > 0):
217+
if elapsed_m > 0:
211218
elapsed_text = f"{elapsed_m}m "+elapsed_text
212219

213220
if run_memmon:
@@ -225,10 +232,6 @@ def f(*args, extra_outputs_array=extra_outputs, **kwargs):
225232
# last item is always HTML
226233
res[-1] += f"<div class='performance'><p class='time'>Time taken: <wbr>{elapsed_text}</p>{vram_html}</div>"
227234

228-
shared.state.skipped = False
229-
shared.state.interrupted = False
230-
shared.state.job_count = 0
231-
232235
return tuple(res)
233236

234237
return f
@@ -1436,7 +1439,7 @@ def fun():
14361439
opts.reorder()
14371440

14381441
def run_settings(*args):
1439-
changed = 0
1442+
changed = []
14401443

14411444
for key, value, comp in zip(opts.data_labels.keys(), args, components):
14421445
assert comp == dummy_component or opts.same_type(value, opts.data_labels[key].default), f"Bad value for setting {key}: {value}; expecting {type(opts.data_labels[key].default).__name__}"
@@ -1454,12 +1457,12 @@ def run_settings(*args):
14541457
if opts.data_labels[key].onchange is not None:
14551458
opts.data_labels[key].onchange()
14561459

1457-
changed += 1
1460+
changed.append(key)
14581461
try:
14591462
opts.save(shared.config_filename)
14601463
except RuntimeError:
1461-
return opts.dumpjson(), f'{changed} settings changed without save.'
1462-
return opts.dumpjson(), f'{changed} settings changed.'
1464+
return opts.dumpjson(), f'{len(changed)} settings changed without save: {", ".join(changed)}.'
1465+
return opts.dumpjson(), f'{len(changed)} settings changed: {", ".join(changed)}.'
14631466

14641467
def run_settings_single(value, key):
14651468
if not opts.same_type(value, opts.data_labels[key].default):

Diff for: modules/ui_extensions.py

+44-11
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,15 @@ def install_extension_from_url(dirname, url):
140140
shutil.rmtree(tmpdir, True)
141141

142142

143-
def install_extension_from_index(url):
143+
def install_extension_from_index(url, hide_tags):
144144
ext_table, message = install_extension_from_url(None, url)
145145

146-
return refresh_available_extensions_from_data(), ext_table, message
146+
code, _ = refresh_available_extensions_from_data(hide_tags)
147147

148+
return code, ext_table, message
148149

149-
def refresh_available_extensions(url):
150+
151+
def refresh_available_extensions(url, hide_tags):
150152
global available_extensions
151153

152154
import urllib.request
@@ -155,13 +157,25 @@ def refresh_available_extensions(url):
155157

156158
available_extensions = json.loads(text)
157159

158-
return url, refresh_available_extensions_from_data(), ''
160+
code, tags = refresh_available_extensions_from_data(hide_tags)
161+
162+
return url, code, gr.CheckboxGroup.update(choices=tags), ''
163+
164+
165+
def refresh_available_extensions_for_tags(hide_tags):
166+
code, _ = refresh_available_extensions_from_data(hide_tags)
159167

168+
return code, ''
160169

161-
def refresh_available_extensions_from_data():
170+
171+
def refresh_available_extensions_from_data(hide_tags):
162172
extlist = available_extensions["extensions"]
163173
installed_extension_urls = {normalize_git_url(extension.remote): extension.name for extension in extensions.extensions}
164174

175+
tags = available_extensions.get("tags", {})
176+
tags_to_hide = set(hide_tags)
177+
hidden = 0
178+
165179
code = f"""<!-- {time.time()} -->
166180
<table id="available_extensions">
167181
<thead>
@@ -178,17 +192,24 @@ def refresh_available_extensions_from_data():
178192
name = ext.get("name", "noname")
179193
url = ext.get("url", None)
180194
description = ext.get("description", "")
195+
extension_tags = ext.get("tags", [])
181196

182197
if url is None:
183198
continue
184199

200+
if len([x for x in extension_tags if x in tags_to_hide]) > 0:
201+
hidden += 1
202+
continue
203+
185204
existing = installed_extension_urls.get(normalize_git_url(url), None)
186205

187206
install_code = f"""<input onclick="install_extension_from_index(this, '{html.escape(url)}')" type="button" value="{"Install" if not existing else "Installed"}" {"disabled=disabled" if existing else ""} class="gr-button gr-button-lg gr-button-secondary">"""
188207

208+
tags_text = ", ".join([f"<span class='extension-tag' title='{tags.get(x, '')}'>{x}</span>" for x in extension_tags])
209+
189210
code += f"""
190211
<tr>
191-
<td><a href="{html.escape(url)}" target="_blank">{html.escape(name)}</a></td>
212+
<td><a href="{html.escape(url)}" target="_blank">{html.escape(name)}</a><br />{tags_text}</td>
192213
<td>{html.escape(description)}</td>
193214
<td>{install_code}</td>
194215
</tr>
@@ -199,7 +220,10 @@ def refresh_available_extensions_from_data():
199220
</table>
200221
"""
201222

202-
return code
223+
if hidden > 0:
224+
code += f"<p>Extension hidden: {hidden}</p>"
225+
226+
return code, list(tags)
203227

204228

205229
def create_ui():
@@ -238,21 +262,30 @@ def create_ui():
238262
extension_to_install = gr.Text(elem_id="extension_to_install", visible=False)
239263
install_extension_button = gr.Button(elem_id="install_extension_button", visible=False)
240264

265+
with gr.Row():
266+
hide_tags = gr.CheckboxGroup(value=["ads", "localization"], label="Hide extensions with tags", choices=["script", "ads", "localization"])
267+
241268
install_result = gr.HTML()
242269
available_extensions_table = gr.HTML()
243270

244271
refresh_available_extensions_button.click(
245-
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update()]),
246-
inputs=[available_extensions_index],
247-
outputs=[available_extensions_index, available_extensions_table, install_result],
272+
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]),
273+
inputs=[available_extensions_index, hide_tags],
274+
outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result],
248275
)
249276

250277
install_extension_button.click(
251278
fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]),
252-
inputs=[extension_to_install],
279+
inputs=[extension_to_install, hide_tags],
253280
outputs=[available_extensions_table, extensions_table, install_result],
254281
)
255282

283+
hide_tags.change(
284+
fn=modules.ui.wrap_gradio_call(refresh_available_extensions_for_tags, extra_outputs=[gr.update()]),
285+
inputs=[hide_tags],
286+
outputs=[available_extensions_table, install_result]
287+
)
288+
256289
with gr.TabItem("Install from URL"):
257290
install_url = gr.Text(label="URL for extension's git repository")
258291
install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto")

Diff for: style.css

+5
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,11 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
563563
opacity: 0.5;
564564
}
565565

566+
.extension-tag{
567+
font-weight: bold;
568+
font-size: 95%;
569+
}
570+
566571
/* The following handles localization for right-to-left (RTL) languages like Arabic.
567572
The rtl media type will only be activated by the logic in javascript/localization.js.
568573
If you change anything above, you need to make sure it is RTL compliant by just running

Diff for: webui.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def f(*args, **kwargs):
5757

5858
return res
5959

60-
return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs)
60+
return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True)
6161

6262

6363
def initialize():

0 commit comments

Comments
 (0)