Commit e5b4e3f8 authored by AUTOMATIC's avatar AUTOMATIC
Browse files

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
parent a2a1a2f7
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -174,9 +174,9 @@ def save_pil_to_file(pil_image, dir=None):
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):
        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:
            shared.mem_mon.monitor()
        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>"]

        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_m = int(elapsed // 60)
        elapsed_s = elapsed % 60
        elapsed_text = f"{elapsed_s:.2f}s"
        if (elapsed_m > 0):
        if elapsed_m > 0:
            elapsed_text = f"{elapsed_m}m "+elapsed_text

        if run_memmon:
@@ -225,10 +232,6 @@ def wrap_gradio_call(func, extra_outputs=None):
        # last item is always HTML
        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 f
@@ -1436,7 +1439,7 @@ def create_ui(wrap_gradio_gpu_call):
    opts.reorder()

    def run_settings(*args):
        changed = 0
        changed = []

        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__}"
@@ -1454,12 +1457,12 @@ def create_ui(wrap_gradio_gpu_call):
                if opts.data_labels[key].onchange is not None:
                    opts.data_labels[key].onchange()

                changed += 1
                changed.append(key)
        try:
            opts.save(shared.config_filename)
        except RuntimeError:
            return opts.dumpjson(), f'{changed} settings changed without save.'
        return opts.dumpjson(), f'{changed} settings changed.'
            return opts.dumpjson(), f'{len(changed)} settings changed without save: {", ".join(changed)}.'
        return opts.dumpjson(), f'{len(changed)} settings changed: {", ".join(changed)}.'

    def run_settings_single(value, key):
        if not opts.same_type(value, opts.data_labels[key].default):
+44 −11
Original line number Diff line number Diff line
@@ -140,13 +140,15 @@ def install_extension_from_url(dirname, url):
        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)

    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

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

    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_for_tags(hide_tags):
    code, _ = refresh_available_extensions_from_data(hide_tags)

    return code, ''

def refresh_available_extensions_from_data():

def refresh_available_extensions_from_data(hide_tags):
    extlist = available_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()} -->
    <table id="available_extensions">
        <thead>
@@ -178,17 +192,24 @@ def refresh_available_extensions_from_data():
        name = ext.get("name", "noname")
        url = ext.get("url", None)
        description = ext.get("description", "")
        extension_tags = ext.get("tags", [])

        if url is None:
            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)

        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"""
            <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>{install_code}</td>
            </tr>
@@ -199,7 +220,10 @@ def refresh_available_extensions_from_data():
    </table>
    """

    return code
    if hidden > 0:
        code += f"<p>Extension hidden: {hidden}</p>"

    return code, list(tags)


def create_ui():
@@ -238,21 +262,30 @@ def create_ui():
                    extension_to_install = gr.Text(elem_id="extension_to_install", 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()
                available_extensions_table = gr.HTML()

                refresh_available_extensions_button.click(
                    fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update()]),
                    inputs=[available_extensions_index],
                    outputs=[available_extensions_index, available_extensions_table, install_result],
                    fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]),
                    inputs=[available_extensions_index, hide_tags],
                    outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result],
                )

                install_extension_button.click(
                    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],
                )

                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"):
                install_url = gr.Text(label="URL for extension's git repository")
                install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto")
+5 −0
Original line number Diff line number Diff line
@@ -563,6 +563,11 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
    opacity: 0.5;
}

.extension-tag{
    font-weight: bold;
    font-size: 95%;
}

/* 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.
If you change anything above, you need to make sure it is RTL compliant by just running
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ def wrap_gradio_gpu_call(func, extra_outputs=None):

        return res

    return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs)
    return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True)


def initialize():