Path: blob/master/javascript/contextMenus.js
3055 views
1var contextMenuInit = function() {2let eventListenerApplied = false;3let menuSpecs = new Map();45const uid = function() {6return Date.now().toString(36) + Math.random().toString(36).substring(2);7};89function showContextMenu(event, element, menuEntries) {10let oldMenu = gradioApp().querySelector('#context-menu');11if (oldMenu) {12oldMenu.remove();13}1415let baseStyle = window.getComputedStyle(uiCurrentTab);1617const contextMenu = document.createElement('nav');18contextMenu.id = "context-menu";19contextMenu.style.background = baseStyle.background;20contextMenu.style.color = baseStyle.color;21contextMenu.style.fontFamily = baseStyle.fontFamily;22contextMenu.style.top = event.pageY + 'px';23contextMenu.style.left = event.pageX + 'px';2425const contextMenuList = document.createElement('ul');26contextMenuList.className = 'context-menu-items';27contextMenu.append(contextMenuList);2829menuEntries.forEach(function(entry) {30let contextMenuEntry = document.createElement('a');31contextMenuEntry.innerHTML = entry['name'];32contextMenuEntry.addEventListener("click", function() {33entry['func']();34});35contextMenuList.append(contextMenuEntry);3637});3839gradioApp().appendChild(contextMenu);40}4142function appendContextMenuOption(targetElementSelector, entryName, entryFunction) {4344var currentItems = menuSpecs.get(targetElementSelector);4546if (!currentItems) {47currentItems = [];48menuSpecs.set(targetElementSelector, currentItems);49}50let newItem = {51id: targetElementSelector + '_' + uid(),52name: entryName,53func: entryFunction,54isNew: true55};5657currentItems.push(newItem);58return newItem['id'];59}6061function removeContextMenuOption(uid) {62menuSpecs.forEach(function(v) {63let index = -1;64v.forEach(function(e, ei) {65if (e['id'] == uid) {66index = ei;67}68});69if (index >= 0) {70v.splice(index, 1);71}72});73}7475function addContextMenuEventListener() {76if (eventListenerApplied) {77return;78}79gradioApp().addEventListener("click", function(e) {80if (!e.isTrusted) {81return;82}8384let oldMenu = gradioApp().querySelector('#context-menu');85if (oldMenu) {86oldMenu.remove();87}88});89['contextmenu', 'touchstart'].forEach((eventType) => {90gradioApp().addEventListener(eventType, function(e) {91let ev = e;92if (eventType.startsWith('touch')) {93if (e.touches.length !== 2) return;94ev = e.touches[0];95}96let oldMenu = gradioApp().querySelector('#context-menu');97if (oldMenu) {98oldMenu.remove();99}100menuSpecs.forEach(function(v, k) {101if (e.composedPath()[0].matches(k)) {102showContextMenu(ev, e.composedPath()[0], v);103e.preventDefault();104}105});106});107});108eventListenerApplied = true;109110}111112return [appendContextMenuOption, removeContextMenuOption, addContextMenuEventListener];113};114115var initResponse = contextMenuInit();116var appendContextMenuOption = initResponse[0];117var removeContextMenuOption = initResponse[1];118var addContextMenuEventListener = initResponse[2];119120(function() {121//Start example Context Menu Items122let generateOnRepeat = function(genbuttonid, interruptbuttonid) {123let genbutton = gradioApp().querySelector(genbuttonid);124let interruptbutton = gradioApp().querySelector(interruptbuttonid);125if (!interruptbutton.offsetParent) {126genbutton.click();127}128clearInterval(window.generateOnRepeatInterval);129window.generateOnRepeatInterval = setInterval(function() {130if (!interruptbutton.offsetParent) {131genbutton.click();132}133},134500);135};136137let generateOnRepeat_txt2img = function() {138generateOnRepeat('#txt2img_generate', '#txt2img_interrupt');139};140141let generateOnRepeat_img2img = function() {142generateOnRepeat('#img2img_generate', '#img2img_interrupt');143};144145appendContextMenuOption('#txt2img_generate', 'Generate forever', generateOnRepeat_txt2img);146appendContextMenuOption('#txt2img_interrupt', 'Generate forever', generateOnRepeat_txt2img);147appendContextMenuOption('#img2img_generate', 'Generate forever', generateOnRepeat_img2img);148appendContextMenuOption('#img2img_interrupt', 'Generate forever', generateOnRepeat_img2img);149150let cancelGenerateForever = function() {151clearInterval(window.generateOnRepeatInterval);152};153154appendContextMenuOption('#txt2img_interrupt', 'Cancel generate forever', cancelGenerateForever);155appendContextMenuOption('#txt2img_generate', 'Cancel generate forever', cancelGenerateForever);156appendContextMenuOption('#img2img_interrupt', 'Cancel generate forever', cancelGenerateForever);157appendContextMenuOption('#img2img_generate', 'Cancel generate forever', cancelGenerateForever);158159})();160//End example Context Menu Items161162onAfterUiUpdate(addContextMenuEventListener);163164165