mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2024-12-29 19:05:05 +08:00
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
This commit is contained in:
parent
a2a1a2f727
commit
e5b4e3f820
@ -174,9 +174,9 @@ def save_pil_to_file(pil_image, dir=None):
|
|||||||
gr.processing_utils.save_pil_to_file = save_pil_to_file
|
gr.processing_utils.save_pil_to_file = save_pil_to_file
|
||||||
|
|
||||||
|
|
||||||
def wrap_gradio_call(func, extra_outputs=None):
|
def wrap_gradio_call(func, extra_outputs=None, add_stats=False):
|
||||||
def f(*args, extra_outputs_array=extra_outputs, **kwargs):
|
def f(*args, extra_outputs_array=extra_outputs, **kwargs):
|
||||||
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled
|
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats
|
||||||
if run_memmon:
|
if run_memmon:
|
||||||
shared.mem_mon.monitor()
|
shared.mem_mon.monitor()
|
||||||
t = time.perf_counter()
|
t = time.perf_counter()
|
||||||
@ -203,11 +203,18 @@ def wrap_gradio_call(func, extra_outputs=None):
|
|||||||
|
|
||||||
res = extra_outputs_array + [f"<div class='error'>{plaintext_to_html(type(e).__name__+': '+str(e))}</div>"]
|
res = extra_outputs_array + [f"<div class='error'>{plaintext_to_html(type(e).__name__+': '+str(e))}</div>"]
|
||||||
|
|
||||||
|
shared.state.skipped = False
|
||||||
|
shared.state.interrupted = False
|
||||||
|
shared.state.job_count = 0
|
||||||
|
|
||||||
|
if not add_stats:
|
||||||
|
return tuple(res)
|
||||||
|
|
||||||
elapsed = time.perf_counter() - t
|
elapsed = time.perf_counter() - t
|
||||||
elapsed_m = int(elapsed // 60)
|
elapsed_m = int(elapsed // 60)
|
||||||
elapsed_s = elapsed % 60
|
elapsed_s = elapsed % 60
|
||||||
elapsed_text = f"{elapsed_s:.2f}s"
|
elapsed_text = f"{elapsed_s:.2f}s"
|
||||||
if (elapsed_m > 0):
|
if elapsed_m > 0:
|
||||||
elapsed_text = f"{elapsed_m}m "+elapsed_text
|
elapsed_text = f"{elapsed_m}m "+elapsed_text
|
||||||
|
|
||||||
if run_memmon:
|
if run_memmon:
|
||||||
@ -225,10 +232,6 @@ def wrap_gradio_call(func, extra_outputs=None):
|
|||||||
# last item is always HTML
|
# last item is always HTML
|
||||||
res[-1] += f"<div class='performance'><p class='time'>Time taken: <wbr>{elapsed_text}</p>{vram_html}</div>"
|
res[-1] += f"<div class='performance'><p class='time'>Time taken: <wbr>{elapsed_text}</p>{vram_html}</div>"
|
||||||
|
|
||||||
shared.state.skipped = False
|
|
||||||
shared.state.interrupted = False
|
|
||||||
shared.state.job_count = 0
|
|
||||||
|
|
||||||
return tuple(res)
|
return tuple(res)
|
||||||
|
|
||||||
return f
|
return f
|
||||||
@ -1436,7 +1439,7 @@ def create_ui(wrap_gradio_gpu_call):
|
|||||||
opts.reorder()
|
opts.reorder()
|
||||||
|
|
||||||
def run_settings(*args):
|
def run_settings(*args):
|
||||||
changed = 0
|
changed = []
|
||||||
|
|
||||||
for key, value, comp in zip(opts.data_labels.keys(), args, components):
|
for key, value, comp in zip(opts.data_labels.keys(), args, components):
|
||||||
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__}"
|
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 create_ui(wrap_gradio_gpu_call):
|
|||||||
if opts.data_labels[key].onchange is not None:
|
if opts.data_labels[key].onchange is not None:
|
||||||
opts.data_labels[key].onchange()
|
opts.data_labels[key].onchange()
|
||||||
|
|
||||||
changed += 1
|
changed.append(key)
|
||||||
try:
|
try:
|
||||||
opts.save(shared.config_filename)
|
opts.save(shared.config_filename)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
return opts.dumpjson(), f'{changed} settings changed without save.'
|
return opts.dumpjson(), f'{len(changed)} settings changed without save: {", ".join(changed)}.'
|
||||||
return opts.dumpjson(), f'{changed} settings changed.'
|
return opts.dumpjson(), f'{len(changed)} settings changed: {", ".join(changed)}.'
|
||||||
|
|
||||||
def run_settings_single(value, key):
|
def run_settings_single(value, key):
|
||||||
if not opts.same_type(value, opts.data_labels[key].default):
|
if not opts.same_type(value, opts.data_labels[key].default):
|
||||||
|
@ -140,13 +140,15 @@ def install_extension_from_url(dirname, url):
|
|||||||
shutil.rmtree(tmpdir, True)
|
shutil.rmtree(tmpdir, True)
|
||||||
|
|
||||||
|
|
||||||
def install_extension_from_index(url):
|
def install_extension_from_index(url, hide_tags):
|
||||||
ext_table, message = install_extension_from_url(None, url)
|
ext_table, message = install_extension_from_url(None, url)
|
||||||
|
|
||||||
return refresh_available_extensions_from_data(), ext_table, message
|
code, _ = refresh_available_extensions_from_data(hide_tags)
|
||||||
|
|
||||||
|
return code, ext_table, message
|
||||||
|
|
||||||
|
|
||||||
def refresh_available_extensions(url):
|
def refresh_available_extensions(url, hide_tags):
|
||||||
global available_extensions
|
global available_extensions
|
||||||
|
|
||||||
import urllib.request
|
import urllib.request
|
||||||
@ -155,13 +157,25 @@ def refresh_available_extensions(url):
|
|||||||
|
|
||||||
available_extensions = json.loads(text)
|
available_extensions = json.loads(text)
|
||||||
|
|
||||||
return url, refresh_available_extensions_from_data(), ''
|
code, tags = refresh_available_extensions_from_data(hide_tags)
|
||||||
|
|
||||||
|
return url, code, gr.CheckboxGroup.update(choices=tags), ''
|
||||||
|
|
||||||
|
|
||||||
def refresh_available_extensions_from_data():
|
def refresh_available_extensions_for_tags(hide_tags):
|
||||||
|
code, _ = refresh_available_extensions_from_data(hide_tags)
|
||||||
|
|
||||||
|
return code, ''
|
||||||
|
|
||||||
|
|
||||||
|
def refresh_available_extensions_from_data(hide_tags):
|
||||||
extlist = available_extensions["extensions"]
|
extlist = available_extensions["extensions"]
|
||||||
installed_extension_urls = {normalize_git_url(extension.remote): extension.name for extension in extensions.extensions}
|
installed_extension_urls = {normalize_git_url(extension.remote): extension.name for extension in extensions.extensions}
|
||||||
|
|
||||||
|
tags = available_extensions.get("tags", {})
|
||||||
|
tags_to_hide = set(hide_tags)
|
||||||
|
hidden = 0
|
||||||
|
|
||||||
code = f"""<!-- {time.time()} -->
|
code = f"""<!-- {time.time()} -->
|
||||||
<table id="available_extensions">
|
<table id="available_extensions">
|
||||||
<thead>
|
<thead>
|
||||||
@ -178,17 +192,24 @@ def refresh_available_extensions_from_data():
|
|||||||
name = ext.get("name", "noname")
|
name = ext.get("name", "noname")
|
||||||
url = ext.get("url", None)
|
url = ext.get("url", None)
|
||||||
description = ext.get("description", "")
|
description = ext.get("description", "")
|
||||||
|
extension_tags = ext.get("tags", [])
|
||||||
|
|
||||||
if url is None:
|
if url is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if len([x for x in extension_tags if x in tags_to_hide]) > 0:
|
||||||
|
hidden += 1
|
||||||
|
continue
|
||||||
|
|
||||||
existing = installed_extension_urls.get(normalize_git_url(url), None)
|
existing = installed_extension_urls.get(normalize_git_url(url), None)
|
||||||
|
|
||||||
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">"""
|
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">"""
|
||||||
|
|
||||||
|
tags_text = ", ".join([f"<span class='extension-tag' title='{tags.get(x, '')}'>{x}</span>" for x in extension_tags])
|
||||||
|
|
||||||
code += f"""
|
code += f"""
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{html.escape(url)}" target="_blank">{html.escape(name)}</a></td>
|
<td><a href="{html.escape(url)}" target="_blank">{html.escape(name)}</a><br />{tags_text}</td>
|
||||||
<td>{html.escape(description)}</td>
|
<td>{html.escape(description)}</td>
|
||||||
<td>{install_code}</td>
|
<td>{install_code}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -199,7 +220,10 @@ def refresh_available_extensions_from_data():
|
|||||||
</table>
|
</table>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return code
|
if hidden > 0:
|
||||||
|
code += f"<p>Extension hidden: {hidden}</p>"
|
||||||
|
|
||||||
|
return code, list(tags)
|
||||||
|
|
||||||
|
|
||||||
def create_ui():
|
def create_ui():
|
||||||
@ -238,21 +262,30 @@ def create_ui():
|
|||||||
extension_to_install = gr.Text(elem_id="extension_to_install", visible=False)
|
extension_to_install = gr.Text(elem_id="extension_to_install", visible=False)
|
||||||
install_extension_button = gr.Button(elem_id="install_extension_button", visible=False)
|
install_extension_button = gr.Button(elem_id="install_extension_button", visible=False)
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
|
hide_tags = gr.CheckboxGroup(value=["ads", "localization"], label="Hide extensions with tags", choices=["script", "ads", "localization"])
|
||||||
|
|
||||||
install_result = gr.HTML()
|
install_result = gr.HTML()
|
||||||
available_extensions_table = gr.HTML()
|
available_extensions_table = gr.HTML()
|
||||||
|
|
||||||
refresh_available_extensions_button.click(
|
refresh_available_extensions_button.click(
|
||||||
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update()]),
|
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]),
|
||||||
inputs=[available_extensions_index],
|
inputs=[available_extensions_index, hide_tags],
|
||||||
outputs=[available_extensions_index, available_extensions_table, install_result],
|
outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result],
|
||||||
)
|
)
|
||||||
|
|
||||||
install_extension_button.click(
|
install_extension_button.click(
|
||||||
fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]),
|
fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]),
|
||||||
inputs=[extension_to_install],
|
inputs=[extension_to_install, hide_tags],
|
||||||
outputs=[available_extensions_table, extensions_table, install_result],
|
outputs=[available_extensions_table, extensions_table, install_result],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
hide_tags.change(
|
||||||
|
fn=modules.ui.wrap_gradio_call(refresh_available_extensions_for_tags, extra_outputs=[gr.update()]),
|
||||||
|
inputs=[hide_tags],
|
||||||
|
outputs=[available_extensions_table, install_result]
|
||||||
|
)
|
||||||
|
|
||||||
with gr.TabItem("Install from URL"):
|
with gr.TabItem("Install from URL"):
|
||||||
install_url = gr.Text(label="URL for extension's git repository")
|
install_url = gr.Text(label="URL for extension's git repository")
|
||||||
install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto")
|
install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto")
|
||||||
|
@ -563,6 +563,11 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.extension-tag{
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
/* The following handles localization for right-to-left (RTL) languages like Arabic.
|
/* The following handles localization for right-to-left (RTL) languages like Arabic.
|
||||||
The rtl media type will only be activated by the logic in javascript/localization.js.
|
The rtl media type will only be activated by the logic in javascript/localization.js.
|
||||||
If you change anything above, you need to make sure it is RTL compliant by just running
|
If you change anything above, you need to make sure it is RTL compliant by just running
|
||||||
|
Loading…
Reference in New Issue
Block a user