Merge branch 'master' into dark-mode
This commit is contained in:
commit
f6c758d055
11 changed files with 235 additions and 26 deletions
|
@ -116,6 +116,7 @@ function showGalleryImage() {
|
||||||
e.dataset.modded = true;
|
e.dataset.modded = true;
|
||||||
if(e && e.parentElement.tagName == 'DIV'){
|
if(e && e.parentElement.tagName == 'DIV'){
|
||||||
e.style.cursor='pointer'
|
e.style.cursor='pointer'
|
||||||
|
e.style.userSelect='none'
|
||||||
e.addEventListener('click', function (evt) {
|
e.addEventListener('click', function (evt) {
|
||||||
if(!opts.js_modal_lightbox) return;
|
if(!opts.js_modal_lightbox) return;
|
||||||
modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initially_zoomed)
|
modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initially_zoomed)
|
||||||
|
|
146
javascript/localization.js
Normal file
146
javascript/localization.js
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
|
||||||
|
// localization = {} -- the dict with translations is created by the backend
|
||||||
|
|
||||||
|
ignore_ids_for_localization={
|
||||||
|
setting_sd_hypernetwork: 'OPTION',
|
||||||
|
setting_sd_model_checkpoint: 'OPTION',
|
||||||
|
setting_realesrgan_enabled_models: 'OPTION',
|
||||||
|
modelmerger_primary_model_name: 'OPTION',
|
||||||
|
modelmerger_secondary_model_name: 'OPTION',
|
||||||
|
modelmerger_tertiary_model_name: 'OPTION',
|
||||||
|
train_embedding: 'OPTION',
|
||||||
|
train_hypernetwork: 'OPTION',
|
||||||
|
txt2img_style_index: 'OPTION',
|
||||||
|
txt2img_style2_index: 'OPTION',
|
||||||
|
img2img_style_index: 'OPTION',
|
||||||
|
img2img_style2_index: 'OPTION',
|
||||||
|
setting_random_artist_categories: 'SPAN',
|
||||||
|
setting_face_restoration_model: 'SPAN',
|
||||||
|
setting_realesrgan_enabled_models: 'SPAN',
|
||||||
|
extras_upscaler_1: 'SPAN',
|
||||||
|
extras_upscaler_2: 'SPAN',
|
||||||
|
}
|
||||||
|
|
||||||
|
re_num = /^[\.\d]+$/
|
||||||
|
re_emoji = /[\p{Extended_Pictographic}\u{1F3FB}-\u{1F3FF}\u{1F9B0}-\u{1F9B3}]/u
|
||||||
|
|
||||||
|
original_lines = {}
|
||||||
|
translated_lines = {}
|
||||||
|
|
||||||
|
function textNodesUnder(el){
|
||||||
|
var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
|
||||||
|
while(n=walk.nextNode()) a.push(n);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function canBeTranslated(node, text){
|
||||||
|
if(! text) return false;
|
||||||
|
if(! node.parentElement) return false;
|
||||||
|
|
||||||
|
parentType = node.parentElement.nodeName
|
||||||
|
if(parentType=='SCRIPT' || parentType=='STYLE' || parentType=='TEXTAREA') return false;
|
||||||
|
|
||||||
|
if (parentType=='OPTION' || parentType=='SPAN'){
|
||||||
|
pnode = node
|
||||||
|
for(var level=0; level<4; level++){
|
||||||
|
pnode = pnode.parentElement
|
||||||
|
if(! pnode) break;
|
||||||
|
|
||||||
|
if(ignore_ids_for_localization[pnode.id] == parentType) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(re_num.test(text)) return false;
|
||||||
|
if(re_emoji.test(text)) return false;
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTranslation(text){
|
||||||
|
if(! text) return undefined
|
||||||
|
|
||||||
|
if(translated_lines[text] === undefined){
|
||||||
|
original_lines[text] = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
tl = localization[text]
|
||||||
|
if(tl !== undefined){
|
||||||
|
translated_lines[tl] = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return tl
|
||||||
|
}
|
||||||
|
|
||||||
|
function processTextNode(node){
|
||||||
|
text = node.textContent.trim()
|
||||||
|
|
||||||
|
if(! canBeTranslated(node, text)) return
|
||||||
|
|
||||||
|
tl = getTranslation(text)
|
||||||
|
if(tl !== undefined){
|
||||||
|
node.textContent = tl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function processNode(node){
|
||||||
|
if(node.nodeType == 3){
|
||||||
|
processTextNode(node)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(node.title){
|
||||||
|
tl = getTranslation(node.title)
|
||||||
|
if(tl !== undefined){
|
||||||
|
node.title = tl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(node.placeholder){
|
||||||
|
tl = getTranslation(node.placeholder)
|
||||||
|
if(tl !== undefined){
|
||||||
|
node.placeholder = tl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
textNodesUnder(node).forEach(function(node){
|
||||||
|
processTextNode(node)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function dumpTranslations(){
|
||||||
|
dumped = {}
|
||||||
|
|
||||||
|
Object.keys(original_lines).forEach(function(text){
|
||||||
|
if(dumped[text] !== undefined) return
|
||||||
|
|
||||||
|
dumped[text] = localization[text] || text
|
||||||
|
})
|
||||||
|
|
||||||
|
return dumped
|
||||||
|
}
|
||||||
|
|
||||||
|
onUiUpdate(function(m){
|
||||||
|
m.forEach(function(mutation){
|
||||||
|
mutation.addedNodes.forEach(function(node){
|
||||||
|
processNode(node)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
processNode(gradioApp())
|
||||||
|
})
|
||||||
|
|
||||||
|
function download_localization() {
|
||||||
|
text = JSON.stringify(dumpTranslations(), null, 4)
|
||||||
|
|
||||||
|
var element = document.createElement('a');
|
||||||
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
||||||
|
element.setAttribute('download', "localization.json");
|
||||||
|
element.style.display = 'none';
|
||||||
|
document.body.appendChild(element);
|
||||||
|
|
||||||
|
element.click();
|
||||||
|
|
||||||
|
document.body.removeChild(element);
|
||||||
|
}
|
|
@ -72,11 +72,17 @@ function check_gallery(id_gallery){
|
||||||
let galleryButtons = gradioApp().querySelectorAll('#'+id_gallery+' .gallery-item')
|
let galleryButtons = gradioApp().querySelectorAll('#'+id_gallery+' .gallery-item')
|
||||||
let galleryBtnSelected = gradioApp().querySelector('#'+id_gallery+' .gallery-item.\\!ring-2')
|
let galleryBtnSelected = gradioApp().querySelector('#'+id_gallery+' .gallery-item.\\!ring-2')
|
||||||
if (prevSelectedIndex !== -1 && galleryButtons.length>prevSelectedIndex && !galleryBtnSelected) {
|
if (prevSelectedIndex !== -1 && galleryButtons.length>prevSelectedIndex && !galleryBtnSelected) {
|
||||||
//automatically re-open previously selected index (if exists)
|
// automatically re-open previously selected index (if exists)
|
||||||
activeElement = document.activeElement;
|
activeElement = gradioApp().activeElement;
|
||||||
|
|
||||||
galleryButtons[prevSelectedIndex].click();
|
galleryButtons[prevSelectedIndex].click();
|
||||||
showGalleryImage();
|
showGalleryImage();
|
||||||
if(activeElement) activeElement.focus()
|
|
||||||
|
if(activeElement){
|
||||||
|
// i fought this for about an hour; i don't know why the focus is lost or why this helps recover it
|
||||||
|
// if somenoe has a better solution please by all means
|
||||||
|
setTimeout(function() { activeElement.focus() }, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
galleryObservers[id_gallery].observe( gallery, { childList:true, subtree:false })
|
galleryObservers[id_gallery].observe( gallery, { childList:true, subtree:false })
|
||||||
|
|
0
localizations/Put localization files here.txt
Normal file
0
localizations/Put localization files here.txt
Normal file
|
@ -91,7 +91,8 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
|
||||||
def upscale(image, scaler_index, resize, mode, resize_w, resize_h, crop):
|
def upscale(image, scaler_index, resize, mode, resize_w, resize_h, crop):
|
||||||
small = image.crop((image.width // 2, image.height // 2, image.width // 2 + 10, image.height // 2 + 10))
|
small = image.crop((image.width // 2, image.height // 2, image.width // 2 + 10, image.height // 2 + 10))
|
||||||
pixels = tuple(np.array(small).flatten().tolist())
|
pixels = tuple(np.array(small).flatten().tolist())
|
||||||
key = (resize, scaler_index, image.width, image.height, gfpgan_visibility, codeformer_visibility, codeformer_weight) + pixels
|
key = (resize, scaler_index, image.width, image.height, gfpgan_visibility, codeformer_visibility, codeformer_weight,
|
||||||
|
resize_mode, upscaling_resize, upscaling_resize_w, upscaling_resize_h, upscaling_crop) + pixels
|
||||||
|
|
||||||
c = cached_images.get(key)
|
c = cached_images.get(key)
|
||||||
if c is None:
|
if c is None:
|
||||||
|
|
31
modules/localization.py
Normal file
31
modules/localization.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
localizations = {}
|
||||||
|
|
||||||
|
|
||||||
|
def list_localizations(dirname):
|
||||||
|
localizations.clear()
|
||||||
|
|
||||||
|
for file in os.listdir(dirname):
|
||||||
|
fn, ext = os.path.splitext(file)
|
||||||
|
if ext.lower() != ".json":
|
||||||
|
continue
|
||||||
|
|
||||||
|
localizations[fn] = os.path.join(dirname, file)
|
||||||
|
|
||||||
|
|
||||||
|
def localization_js(current_localization_name):
|
||||||
|
fn = localizations.get(current_localization_name, None)
|
||||||
|
data = {}
|
||||||
|
if fn is not None:
|
||||||
|
try:
|
||||||
|
with open(fn, "r", encoding="utf8") as file:
|
||||||
|
data = json.load(file)
|
||||||
|
except Exception:
|
||||||
|
print(f"Error loading localization from {fn}:", file=sys.stderr)
|
||||||
|
print(traceback.format_exc(), file=sys.stderr)
|
||||||
|
|
||||||
|
return f"var localization = {json.dumps(data)}\n"
|
|
@ -296,10 +296,16 @@ def xformers_attnblock_forward(self, x):
|
||||||
try:
|
try:
|
||||||
h_ = x
|
h_ = x
|
||||||
h_ = self.norm(h_)
|
h_ = self.norm(h_)
|
||||||
q1 = self.q(h_).contiguous()
|
q = self.q(h_)
|
||||||
k1 = self.k(h_).contiguous()
|
k = self.k(h_)
|
||||||
v = self.v(h_).contiguous()
|
v = self.v(h_)
|
||||||
out = xformers.ops.memory_efficient_attention(q1, k1, v)
|
b, c, h, w = q.shape
|
||||||
|
q, k, v = map(lambda t: rearrange(t, 'b c h w -> b (h w) c'), (q, k, v))
|
||||||
|
q = q.contiguous()
|
||||||
|
k = k.contiguous()
|
||||||
|
v = v.contiguous()
|
||||||
|
out = xformers.ops.memory_efficient_attention(q, k, v)
|
||||||
|
out = rearrange(out, 'b (h w) c -> b c h w', h=h)
|
||||||
out = self.proj_out(out)
|
out = self.proj_out(out)
|
||||||
return x + out
|
return x + out
|
||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
|
|
|
@ -13,7 +13,7 @@ import modules.memmon
|
||||||
import modules.sd_models
|
import modules.sd_models
|
||||||
import modules.styles
|
import modules.styles
|
||||||
import modules.devices as devices
|
import modules.devices as devices
|
||||||
from modules import sd_samplers, sd_models
|
from modules import sd_samplers, sd_models, localization
|
||||||
from modules.hypernetworks import hypernetwork
|
from modules.hypernetworks import hypernetwork
|
||||||
from modules.paths import models_path, script_path, sd_path
|
from modules.paths import models_path, script_path, sd_path
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ parser.add_argument("--no-progressbar-hiding", action='store_true', help="do not
|
||||||
parser.add_argument("--max-batch-count", type=int, default=16, help="maximum batch count value for the UI")
|
parser.add_argument("--max-batch-count", type=int, default=16, help="maximum batch count value for the UI")
|
||||||
parser.add_argument("--embeddings-dir", type=str, default=os.path.join(script_path, 'embeddings'), help="embeddings directory for textual inversion (default: embeddings)")
|
parser.add_argument("--embeddings-dir", type=str, default=os.path.join(script_path, 'embeddings'), help="embeddings directory for textual inversion (default: embeddings)")
|
||||||
parser.add_argument("--hypernetwork-dir", type=str, default=os.path.join(models_path, 'hypernetworks'), help="hypernetwork directory")
|
parser.add_argument("--hypernetwork-dir", type=str, default=os.path.join(models_path, 'hypernetworks'), help="hypernetwork directory")
|
||||||
|
parser.add_argument("--localizations-dir", type=str, default=os.path.join(script_path, 'localizations'), help="localizations directory")
|
||||||
parser.add_argument("--allow-code", action='store_true', help="allow custom script execution from webui")
|
parser.add_argument("--allow-code", action='store_true', help="allow custom script execution from webui")
|
||||||
parser.add_argument("--medvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a little speed for low VRM usage")
|
parser.add_argument("--medvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a little speed for low VRM usage")
|
||||||
parser.add_argument("--lowvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a lot of speed for very low VRM usage")
|
parser.add_argument("--lowvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a lot of speed for very low VRM usage")
|
||||||
|
@ -103,7 +104,6 @@ os.makedirs(cmd_opts.hypernetwork_dir, exist_ok=True)
|
||||||
hypernetworks = hypernetwork.list_hypernetworks(cmd_opts.hypernetwork_dir)
|
hypernetworks = hypernetwork.list_hypernetworks(cmd_opts.hypernetwork_dir)
|
||||||
loaded_hypernetwork = None
|
loaded_hypernetwork = None
|
||||||
|
|
||||||
|
|
||||||
def reload_hypernetworks():
|
def reload_hypernetworks():
|
||||||
global hypernetworks
|
global hypernetworks
|
||||||
|
|
||||||
|
@ -151,6 +151,8 @@ interrogator = modules.interrogate.InterrogateModels("interrogate")
|
||||||
|
|
||||||
face_restorers = []
|
face_restorers = []
|
||||||
|
|
||||||
|
localization.list_localizations(cmd_opts.localizations_dir)
|
||||||
|
|
||||||
|
|
||||||
def realesrgan_models_names():
|
def realesrgan_models_names():
|
||||||
import modules.realesrgan_model
|
import modules.realesrgan_model
|
||||||
|
@ -296,6 +298,7 @@ options_templates.update(options_section(('ui', "User interface"), {
|
||||||
"js_modal_lightbox_initially_zoomed": OptionInfo(True, "Show images zoomed in by default in full page image viewer"),
|
"js_modal_lightbox_initially_zoomed": OptionInfo(True, "Show images zoomed in by default in full page image viewer"),
|
||||||
"show_progress_in_title": OptionInfo(True, "Show generation progress in window title."),
|
"show_progress_in_title": OptionInfo(True, "Show generation progress in window title."),
|
||||||
'quicksettings': OptionInfo("sd_model_checkpoint", "Quicksettings list"),
|
'quicksettings': OptionInfo("sd_model_checkpoint", "Quicksettings list"),
|
||||||
|
'localization': OptionInfo("None", "Localization (requires restart)", gr.Dropdown, lambda: {"choices": ["None"] + list(localization.localizations.keys())}, refresh=lambda: localization.list_localizations(cmd_opts.localizations_dir)),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
options_templates.update(options_section(('sampler-params', "Sampler parameters"), {
|
options_templates.update(options_section(('sampler-params', "Sampler parameters"), {
|
||||||
|
|
|
@ -23,7 +23,7 @@ import gradio as gr
|
||||||
import gradio.utils
|
import gradio.utils
|
||||||
import gradio.routes
|
import gradio.routes
|
||||||
|
|
||||||
from modules import sd_hijack, sd_models
|
from modules import sd_hijack, sd_models, localization
|
||||||
from modules.paths import script_path
|
from modules.paths import script_path
|
||||||
from modules.shared import opts, cmd_opts, restricted_opts
|
from modules.shared import opts, cmd_opts, restricted_opts
|
||||||
if cmd_opts.deepdanbooru:
|
if cmd_opts.deepdanbooru:
|
||||||
|
@ -1056,10 +1056,10 @@ def create_ui(wrap_gradio_gpu_call):
|
||||||
upscaling_crop = gr.Checkbox(label='Crop to fit', value=True)
|
upscaling_crop = gr.Checkbox(label='Crop to fit', value=True)
|
||||||
|
|
||||||
with gr.Group():
|
with gr.Group():
|
||||||
extras_upscaler_1 = gr.Radio(label='Upscaler 1', choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
|
extras_upscaler_1 = gr.Radio(label='Upscaler 1', elem_id="extras_upscaler_1", choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
|
||||||
|
|
||||||
with gr.Group():
|
with gr.Group():
|
||||||
extras_upscaler_2 = gr.Radio(label='Upscaler 2', choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
|
extras_upscaler_2 = gr.Radio(label='Upscaler 2', elem_id="extras_upscaler_2", choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
|
||||||
extras_upscaler_2_visibility = gr.Slider(minimum=0.0, maximum=1.0, step=0.001, label="Upscaler 2 visibility", value=1)
|
extras_upscaler_2_visibility = gr.Slider(minimum=0.0, maximum=1.0, step=0.001, label="Upscaler 2 visibility", value=1)
|
||||||
|
|
||||||
with gr.Group():
|
with gr.Group():
|
||||||
|
@ -1224,10 +1224,10 @@ def create_ui(wrap_gradio_gpu_call):
|
||||||
with gr.Tab(label="Train"):
|
with gr.Tab(label="Train"):
|
||||||
gr.HTML(value="<p style='margin-bottom: 0.7em'>Train an embedding; must specify a directory with a set of 1:1 ratio images</p>")
|
gr.HTML(value="<p style='margin-bottom: 0.7em'>Train an embedding; must specify a directory with a set of 1:1 ratio images</p>")
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
train_embedding_name = gr.Dropdown(label='Embedding', choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys()))
|
train_embedding_name = gr.Dropdown(label='Embedding', elem_id="train_embedding", choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys()))
|
||||||
create_refresh_button(train_embedding_name, sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings, lambda: {"choices": sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())}, "refresh_train_embedding_name")
|
create_refresh_button(train_embedding_name, sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings, lambda: {"choices": sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())}, "refresh_train_embedding_name")
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', choices=[x for x in shared.hypernetworks.keys()])
|
train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', elem_id="train_hypernetwork", choices=[x for x in shared.hypernetworks.keys()])
|
||||||
create_refresh_button(train_hypernetwork_name, shared.reload_hypernetworks, lambda: {"choices": sorted([x for x in shared.hypernetworks.keys()])}, "refresh_train_hypernetwork_name")
|
create_refresh_button(train_hypernetwork_name, shared.reload_hypernetworks, lambda: {"choices": sorted([x for x in shared.hypernetworks.keys()])}, "refresh_train_hypernetwork_name")
|
||||||
learn_rate = gr.Textbox(label='Learning rate', placeholder="Learning rate", value="0.005")
|
learn_rate = gr.Textbox(label='Learning rate', placeholder="Learning rate", value="0.005")
|
||||||
batch_size = gr.Number(label='Batch size', value=1, precision=0)
|
batch_size = gr.Number(label='Batch size', value=1, precision=0)
|
||||||
|
@ -1376,16 +1376,18 @@ def create_ui(wrap_gradio_gpu_call):
|
||||||
else:
|
else:
|
||||||
raise Exception(f'bad options item type: {str(t)} for key {key}')
|
raise Exception(f'bad options item type: {str(t)} for key {key}')
|
||||||
|
|
||||||
|
elem_id = "setting_"+key
|
||||||
|
|
||||||
if info.refresh is not None:
|
if info.refresh is not None:
|
||||||
if is_quicksettings:
|
if is_quicksettings:
|
||||||
res = comp(label=info.label, value=fun, **(args or {}))
|
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
|
||||||
refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
|
create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
|
||||||
else:
|
else:
|
||||||
with gr.Row(variant="compact"):
|
with gr.Row(variant="compact"):
|
||||||
res = comp(label=info.label, value=fun, **(args or {}))
|
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
|
||||||
refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
|
create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
|
||||||
else:
|
else:
|
||||||
res = comp(label=info.label, value=fun, **(args or {}))
|
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
|
||||||
|
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
@ -1509,6 +1511,9 @@ Requested path was: {f}
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications")
|
request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications")
|
||||||
|
download_localization = gr.Button(value='Download localization template', elem_id="download_localization")
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
reload_script_bodies = gr.Button(value='Reload custom script bodies (No ui updates, No restart)', variant='secondary')
|
reload_script_bodies = gr.Button(value='Reload custom script bodies (No ui updates, No restart)', variant='secondary')
|
||||||
restart_gradio = gr.Button(value='Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)', variant='primary')
|
restart_gradio = gr.Button(value='Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)', variant='primary')
|
||||||
|
|
||||||
|
@ -1519,6 +1524,13 @@ Requested path was: {f}
|
||||||
_js='function(){}'
|
_js='function(){}'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
download_localization.click(
|
||||||
|
fn=lambda: None,
|
||||||
|
inputs=[],
|
||||||
|
outputs=[],
|
||||||
|
_js='download_localization'
|
||||||
|
)
|
||||||
|
|
||||||
def reload_scripts():
|
def reload_scripts():
|
||||||
modules.scripts.reload_script_body_only()
|
modules.scripts.reload_script_body_only()
|
||||||
|
|
||||||
|
@ -1767,6 +1779,7 @@ Requested path was: {f}
|
||||||
visit(txt2img_interface, loadsave, "txt2img")
|
visit(txt2img_interface, loadsave, "txt2img")
|
||||||
visit(img2img_interface, loadsave, "img2img")
|
visit(img2img_interface, loadsave, "img2img")
|
||||||
visit(extras_interface, loadsave, "extras")
|
visit(extras_interface, loadsave, "extras")
|
||||||
|
visit(modelmerger_interface, loadsave, "modelmerger")
|
||||||
|
|
||||||
if not error_loading and (not os.path.exists(ui_config_file) or settings_count != len(ui_settings)):
|
if not error_loading and (not os.path.exists(ui_config_file) or settings_count != len(ui_settings)):
|
||||||
with open(ui_config_file, "w", encoding="utf8") as file:
|
with open(ui_config_file, "w", encoding="utf8") as file:
|
||||||
|
@ -1786,6 +1799,8 @@ for filename in sorted(os.listdir(jsdir)):
|
||||||
if cmd_opts.theme is not None:
|
if cmd_opts.theme is not None:
|
||||||
javascript += f"\n<script>set_theme('{cmd_opts.theme}');</script>\n"
|
javascript += f"\n<script>set_theme('{cmd_opts.theme}');</script>\n"
|
||||||
|
|
||||||
|
javascript += f"\n<script>{localization.localization_js(shared.opts.localization)}</script>"
|
||||||
|
|
||||||
if 'gradio_routes_templates_response' not in globals():
|
if 'gradio_routes_templates_response' not in globals():
|
||||||
def template_response(*args, **kwargs):
|
def template_response(*args, **kwargs):
|
||||||
res = gradio_routes_templates_response(*args, **kwargs)
|
res = gradio_routes_templates_response(*args, **kwargs)
|
||||||
|
|
10
script.js
10
script.js
|
@ -21,20 +21,20 @@ function onUiTabChange(callback){
|
||||||
uiTabChangeCallbacks.push(callback)
|
uiTabChangeCallbacks.push(callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
function runCallback(x){
|
function runCallback(x, m){
|
||||||
try {
|
try {
|
||||||
x()
|
x(m)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
(console.error || console.log).call(console, e.message, e);
|
(console.error || console.log).call(console, e.message, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function executeCallbacks(queue) {
|
function executeCallbacks(queue, m) {
|
||||||
queue.forEach(runCallback)
|
queue.forEach(function(x){runCallback(x, m)})
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
var mutationObserver = new MutationObserver(function(m){
|
var mutationObserver = new MutationObserver(function(m){
|
||||||
executeCallbacks(uiUpdateCallbacks);
|
executeCallbacks(uiUpdateCallbacks, m);
|
||||||
const newTab = get_uiCurrentTab();
|
const newTab = get_uiCurrentTab();
|
||||||
if ( newTab && ( newTab !== uiCurrentTab ) ) {
|
if ( newTab && ( newTab !== uiCurrentTab ) ) {
|
||||||
uiCurrentTab = newTab;
|
uiCurrentTab = newTab;
|
||||||
|
|
|
@ -478,7 +478,7 @@ input[type="range"]{
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name{
|
#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization{
|
||||||
max-width: 2.5em;
|
max-width: 2.5em;
|
||||||
min-width: 2.5em;
|
min-width: 2.5em;
|
||||||
height: 2.4em;
|
height: 2.4em;
|
||||||
|
|
Loading…
Reference in a new issue