|
|
|
contextMenuInit = function(){ |
|
let eventListenerApplied=false; |
|
let menuSpecs = new Map(); |
|
|
|
const uid = function(){ |
|
return Date.now().toString(36) + Math.random().toString(36).substr(2); |
|
} |
|
|
|
function showContextMenu(event,element,menuEntries){ |
|
let posx = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; |
|
let posy = event.clientY + document.body.scrollTop + document.documentElement.scrollTop; |
|
|
|
let oldMenu = gradioApp().querySelector('#context-menu') |
|
if(oldMenu){ |
|
oldMenu.remove() |
|
} |
|
|
|
let tabButton = uiCurrentTab |
|
let baseStyle = window.getComputedStyle(tabButton) |
|
|
|
const contextMenu = document.createElement('nav') |
|
contextMenu.id = "context-menu" |
|
contextMenu.style.background = baseStyle.background |
|
contextMenu.style.color = baseStyle.color |
|
contextMenu.style.fontFamily = baseStyle.fontFamily |
|
contextMenu.style.top = posy+'px' |
|
contextMenu.style.left = posx+'px' |
|
|
|
|
|
|
|
const contextMenuList = document.createElement('ul') |
|
contextMenuList.className = 'context-menu-items'; |
|
contextMenu.append(contextMenuList); |
|
|
|
menuEntries.forEach(function(entry){ |
|
let contextMenuEntry = document.createElement('a') |
|
contextMenuEntry.innerHTML = entry['name'] |
|
contextMenuEntry.addEventListener("click", function(e) { |
|
entry['func'](); |
|
}) |
|
contextMenuList.append(contextMenuEntry); |
|
|
|
}) |
|
|
|
gradioApp().getRootNode().appendChild(contextMenu) |
|
|
|
let menuWidth = contextMenu.offsetWidth + 4; |
|
let menuHeight = contextMenu.offsetHeight + 4; |
|
|
|
let windowWidth = window.innerWidth; |
|
let windowHeight = window.innerHeight; |
|
|
|
if ( (windowWidth - posx) < menuWidth ) { |
|
contextMenu.style.left = windowWidth - menuWidth + "px"; |
|
} |
|
|
|
if ( (windowHeight - posy) < menuHeight ) { |
|
contextMenu.style.top = windowHeight - menuHeight + "px"; |
|
} |
|
|
|
} |
|
|
|
function appendContextMenuOption(targetElementSelector,entryName,entryFunction){ |
|
|
|
currentItems = menuSpecs.get(targetElementSelector) |
|
|
|
if(!currentItems){ |
|
currentItems = [] |
|
menuSpecs.set(targetElementSelector,currentItems); |
|
} |
|
let newItem = {'id':targetElementSelector+'_'+uid(), |
|
'name':entryName, |
|
'func':entryFunction, |
|
'isNew':true} |
|
|
|
currentItems.push(newItem) |
|
return newItem['id'] |
|
} |
|
|
|
function removeContextMenuOption(uid){ |
|
menuSpecs.forEach(function(v,k) { |
|
let index = -1 |
|
v.forEach(function(e,ei){if(e['id']==uid){index=ei}}) |
|
if(index>=0){ |
|
v.splice(index, 1); |
|
} |
|
}) |
|
} |
|
|
|
function addContextMenuEventListener(){ |
|
if(eventListenerApplied){ |
|
return; |
|
} |
|
gradioApp().addEventListener("click", function(e) { |
|
let source = e.composedPath()[0] |
|
if(source.id && source.id.indexOf('check_progress')>-1){ |
|
return |
|
} |
|
|
|
let oldMenu = gradioApp().querySelector('#context-menu') |
|
if(oldMenu){ |
|
oldMenu.remove() |
|
} |
|
}); |
|
gradioApp().addEventListener("contextmenu", function(e) { |
|
let oldMenu = gradioApp().querySelector('#context-menu') |
|
if(oldMenu){ |
|
oldMenu.remove() |
|
} |
|
menuSpecs.forEach(function(v,k) { |
|
if(e.composedPath()[0].matches(k)){ |
|
showContextMenu(e,e.composedPath()[0],v) |
|
e.preventDefault() |
|
return |
|
} |
|
}) |
|
}); |
|
eventListenerApplied=true |
|
|
|
} |
|
|
|
return [appendContextMenuOption, removeContextMenuOption, addContextMenuEventListener] |
|
} |
|
|
|
initResponse = contextMenuInit(); |
|
appendContextMenuOption = initResponse[0]; |
|
removeContextMenuOption = initResponse[1]; |
|
addContextMenuEventListener = initResponse[2]; |
|
|
|
(function(){ |
|
|
|
let generateOnRepeat = function(genbuttonid,interruptbuttonid){ |
|
let genbutton = gradioApp().querySelector(genbuttonid); |
|
let interruptbutton = gradioApp().querySelector(interruptbuttonid); |
|
if(!interruptbutton.offsetParent){ |
|
genbutton.click(); |
|
} |
|
clearInterval(window.generateOnRepeatInterval) |
|
window.generateOnRepeatInterval = setInterval(function(){ |
|
if(!interruptbutton.offsetParent){ |
|
genbutton.click(); |
|
} |
|
}, |
|
500) |
|
} |
|
|
|
appendContextMenuOption('#txt2img_generate','Generate forever',function(){ |
|
generateOnRepeat('#txt2img_generate','#txt2img_interrupt'); |
|
}) |
|
appendContextMenuOption('#img2img_generate','Generate forever',function(){ |
|
generateOnRepeat('#img2img_generate','#img2img_interrupt'); |
|
}) |
|
|
|
let cancelGenerateForever = function(){ |
|
clearInterval(window.generateOnRepeatInterval) |
|
} |
|
|
|
appendContextMenuOption('#txt2img_interrupt','Cancel generate forever',cancelGenerateForever) |
|
appendContextMenuOption('#txt2img_generate', 'Cancel generate forever',cancelGenerateForever) |
|
appendContextMenuOption('#img2img_interrupt','Cancel generate forever',cancelGenerateForever) |
|
appendContextMenuOption('#img2img_generate', 'Cancel generate forever',cancelGenerateForever) |
|
|
|
appendContextMenuOption('#roll','Roll three', |
|
function(){ |
|
let rollbutton = get_uiCurrentTabContent().querySelector('#roll'); |
|
setTimeout(function(){rollbutton.click()},100) |
|
setTimeout(function(){rollbutton.click()},200) |
|
setTimeout(function(){rollbutton.click()},300) |
|
} |
|
) |
|
})(); |
|
|
|
|
|
onUiUpdate(function(){ |
|
addContextMenuEventListener() |
|
}); |
|
|