extra networks aside menu alternative

This commit is contained in:
anapnoe
2023-03-03 17:30:42 +02:00
parent 7cef76f642
commit 6e0b7927cd
5 changed files with 249 additions and 104 deletions
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M20.083 15.2l1.202.721a.5.5 0 0 1 0 .858l-8.77 5.262a1 1 0 0 1-1.03 0l-8.77-5.262a.5.5 0 0 1 0-.858l1.202-.721L12 20.05l8.083-4.85zm0-4.7l1.202.721a.5.5 0 0 1 0 .858L12 17.65l-9.285-5.571a.5.5 0 0 1 0-.858l1.202-.721L12 15.35l8.083-4.85zm-7.569-9.191l8.771 5.262a.5.5 0 0 1 0 .858L12 13 2.715 7.429a.5.5 0 0 1 0-.858l8.77-5.262a1 1 0 0 1 1.03 0zM12 3.332L5.887 7 12 10.668 18.113 7 12 3.332z"/></svg>

After

Width:  |  Height:  |  Size: 529 B

+127 -96
View File
@@ -385,6 +385,59 @@ 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));
gradioApp().querySelectorAll(sel).forEach(el => Obs.observe(el, opt));
}
Observe("#tabs > div.tabitem", {
attributesList: ["style"], attributeOldValue: true, }, (m) => {
if(m.target.style.display === 'block'){
let idx = parseInt(m.target.getAttribute("tab-item"));
selectedTabItemId = m.target.id;
tabItemChanged(idx);
}
})
function tabItemChanged(idx){
gradioApp().querySelectorAll('#tabs > div > button.bg-white, #nav_menu_header_tabs > button.bg-white').forEach(function (tab){
tab.classList.remove("bg-white");
})
gradioApp().querySelectorAll('#tabs > div > button:nth-child('+(idx+1)+'), #nav_menu_header_tabs > button:nth-child('+(idx+1)+')').forEach(function (tab){
tab.classList.add("bg-white");
})
//gardio removes listeners and attributes from tab buttons we add them again here
gradioApp().querySelectorAll('#tabs > div > button').forEach(function (tab, index){
tab.setAttribute("tab-id", index);
tab.removeEventListener('mouseup', navTabClicked);
tab.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;
@@ -398,8 +451,12 @@ onUiUpdate(function(){
function enableScroll() {
window.onscroll = function() {}
}
}
function getPos(el) {
let rect=el.getBoundingClientRect();
return {x:rect.left,y:rect.top};
}
function toggleMenu(isopen, icon, panel, func) {
if(isopen){
@@ -414,27 +471,16 @@ onUiUpdate(function(){
enableScroll();
}
}
function getPos(el) {
let rect=el.getBoundingClientRect();
return {x:rect.left,y:rect.top};
}
// mobile nav menu
const tabs_menu = gradioApp().querySelector('#tabs > div:first-child');
const nav_menu = gradioApp().querySelector('#nav_menu');
const nav_menu = gradioApp().querySelector('#nav_menu');
const header = gradioApp().querySelector('#header-top');
let menu_open = false;
let z_menu = nav_menu.cloneNode(true);
/* let pos = getPos(nav_menu);
clone.style.position = 'fixed';
clone.style.left = pos.x+'px';
clone.style.top = pos.y+'px';
clone.style.zIndex = 99999; */
const z_menu = nav_menu.cloneNode(true);
z_menu.id = "clone_nav_menu";
header.parentElement.append(z_menu);
function toggleNavMenu(e) {
//e.preventDefault();
header.parentElement.append(z_menu);
function toggleNavMenu(e) {
e.stopPropagation();
menu_open = !menu_open;
toggleMenu(menu_open, nav_menu, tabs_menu, toggleNavMenu);
@@ -458,6 +504,18 @@ onUiUpdate(function(){
}
quick_menu.addEventListener('click', toggleQuickMenu);
function toggleNetMenu(e) {
net_menu_open = !net_menu_open;
e.preventDefault();
e.stopPropagation();
toggleMenu(net_menu_open, net_menu, net_container, null);
}
net_menu.addEventListener('click', toggleNetMenu);
gradioApp().querySelectorAll('button[id$="2img_extra_networks"]').forEach((elem) => {
elem.addEventListener('click', toggleNetMenu);
})
// additional ui styles
let styleobj = {};
@@ -500,7 +558,6 @@ onUiUpdate(function(){
})
viewportOrder(opts.ui_views_order.toLowerCase());
// sd max resolution output
function sdMaxOutputResolution(value) {
gradioApp().querySelectorAll('[id$="2img_width"] input,[id$="2img_height"] input').forEach((elem) => {
@@ -514,14 +571,13 @@ onUiUpdate(function(){
})
sdMaxOutputResolution(opts.sd_max_resolution);
function extra_networks_visibility(value){
gradioApp().querySelectorAll('[id$="2img_extra_networks_row"]').forEach((elem) => {
gradioApp().querySelectorAll('[id$="2img_extra_networks_row"]').forEach((elem) => {
if(value){
elem.classList.remove("!hidden");
}else{
elem.classList.add("!hidden");
}
}
})
}
gradioApp().querySelector("#setting_extra_networks_default_visibility input").addEventListener('click', function (e) {
@@ -550,8 +606,24 @@ onUiUpdate(function(){
})
})
extra_networks_cards_visible_rows(opts.extra_networks_cards_visible_rows);
function extra_networks_aside(value){
gradioApp().querySelectorAll('[id$="2img_extra_networks_row"]').forEach((elem) => {
if(value){
elem.classList.add("aside");
}else{
elem.classList.remove("aside");
}
netMenuVisibility();
})
}
gradioApp().querySelector("#setting_extra_networks_aside input").addEventListener('click', function (e) {
extra_networks_aside(e.target.checked);
})
extra_networks_aside(opts.extra_networks_aside);
//hidden ui tabs
// hidden - header ui tabs
let radio_hidden_html="";
let radio_header_html="";
let hiddentabs={};
@@ -563,8 +635,7 @@ onUiUpdate(function(){
setting_ui_header_tabs.style.display = "none";
const maintabs = gradioApp().querySelectorAll('#tabs > div:first-child > button');
const tabitem = gradioApp().querySelectorAll('#tabs > div.tabitem');
const tabitems = gradioApp().querySelectorAll('#tabs > div.tabitem');
function tabOpsSave(setting){
const iEvent = new Event("input");
@@ -584,13 +655,10 @@ onUiUpdate(function(){
styleobj[key] = "#tabs > div:first-child > button:nth-child("+(index+1)+"){display:block;}";
}
})
tabOpsSave(setting_ui_hidden_tabs);
tabsHeaderChange();
}
}
function tabsHeaderChange() {
const keys = Object.keys(headertabs);
setting_ui_header_tabs.value = "";
@@ -609,39 +677,24 @@ onUiUpdate(function(){
}
const Observe = (sel, opt, cb) => {
const Obs = new MutationObserver((m) => [...m].forEach(cb));
gradioApp().querySelectorAll(sel).forEach(el => Obs.observe(el, opt));
}
Observe("#tabs > div.tabitem", {
attributesList: ["style"], attributeOldValue: true, }, (m) => {
if(m.target.style.display === 'block'){
let idx = parseInt(m.target.getAttribute("tab-item"));
tabSelected(idx);
}
})
function tabSelected(idx){
gradioApp().querySelectorAll('#tabs > div > button.bg-white, #nav_menu_header_tabs > button.bg-white').forEach(function (tab){
tab.classList.remove("bg-white");
})
gradioApp().querySelectorAll('#tabs > div > button:nth-child('+(idx+1)+'), #nav_menu_header_tabs > button:nth-child('+(idx+1)+')').forEach(function (tab){
tab.classList.add("bg-white");
})
}
function navigate2Tab(idx){
function navigate2TabItem(idx){
gradioApp().querySelectorAll('#tabs > div.tabitem').forEach(function (tabitem, index){
if(idx == index){
tabitem.style.display = "block";
//tabitem.classList.add("wtf");
}else{
tabitem.style.display = "none";
//tabitem.classList.remove("wtf");
}
})
}
function navTabClicked(e){
const idx = parseInt(e.currentTarget.getAttribute("tab-id"));
console.log(idx);
navigate2TabItem(idx);
}
maintabs.forEach(function (elem, index) {
let tabvalue = elem.innerText.replaceAll(" ", "");
@@ -660,21 +713,17 @@ onUiUpdate(function(){
radio_hidden_html += '<label class="gr-input-label flex items-center text-gray-700 text-sm space-x-2 border py-1.5 px-3 rounded-lg cursor-pointer bg-white shadow-sm checked:shadow-inner"><input type="checkbox" name="uiha" class="gr-check-radio gr-radio" '+checked_hidden+' value="'+elem.innerText+'"><span class="ml-2" title="">'+elem.innerText+'</span></label>';
radio_header_html += '<label class="gr-input-label flex items-center text-gray-700 text-sm space-x-2 border py-1.5 px-3 rounded-lg cursor-pointer bg-white shadow-sm checked:shadow-inner"><input type="checkbox" name="uihb" class="gr-check-radio gr-radio" '+checked_header+' value="'+elem.innerText+'"><span class="ml-2" title="">'+elem.innerText+'</span></label>';
tabitem[index].setAttribute("tab-item", index);
tabitems[index].setAttribute("tab-item", index);
elem.setAttribute("tab-id", index);
let clonetab = elem.cloneNode(true);
clonetab.id = tabvalue+"_clone";
parent_header_tabs.append(clonetab);
clonetab.setAttribute("tab-id", index);
clonetab.addEventListener('click', function (e) {
const idx = parseInt(e.currentTarget.getAttribute("tab-id"));
navigate2Tab(idx);
})
parent_header_tabs.append(clonetab);
clonetab.addEventListener('click', navTabClicked);
})
let div = document.createElement("div");
div.id = "hidden_radio_tabs_container";
div.classList.add("flex", "flex-wrap", "gap-2");
@@ -687,7 +736,6 @@ onUiUpdate(function(){
div.innerHTML = radio_header_html;
setting_ui_header_tabs.parentElement.appendChild(div);
// hidden tabs
gradioApp().querySelector("#hidden_radio_tabs_container").addEventListener('click', function (e) {
if (e.target && e.target.matches("input[type='checkbox']")) {
@@ -709,7 +757,7 @@ onUiUpdate(function(){
tabsHiddenChange();
// add to quick settings
// add - remove quicksettings
const settings_submit = gradioApp().querySelector('#settings_submit');
const quick_parent = gradioApp().querySelector("#quicksettings_overflow_container");
@@ -752,9 +800,19 @@ onUiUpdate(function(){
})
// draggable reordable quicksettings
const container = gradioApp().querySelector("#quicksettings_overflow_container");
let draggables;
let lastElemAfter;
let islastChild;
let timeout;
function preventBehavior(e){
e.stopPropagation();
e.preventDefault();
return false;
}
// function that gets the element next of cursor/touch
function getElementAfter(container, y){
return draggables.reduce((closest, child) => {
@@ -768,18 +826,6 @@ onUiUpdate(function(){
}, { offset: Number.NEGATIVE_INFINITY } ).element;
}
let lastElemAfter;
let islastChild;
let timeout;
function preventBehavior(e){
e.stopPropagation();
e.preventDefault();
return false;
}
function dragOrderChange(elementAfter, isComplete, delem) {
if(lastElemAfter !== elementAfter || islastChild){
@@ -832,7 +878,6 @@ onUiUpdate(function(){
let elementAfter = getElementAfter(container, y);
dragOrderChange(elementAfter);
}
function touchstart(e){
e.currentTarget.draggable = "false";
let target = e.currentTarget;
@@ -846,8 +891,7 @@ onUiUpdate(function(){
target.addEventListener('touchend', touchend);
target.addEventListener('touchcancel', touchcancel);
}
}
function touchend(e){
e.currentTarget.draggable = "true";
clearTimeout(timeout);
@@ -857,7 +901,6 @@ onUiUpdate(function(){
let elementAfter = getElementAfter(container, y);
dragOrderChange(elementAfter, true, e.currentTarget);
}
function touchcancel(e){
e.currentTarget.draggable = "true";
clearTimeout(timeout);
@@ -870,7 +913,6 @@ onUiUpdate(function(){
e.currentTarget.draggable = "false";
e.currentTarget.classList.add("dragging");
}
function dragend(e){
e.stopPropagation();
e.preventDefault();
@@ -879,7 +921,6 @@ onUiUpdate(function(){
let elementAfter = getElementAfter(container, y);
dragOrderChange(elementAfter, true, e.currentTarget);
}
function dragOver(e) {
e.preventDefault();
let y = e.clientY;
@@ -887,10 +928,7 @@ onUiUpdate(function(){
dragOrderChange(elementAfter);
}
function actionQuickSettingsDraggable(checked){
function actionQuickSettingsDraggable(checked){
if(checked){
draggables = Array.from(gradioApp().querySelectorAll('#quicksettings_overflow_container > div:not(.dragging)'));
gradioApp().addEventListener('drop', preventBehavior);
@@ -898,12 +936,8 @@ onUiUpdate(function(){
gradioApp().removeEventListener('drop', preventBehavior);
}
gradioApp().querySelectorAll('#quicksettings_overflow_container > div').forEach(function (elem){
//elem.setAttribute("draggable", checked);
elem.draggable = checked;
if(checked){
elem.addEventListener('touchstart', touchstart);
@@ -920,12 +954,10 @@ onUiUpdate(function(){
elem.removeEventListener('dragstart', dragstart, false);
elem.removeEventListener('dragend', dragend, false);
elem.removeEventListener('dragover', dragOver, false);
}
})
}
gradioApp().querySelector('#quicksettings_draggable').addEventListener('click', function (e) {
if (e.target && e.target.matches("input[type='checkbox']")) {
actionQuickSettingsDraggable(e.target.checked);
@@ -933,9 +965,8 @@ onUiUpdate(function(){
})
updateOpStyles();
/* anapnoe ui end */
+1
View File
@@ -445,6 +445,7 @@ options_templates.update(options_section(('extra_networks', "Extra Networks"), {
"extra_networks_default_visibility": OptionInfo(True, "Extra Networks default visibility"),
"extra_networks_cards_size": OptionInfo(1, "Card size for extra networks", gr.Slider, {"minimum": 0.8, "maximum": 2, "step": 0.1}),
"extra_networks_cards_visible_rows": OptionInfo(1, "Visible card rows for extra networks", gr.Slider, {"minimum": 1, "maximum": 3, "step": 1}),
"extra_networks_aside": OptionInfo(True, "Extra Networks aside view"),
}))
+1
View File
@@ -1733,6 +1733,7 @@ def create_ui():
component = create_setting_component(k, item.section[0], is_quicksettings=True)
component_dict[k] = component
gr.Row(elem_id="extra_networks_menu")
gr.Row(elem_id="quick_menu")
parameters_copypaste.connect_paste_params_buttons()
+119 -8
View File
@@ -14,6 +14,7 @@ License: GNU General Public License
--extra-networks-height: calc((var(--extra-networks-card-real-size) * var(--extra-networks-visible-rows)) + ( var(--inside-padding-size) * 2 ) );
--extra-networks-name-size: calc(var(--extra-networks-card-size) * 1em);
--top-header-padding-top:1rem;
--top-header-height:60px;
@@ -47,6 +48,7 @@ body {
/* padding: 10px; */
padding-left: 1rem;
padding-right: 1rem;
padding-top: var(--top-header-padding-top);
}
@@ -73,6 +75,7 @@ body {
right: 0;
}
#extra_networks_menu,
#quick_menu {
z-index: 9999;
background-color: var(--input-bg-color);
@@ -441,8 +444,8 @@ body {
[id$="2img_extra_networks"]::before
{
-webkit-mask: url(./file=html/svg/pantone-line.svg) no-repeat 50% 50%;
mask: url(./file=html/svg/pantone-line.svg) no-repeat 50% 50%;
-webkit-mask: url(./file=html/svg/stack-line.svg) no-repeat 50% 50%;
mask: url(./file=html/svg/stack-line.svg) no-repeat 50% 50%;
}
#img2img_actions_column [id$="interrogate"]::before
@@ -514,9 +517,15 @@ body {
/*
.tabitem.wtf
{
display:block !important;
}
.tabitem:not(.wtf){
display:none !important;
}
*/
.livePreview > img,
#img2img_gallery .overflow-y-auto,
@@ -716,7 +725,7 @@ body {
position:fixed;
z-index:10000;
left:1rem;
top: calc((var(--top-header-height) - 38px) / 2);
top: calc((var(--top-header-padding-top) + var(--top-header-height) - 38px) / 2);
}
/* offcanvas quicksettings menu */
@@ -779,7 +788,7 @@ min-height: 34px;
}
#extra_networks_menu::before,
#quick_menu::before {
content: ' ';
display: inline-block;
@@ -797,10 +806,17 @@ min-height: 34px;
transform: translate(-50%, -50%) scale(1.0);
}
#extra_networks_menu::before{
-webkit-mask: url(./file=html/svg/stack-line.svg) no-repeat 50% 50%;
mask: url(./file=html/svg/stack-line.svg) no-repeat 50% 50%;
}
#extra_networks_menu.fixed,
#extra_networks_menu:hover,
#quick_menu:hover {
background-color: var(--primary-color);
}
#extra_networks_menu.fixed::before,
#extra_networks_menu:hover::before,
#quick_menu:hover::before {
background-color: var(--main-bg-color);
}
@@ -2295,6 +2311,89 @@ ul.list-none {
/******************/
/* extra-network-cards */
/******************/
/*
#quicksettings_overflow {
position: fixed;
z-index: 9999;
display: block;
width: 90%;
background-color: var(--main-bg-color) !important;
top: var(--top-header-height);
bottom: 0px;
padding: 16px;
right: 0;
max-width: 480px;
transform: translateX(100%);
transition: all 0.25s ease 0s;
box-shadow: rgba(0,0,0,0) -30px 0 30px -30px;
overflow: hidden;
}
#quicksettings_overflow_container {
overflow-y: auto;
height: calc(100% - 45px);
}
#quicksettings_overflow.open {
transform: translateX(0);
box-shadow: rgba(0,0,0,0.4) -30px 0 30px -30px;
}
#quicksettings_overflow > div {
margin-bottom: var(--outside-gap-size);
}
*/
[id$="2img_extra_networks_row"].aside
{
position: fixed;
top: var(--top-header-height);
width: 90%;
right: 0;
height: calc(100% - var(--top-header-height));
max-width: 480px;
z-index: 9999;
transform: translateX(100%);
transition: all 0.25s ease 0s;
box-shadow: rgba(0,0,0,0) -30px 0 30px -30px;
padding: calc(1rem - var(--outside-gap-size));
background-color: var(--main-bg-color) !important;
}
[id$="2img_extra_networks_row"].aside.open
{
transform: translateX(0);
box-shadow: rgba(0,0,0,0.4) -30px 0 30px -30px;
}
[id$="2img_extra_networks_row"].aside > div:first-child
{
border: 0 !important;
}
[id$="2img_extra_networks_row"].aside > div:first-child > div:first-child
{
display: none;
border: 0;
}
[id$="2img_extra_networks_row"].aside.\!hidden,
[id$="2img_extra_networks_row"].aside > div:first-child > div:last-child
{
display: block !important;
}
[id$="2img_extra_close"]{
display:none;
}
[id$="2img_checkpoints_subdirs"] button{
max-height:34px;
margin-bottom: var(--inside-padding-size);
}
.extra-network-cards .nocards,
.extra-network-thumbs .nocards {
@@ -2362,6 +2461,18 @@ ul.list-none {
scroll-snap-type: x mandatory;
}
[id$="2img_extra_networks_row"].aside .extra-network-cards
{
/*grid-template-columns: repeat(auto-fill, var(--extra-networks-card-real-size)); */
/*grid-template-columns: repeat(calc( var(--extra-networks-card-size) * 4), calc( var(--extra-networks-card-size) * 25%));*/
grid-template-columns: repeat(auto-fit, minmax(calc(var(--extra-networks-card-size) * 25%), 1fr));
overflow-y: auto;
scroll-snap-type: y mandatory;
overflow-x: hidden;
grid-template-rows: auto;
grid-auto-flow: row;
max-height: calc(100vh - 216px);
}
.extra-network-cards .card {