cool ticks for performant range input

performant components input number and range are now applied to all main tabs and scripts by default, extensions that have their own tab can utilize this feature by providing the parent tab id of the extension in the ui settings options
This commit is contained in:
anapnoe
2023-03-10 14:06:38 +02:00
parent ff18eb627f
commit ca6d67952e
3 changed files with 154 additions and 46 deletions
+106 -40
View File
@@ -201,12 +201,14 @@ function recalculatePromptTokens(name){
}
function recalculate_prompts_txt2img(){
//console.log("txt2img_prompt");
recalculatePromptTokens('txt2img_prompt')
recalculatePromptTokens('txt2img_neg_prompt')
return args_to_array(arguments);
}
function recalculate_prompts_img2img(){
//console.log("img2img_prompt");
recalculatePromptTokens('img2img_prompt')
recalculatePromptTokens('img2img_neg_prompt')
return args_to_array(arguments);
@@ -386,10 +388,6 @@ onUiUpdate(function(){
let selectedTabItemId = "tab_txt2img";
let net_container = gradioApp().querySelector('#txt2img_extra_networks_row');
let net_menu_open = false;
const net_menu = gradioApp().querySelector('#extra_networks_menu');
/* switch tab item from instance button, this is the only method that works i havent found a workaround yet */
const Observe = (sel, opt, cb) => {
const Obs = new MutationObserver((m) => [...m].forEach(cb));
@@ -420,26 +418,26 @@ onUiUpdate(function(){
if(tab.innerHTML.indexOf("Theme") != -1) tab.style.display = "none";
})
// also here the same issue
/*
gradioApp().querySelectorAll('[id^="image_buttons"] [id$="_tab"]').forEach(function (button, index){
if(button.id == ("img2img_tab" || "inpaint_tab") ){
button.setAttribute("tab-id", 1 );
}else if(button.id == "extras_tab"){
button.setAttribute("tab-id", 2 );
}
button.removeEventListener('mouseup', navTabClicked);
button.addEventListener('mouseup', navTabClicked);
})
*/
netMenuVisibility();
}
function netMenuVisibility(){
if(selectedTabItemId.indexOf("2img") != -1){
net_menu.style.display = "block";
let nid = selectedTabItemId.split("_")[1];
net_container = gradioApp().querySelector('#'+nid+'_extra_networks_row');
if(net_container.classList.contains("aside")){
toggleMenu(net_menu_open, net_menu, net_container, null);
net_menu.style.display = "block";
}else{
net_menu.style.display = "none";
}
}else{
net_menu.style.display = "none";
}
}
// menu
function disableScroll() {
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
@@ -459,7 +457,7 @@ onUiUpdate(function(){
let rect=el.getBoundingClientRect();
return {x:rect.left,y:rect.top};
}
function toggleMenu(isopen, icon, panel, func) {
if(isopen){
panel.classList.add("open");
@@ -473,7 +471,35 @@ onUiUpdate(function(){
enableScroll();
}
}
// close aside views
function closeAsideViews(menu){
if(quick_menu != menu && quick_menu_open) quick_menu.click();
if(net_menu != menu && net_menu_open) net_menu.click();
if(theme_menu != menu && theme_menu_open) theme_menu.click();
}
// if we change to other view other than 2img and if aside mode is selected close extra networks aside and hide the net menu icon
let net_container = gradioApp().querySelector('#txt2img_extra_networks_row');
let net_menu_open = false;
const net_menu = gradioApp().querySelector('#extra_networks_menu');
function netMenuVisibility(){
if(selectedTabItemId.indexOf("2img") != -1){
net_menu.style.display = "block";
let nid = selectedTabItemId.split("_")[1];
net_container = gradioApp().querySelector('#'+nid+'_extra_networks_row');
if(net_container.classList.contains("aside")){
toggleMenu(net_menu_open, net_menu, net_container, null);
net_menu.style.display = "block";
}else{
net_menu.style.display = "none";
}
}else{
net_menu.style.display = "none";
}
}
// mobile nav menu
const tabs_menu = gradioApp().querySelector('#tabs > div:first-child');
const nav_menu = gradioApp().querySelector('#nav_menu');
@@ -489,13 +515,12 @@ onUiUpdate(function(){
}
z_menu.addEventListener('click', toggleNavMenu);
// quicksettings nav menu
let quick_menu_open = false;
const quicksettings_overflow = gradioApp().querySelector('#quicksettings_overflow');
const quick_menu = gradioApp().querySelector('#quick_menu');
function toggleQuickMenu(e) {
closeNavMenus(quick_menu);
closeAsideViews(quick_menu);
quick_menu_open = !quick_menu_open;
const withinBoundaries = e.composedPath().includes(quicksettings_overflow);
if(!quick_menu_open && withinBoundaries){
@@ -511,7 +536,7 @@ onUiUpdate(function(){
// extra networks nav menu
function toggleNetMenu(e) {
closeNavMenus(net_menu);
closeAsideViews(net_menu);
net_menu_open = !net_menu_open;
e.preventDefault();
e.stopPropagation();
@@ -522,14 +547,12 @@ onUiUpdate(function(){
elem.addEventListener('click', toggleNetMenu);
})
// theme nav menu
let theme_container = gradioApp().querySelector('#tab_ui_theme');
let theme_menu_open = false;
const theme_menu = gradioApp().querySelector('#theme_menu');
function toggleThemeMenu(e) {
closeNavMenus(theme_menu);
closeAsideViews(theme_menu);
theme_menu_open = !theme_menu_open;
e.preventDefault();
e.stopPropagation();
@@ -538,13 +561,6 @@ onUiUpdate(function(){
}
theme_menu.addEventListener('click', toggleThemeMenu);
// close open aside views
function closeNavMenus(menu){
if(quick_menu != menu && quick_menu_open) quick_menu.click();
if(net_menu != menu && net_menu_open) net_menu.click();
if(theme_menu != menu && theme_menu_open) theme_menu.click();
}
const theme_tab = gradioApp().querySelector('#tab_ui_theme');
function theme_aside(value){
if(value){
@@ -556,7 +572,7 @@ onUiUpdate(function(){
if(theme_tab) theme_aside(true);
function disabled_extensions(value){
console.log(value);
//console.log(value);
if(value){
theme_menu.classList.remove("hidden");
}else{
@@ -585,6 +601,7 @@ onUiUpdate(function(){
ui_styles.innerHTML = ops_styles;
//console.log(ui_styles);
}
// generated image fit contain - scale
function imageGeneratedFitMethod(value) {
styleobj.ui_view_fit = "[id$='2img_gallery'] div>img {object-fit:" + value + ";}";
@@ -879,7 +896,7 @@ onUiUpdate(function(){
// performant dispatch for gradio's range slider and input number fields
function ui_performant_gradio_input_components(sel){
let selectors = sel.split(",");
selectors.push("#quicksettings_overflow_container");
selectors.push("#quicksettings_overflow_container", "#tab_txt2img", "#tab_img2img", "#tab_extras", "#tab_modelmerger", "#tab_ti");
selectors = selectors.filter(e => e);
for (let i = 0; i < selectors.length; i++) {
selectors[i] = selectors[i]+" input[type='number']";
@@ -890,8 +907,11 @@ onUiUpdate(function(){
let parent = elem.parentElement;
let label = parent.querySelector("label");
//console.log(elem.value);
let clone_num = elem.cloneNode(true);
clone_num.id = "num_clone_"+index;
clone_num.id = "num_clone_"+index;
clone_num.value = elem.value;
parent.append(clone_num);
elem.style.display = "none";
@@ -903,7 +923,8 @@ onUiUpdate(function(){
if(label){
let comp_range = parent.parentElement.parentElement.querySelector("input[type='range']");
let clone_range = comp_range.cloneNode(true);
clone_range.id = comp_range.id+"_clone";
clone_range.id = comp_range.id+"_clone";
clone_range.value = comp_range.value;
comp_range.parentElement.append(clone_range);
comp_range.style.display = "none";
@@ -923,6 +944,29 @@ onUiUpdate(function(){
}
ui_performant_gradio_input_components(opts.ui_performant_gradio_input_components);
// step ticks for performant input range
function ui_show_range_ticks(value, interactive){
if(value){
//const range_selectors = "input[type='range']";
const range_selectors = "[id$='_clone']:is(input[type='range'])";
gradioApp().querySelectorAll(range_selectors).forEach(function (elem){
let spacing = ((elem.step / ( elem.max - elem.min )) * 100.0);
let tsp = 'max(3px, calc('+spacing+'% - 2px))';
let fsp = 'max(4px, calc('+spacing+'% + 0px))';
var style = elem.style;
style.setProperty('--slider-bg-overlay', 'repeating-linear-gradient( 90deg, transparent, transparent '+tsp+', var(--input-border-color) '+tsp+', var(--input-border-color) '+fsp+' )');
})
}else if(interactive){
gradioApp().querySelectorAll("input[type='range']").forEach(function (elem){
var style = elem.style;
style.setProperty('--slider-bg-overlay', 'transparent');
})
}
}
gradioApp().querySelector("#setting_ui_show_range_ticks input").addEventListener('click', function (e) {
ui_show_range_ticks(e.target.checked, true);
})
ui_show_range_ticks(opts.ui_show_range_ticks);
// draggable reordable quicksettings
const container = gradioApp().querySelector("#quicksettings_overflow_container");
@@ -937,6 +981,23 @@ onUiUpdate(function(){
return false;
}
function update_performant_inputs(tab){
let input_selectors = "#tab_"+ tab + " [id^='num_clone']:is(input[type='number'])";
//console.log(input_selectors);
gradioApp().querySelectorAll(input_selectors).forEach(function (elem){
let elem_source = elem.previousElementSibling;
elem.value = elem_source.value;
updateInput(elem);
})
}
gradioApp().querySelectorAll("#tab_pnginfo #png_2img_results button").forEach(function (elem){
elem.addEventListener('click', function (e) {
const button_id = e.target.id.split("_")[0];
setTimeout(function() { update_performant_inputs(button_id); }, 500);
})
})
const pnginfo = gradioApp().querySelector("#tab_pnginfo");
function forwardFromPngInfo(){
if(selectedTabItemId == "tab_txt2img"){
@@ -953,8 +1014,9 @@ onUiUpdate(function(){
gallery_parent.prepend(div);
}
}else if(selectedTabItemId == "tab_img2img"){
pnginfo.querySelector('#img2img_tab').click();
pnginfo.querySelector('#img2img_tab').click();
}
//setTimeout(function() { update_performant_inputs(button_id.split("_")[0]); }, 100);
}
function fetchPngInfoData(files){
@@ -1171,6 +1233,8 @@ let token_timeouts = {};
function update_txt2img_tokens(...args) {
update_token_counter("txt2img_token_button")
//setTimeout(function() { update_performant_inputs("txt2img"); }, 500);
console.log("update_txt2img_tokens");
if (args.length == 2)
return args[0]
return args;
@@ -1178,6 +1242,8 @@ function update_txt2img_tokens(...args) {
function update_img2img_tokens(...args) {
update_token_counter("img2img_token_button")
console.log("update_img2img_tokens");
//setTimeout(function() { update_performant_inputs("img2img"); }, 500);
if (args.length == 2)
return args[0]
return args;