mirror of
https://github.com/lllyasviel/stable-diffusion-webui-forge.git
synced 2026-04-29 18:51:31 +00:00
Merge branch 'dev' of github.com:AUTOMATIC1111/stable-diffusion-webui into dev
This commit is contained in:
@@ -48,7 +48,7 @@ function setupExtraNetworksForTab(tabname) {
|
|||||||
return; // `return` is equivalent of `continue` but for forEach loops.
|
return; // `return` is equivalent of `continue` but for forEach loops.
|
||||||
}
|
}
|
||||||
|
|
||||||
var applyFilter = function() {
|
var applyFilter = function(force) {
|
||||||
var searchTerm = search.value.toLowerCase();
|
var searchTerm = search.value.toLowerCase();
|
||||||
gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card').forEach(function(elem) {
|
gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card').forEach(function(elem) {
|
||||||
var searchOnly = elem.querySelector('.search_only');
|
var searchOnly = elem.querySelector('.search_only');
|
||||||
@@ -67,17 +67,17 @@ function setupExtraNetworksForTab(tabname) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
applySort();
|
applySort(force);
|
||||||
};
|
};
|
||||||
|
|
||||||
var applySort = function() {
|
var applySort = function(force) {
|
||||||
var cards = gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card');
|
var cards = gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card');
|
||||||
var reverse = sort_dir.dataset.sortdir == "Descending";
|
var reverse = sort_dir.dataset.sortdir == "Descending";
|
||||||
var sortKey = sort_mode.dataset.sortmode.toLowerCase().replace("sort", "").replaceAll(" ", "_").replace(/_+$/, "").trim() || "name";
|
var sortKey = sort_mode.dataset.sortmode.toLowerCase().replace("sort", "").replaceAll(" ", "_").replace(/_+$/, "").trim() || "name";
|
||||||
sortKey = "sort" + sortKey.charAt(0).toUpperCase() + sortKey.slice(1);
|
sortKey = "sort" + sortKey.charAt(0).toUpperCase() + sortKey.slice(1);
|
||||||
var sortKeyStore = sortKey + "-" + (reverse ? "Descending" : "Ascending") + "-" + cards.length;
|
var sortKeyStore = sortKey + "-" + (reverse ? "Descending" : "Ascending") + "-" + cards.length;
|
||||||
|
|
||||||
if (sortKeyStore == sort_mode.dataset.sortkey) {
|
if (sortKeyStore == sort_mode.dataset.sortkey && !force) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sort_mode.dataset.sortkey = sortKeyStore;
|
sort_mode.dataset.sortkey = sortKeyStore;
|
||||||
@@ -167,11 +167,17 @@ function extraNetworksTabSelected(tabname, id, showPrompt, showNegativePrompt, t
|
|||||||
}
|
}
|
||||||
|
|
||||||
function applyExtraNetworkFilter(tabname_full) {
|
function applyExtraNetworkFilter(tabname_full) {
|
||||||
setTimeout(extraNetworksApplyFilter[tabname_full], 1);
|
var doFilter = function() {
|
||||||
|
extraNetworksApplyFilter[tabname_full](true);
|
||||||
|
};
|
||||||
|
setTimeout(doFilter, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyExtraNetworkSort(tabname_full) {
|
function applyExtraNetworkSort(tabname_full) {
|
||||||
setTimeout(extraNetworksApplySort[tabname_full], 1);
|
var doSort = function() {
|
||||||
|
extraNetworksApplySort[tabname_full](true);
|
||||||
|
};
|
||||||
|
setTimeout(doSort, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var extraNetworksApplyFilter = {};
|
var extraNetworksApplyFilter = {};
|
||||||
@@ -450,7 +456,7 @@ function extraNetworksControlRefreshOnClick(event, tabname, extra_networks_tabna
|
|||||||
* @param tabname The name of the active tab in the sd webui. Ex: txt2img, img2img, etc.
|
* @param tabname The name of the active tab in the sd webui. Ex: txt2img, img2img, etc.
|
||||||
* @param extra_networks_tabname The id of the active extraNetworks tab. Ex: lora, checkpoints, etc.
|
* @param extra_networks_tabname The id of the active extraNetworks tab. Ex: lora, checkpoints, etc.
|
||||||
*/
|
*/
|
||||||
var btn_refresh_internal = gradioApp().getElementById(tabname + "_extra_refresh_internal");
|
var btn_refresh_internal = gradioApp().getElementById(tabname + "_" + extra_networks_tabname + "_extra_refresh_internal");
|
||||||
btn_refresh_internal.dispatchEvent(new Event("click"));
|
btn_refresh_internal.dispatchEvent(new Event("click"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,9 +119,18 @@ function create_submit_args(args) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setSubmitButtonsVisibility(tabname, showInterrupt, showSkip, showInterrupting) {
|
||||||
|
gradioApp().getElementById(tabname + '_interrupt').style.display = showInterrupt ? "block" : "none";
|
||||||
|
gradioApp().getElementById(tabname + '_skip').style.display = showSkip ? "block" : "none";
|
||||||
|
gradioApp().getElementById(tabname + '_interrupting').style.display = showInterrupting ? "block" : "none";
|
||||||
|
}
|
||||||
|
|
||||||
function showSubmitButtons(tabname, show) {
|
function showSubmitButtons(tabname, show) {
|
||||||
gradioApp().getElementById(tabname + '_interrupt').style.display = show ? "none" : "block";
|
setSubmitButtonsVisibility(tabname, !show, !show, false);
|
||||||
gradioApp().getElementById(tabname + '_skip').style.display = show ? "none" : "block";
|
}
|
||||||
|
|
||||||
|
function showSubmitInterruptingPlaceholder(tabname) {
|
||||||
|
setSubmitButtonsVisibility(tabname, false, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showRestoreProgressButton(tabname, show) {
|
function showRestoreProgressButton(tabname, show) {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from modules import errors
|
||||||
import csv
|
import csv
|
||||||
import os
|
import os
|
||||||
import typing
|
import typing
|
||||||
@@ -128,19 +129,22 @@ class StyleDatabase:
|
|||||||
self.load_from_csv(styles_file)
|
self.load_from_csv(styles_file)
|
||||||
|
|
||||||
def load_from_csv(self, path: str | Path):
|
def load_from_csv(self, path: str | Path):
|
||||||
with open(path, "r", encoding="utf-8-sig", newline="") as file:
|
try:
|
||||||
reader = csv.DictReader(file, skipinitialspace=True)
|
with open(path, "r", encoding="utf-8-sig", newline="") as file:
|
||||||
for row in reader:
|
reader = csv.DictReader(file, skipinitialspace=True)
|
||||||
# Ignore empty rows or rows starting with a comment
|
for row in reader:
|
||||||
if not row or row["name"].startswith("#"):
|
# Ignore empty rows or rows starting with a comment
|
||||||
continue
|
if not row or row["name"].startswith("#"):
|
||||||
# Support loading old CSV format with "name, text"-columns
|
continue
|
||||||
prompt = row["prompt"] if "prompt" in row else row["text"]
|
# Support loading old CSV format with "name, text"-columns
|
||||||
negative_prompt = row.get("negative_prompt", "")
|
prompt = row["prompt"] if "prompt" in row else row["text"]
|
||||||
# Add style to database
|
negative_prompt = row.get("negative_prompt", "")
|
||||||
self.styles[row["name"]] = PromptStyle(
|
# Add style to database
|
||||||
row["name"], prompt, negative_prompt, str(path)
|
self.styles[row["name"]] = PromptStyle(
|
||||||
)
|
row["name"], prompt, negative_prompt, str(path)
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
errors.report(f'Error loading styles from {path}: ', exc_info=True)
|
||||||
|
|
||||||
def get_style_paths(self) -> set:
|
def get_style_paths(self) -> set:
|
||||||
"""Returns a set of all distinct paths of files that styles are loaded from."""
|
"""Returns a set of all distinct paths of files that styles are loaded from."""
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ def get_single_card(page: str = "", tabname: str = "", name: str = ""):
|
|||||||
errors.display(e, "creating item for extra network")
|
errors.display(e, "creating item for extra network")
|
||||||
item = page.items.get(name)
|
item = page.items.get(name)
|
||||||
|
|
||||||
page.read_user_metadata(item)
|
page.read_user_metadata(item, use_cache=False)
|
||||||
item_html = page.create_item_html(tabname, item)
|
item_html = page.create_item_html(tabname, item, shared.html("extra-networks-card.html"))
|
||||||
|
|
||||||
return JSONResponse({"html": item_html})
|
return JSONResponse({"html": item_html})
|
||||||
|
|
||||||
@@ -173,9 +173,9 @@ class ExtraNetworksPage:
|
|||||||
def refresh(self):
|
def refresh(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def read_user_metadata(self, item):
|
def read_user_metadata(self, item, use_cache=True):
|
||||||
filename = item.get("filename", None)
|
filename = item.get("filename", None)
|
||||||
metadata = extra_networks.get_user_metadata(filename, lister=self.lister)
|
metadata = extra_networks.get_user_metadata(filename, lister=self.lister if use_cache else None)
|
||||||
|
|
||||||
desc = metadata.get("description", None)
|
desc = metadata.get("description", None)
|
||||||
if desc is not None:
|
if desc is not None:
|
||||||
@@ -559,7 +559,7 @@ class ExtraNetworksPage:
|
|||||||
"date_created": int(mtime),
|
"date_created": int(mtime),
|
||||||
"date_modified": int(ctime),
|
"date_modified": int(ctime),
|
||||||
"name": pth.name.lower(),
|
"name": pth.name.lower(),
|
||||||
"path": str(pth.parent).lower(),
|
"path": str(pth).lower(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def find_preview(self, path):
|
def find_preview(self, path):
|
||||||
@@ -638,6 +638,7 @@ def pages_in_preferred_order(pages):
|
|||||||
|
|
||||||
return sorted(pages, key=lambda x: tab_scores[x.name])
|
return sorted(pages, key=lambda x: tab_scores[x.name])
|
||||||
|
|
||||||
|
|
||||||
def create_ui(interface: gr.Blocks, unrelated_tabs, tabname):
|
def create_ui(interface: gr.Blocks, unrelated_tabs, tabname):
|
||||||
ui = ExtraNetworksUi()
|
ui = ExtraNetworksUi()
|
||||||
ui.pages = []
|
ui.pages = []
|
||||||
@@ -648,8 +649,6 @@ def create_ui(interface: gr.Blocks, unrelated_tabs, tabname):
|
|||||||
|
|
||||||
related_tabs = []
|
related_tabs = []
|
||||||
|
|
||||||
button_refresh = gr.Button("Refresh", elem_id=f"{tabname}_extra_refresh_internal", visible=False)
|
|
||||||
|
|
||||||
for page in ui.stored_extra_pages:
|
for page in ui.stored_extra_pages:
|
||||||
with gr.Tab(page.title, elem_id=f"{tabname}_{page.extra_networks_tabname}", elem_classes=["extra-page"]) as tab:
|
with gr.Tab(page.title, elem_id=f"{tabname}_{page.extra_networks_tabname}", elem_classes=["extra-page"]) as tab:
|
||||||
with gr.Column(elem_id=f"{tabname}_{page.extra_networks_tabname}_prompts", elem_classes=["extra-page-prompts"]):
|
with gr.Column(elem_id=f"{tabname}_{page.extra_networks_tabname}_prompts", elem_classes=["extra-page-prompts"]):
|
||||||
@@ -678,6 +677,15 @@ def create_ui(interface: gr.Blocks, unrelated_tabs, tabname):
|
|||||||
)
|
)
|
||||||
tab.select(fn=None, _js=jscode, inputs=[], outputs=[], show_progress=False)
|
tab.select(fn=None, _js=jscode, inputs=[], outputs=[], show_progress=False)
|
||||||
|
|
||||||
|
def refresh():
|
||||||
|
for pg in ui.stored_extra_pages:
|
||||||
|
pg.refresh()
|
||||||
|
create_html()
|
||||||
|
return ui.pages_contents
|
||||||
|
|
||||||
|
button_refresh = gr.Button("Refresh", elem_id=f"{tabname}_{page.extra_networks_tabname}_extra_refresh_internal", visible=False)
|
||||||
|
button_refresh.click(fn=refresh, inputs=[], outputs=ui.pages).then(fn=lambda: None, _js="function(){ " + f"applyExtraNetworkFilter('{tabname}_{page.extra_networks_tabname}');" + " }")
|
||||||
|
|
||||||
def create_html():
|
def create_html():
|
||||||
ui.pages_contents = [pg.create_html(ui.tabname) for pg in ui.stored_extra_pages]
|
ui.pages_contents = [pg.create_html(ui.tabname) for pg in ui.stored_extra_pages]
|
||||||
|
|
||||||
@@ -686,16 +694,7 @@ def create_ui(interface: gr.Blocks, unrelated_tabs, tabname):
|
|||||||
create_html()
|
create_html()
|
||||||
return ui.pages_contents
|
return ui.pages_contents
|
||||||
|
|
||||||
def refresh():
|
|
||||||
for pg in ui.stored_extra_pages:
|
|
||||||
pg.refresh()
|
|
||||||
create_html()
|
|
||||||
return ui.pages_contents
|
|
||||||
|
|
||||||
interface.load(fn=pages_html, inputs=[], outputs=ui.pages)
|
interface.load(fn=pages_html, inputs=[], outputs=ui.pages)
|
||||||
# NOTE: Event is manually fired in extraNetworks.js:extraNetworksTreeRefreshOnClick()
|
|
||||||
# button is unused and hidden at all times. Only used in order to fire this event.
|
|
||||||
button_refresh.click(fn=refresh, inputs=[], outputs=ui.pages)
|
|
||||||
|
|
||||||
return ui
|
return ui
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage):
|
|||||||
"preview": self.find_preview(path),
|
"preview": self.find_preview(path),
|
||||||
"description": self.find_description(path),
|
"description": self.find_description(path),
|
||||||
"search_terms": search_terms,
|
"search_terms": search_terms,
|
||||||
"onclick": html.escape(f"return selectCheckpoint('{name}');"),
|
"onclick": html.escape(f"return selectCheckpoint({ui_extra_networks.quote_js(name)})"),
|
||||||
"local_preview": f"{path}.{shared.opts.samples_format}",
|
"local_preview": f"{path}.{shared.opts.samples_format}",
|
||||||
"metadata": checkpoint.metadata,
|
"metadata": checkpoint.metadata,
|
||||||
"sort_keys": {'default': index, **self.get_sort_keys(checkpoint.filename)},
|
"sort_keys": {'default': index, **self.get_sort_keys(checkpoint.filename)},
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class Toprow:
|
|||||||
button_deepbooru = None
|
button_deepbooru = None
|
||||||
|
|
||||||
interrupt = None
|
interrupt = None
|
||||||
|
interrupting = None
|
||||||
skip = None
|
skip = None
|
||||||
submit = None
|
submit = None
|
||||||
|
|
||||||
@@ -98,14 +99,9 @@ class Toprow:
|
|||||||
|
|
||||||
self.interrupt = gr.Button('Interrupt', elem_id=f"{self.id_part}_interrupt", elem_classes="generate-box-interrupt", tooltip="End generation immediately or after completing current batch")
|
self.interrupt = gr.Button('Interrupt', elem_id=f"{self.id_part}_interrupt", elem_classes="generate-box-interrupt", tooltip="End generation immediately or after completing current batch")
|
||||||
self.skip = gr.Button('Skip', elem_id=f"{self.id_part}_skip", elem_classes="generate-box-skip", tooltip="Stop generation of current batch and continues onto next batch")
|
self.skip = gr.Button('Skip', elem_id=f"{self.id_part}_skip", elem_classes="generate-box-skip", tooltip="Stop generation of current batch and continues onto next batch")
|
||||||
|
self.interrupting = gr.Button('Interrupting...', elem_id=f"{self.id_part}_interrupting", elem_classes="generate-box-interrupting", tooltip="Interrupting generation...")
|
||||||
self.submit = gr.Button('Generate', elem_id=f"{self.id_part}_generate", variant='primary', tooltip="Right click generate forever menu")
|
self.submit = gr.Button('Generate', elem_id=f"{self.id_part}_generate", variant='primary', tooltip="Right click generate forever menu")
|
||||||
|
|
||||||
self.skip.click(
|
|
||||||
fn=lambda: shared.state.skip(),
|
|
||||||
inputs=[],
|
|
||||||
outputs=[],
|
|
||||||
)
|
|
||||||
|
|
||||||
def interrupt_function():
|
def interrupt_function():
|
||||||
if not shared.state.stopping_generation and shared.state.job_count > 1 and shared.opts.interrupt_after_current:
|
if not shared.state.stopping_generation and shared.state.job_count > 1 and shared.opts.interrupt_after_current:
|
||||||
shared.state.stop_generating()
|
shared.state.stop_generating()
|
||||||
@@ -113,11 +109,9 @@ class Toprow:
|
|||||||
else:
|
else:
|
||||||
shared.state.interrupt()
|
shared.state.interrupt()
|
||||||
|
|
||||||
self.interrupt.click(
|
self.skip.click(fn=shared.state.skip)
|
||||||
fn=interrupt_function,
|
self.interrupt.click(fn=interrupt_function, _js='function(){ showSubmitInterruptingPlaceholder("' + self.id_part + '"); }')
|
||||||
inputs=[],
|
self.interrupting.click(fn=interrupt_function)
|
||||||
outputs=[],
|
|
||||||
)
|
|
||||||
|
|
||||||
def create_tools_row(self):
|
def create_tools_row(self):
|
||||||
with gr.Row(elem_id=f"{self.id_part}_tools"):
|
with gr.Row(elem_id=f"{self.id_part}_tools"):
|
||||||
|
|||||||
@@ -331,17 +331,17 @@ input[type="checkbox"].input-accordion-checkbox{
|
|||||||
.generate-box{
|
.generate-box{
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.gradio-button.generate-box-skip, .gradio-button.generate-box-interrupt{
|
.gradio-button.generate-box-skip, .gradio-button.generate-box-interrupt, .gradio-button.generate-box-interrupting{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: none;
|
display: none;
|
||||||
background: #b4c0cc;
|
background: #b4c0cc;
|
||||||
}
|
}
|
||||||
.gradio-button.generate-box-skip:hover, .gradio-button.generate-box-interrupt:hover{
|
.gradio-button.generate-box-skip:hover, .gradio-button.generate-box-interrupt:hover, .gradio-button.generate-box-interrupting:hover{
|
||||||
background: #c2cfdb;
|
background: #c2cfdb;
|
||||||
}
|
}
|
||||||
.gradio-button.generate-box-interrupt{
|
.gradio-button.generate-box-interrupt, .gradio-button.generate-box-interrupting{
|
||||||
left: 0;
|
left: 0;
|
||||||
border-radius: 0.5rem 0 0 0.5rem;
|
border-radius: 0.5rem 0 0 0.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user