| 
									
										
										
										
											2022-12-10 12:51:40 +01:00
										 |  |  | function gradioApp() { | 
					
						
							| 
									
										
										
										
											2023-01-12 19:47:44 +03:00
										 |  |  |     const elems = document.getElementsByTagName('gradio-app'); | 
					
						
							| 
									
										
										
										
											2023-03-20 16:09:36 +03:00
										 |  |  |     const elem = elems.length == 0 ? document : elems[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-25 18:23:34 +04:00
										 |  |  |     if (elem !== document) { | 
					
						
							|  |  |  |         elem.getElementById = function(id) { | 
					
						
							|  |  |  |             return document.getElementById(id); | 
					
						
							| 
									
										
										
										
											2023-05-17 15:46:58 +03:00
										 |  |  |         }; | 
					
						
							| 
									
										
										
										
											2023-03-25 18:23:34 +04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-03-20 16:09:36 +03:00
										 |  |  |     return elem.shadowRoot ? elem.shadowRoot : elem; | 
					
						
							| 
									
										
										
										
											2022-08-31 22:19:30 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-30 17:50:09 +03:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Get the currently selected top-level UI tab button (e.g. the button that says "Extras"). | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  | function get_uiCurrentTab() { | 
					
						
							| 
									
										
										
										
											2023-05-30 17:50:09 +03:00
										 |  |  |     return gradioApp().querySelector('#tabs > .tab-nav > button.selected'); | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-30 17:50:09 +03:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Get the first currently visible top-level UI tab content (e.g. the div hosting the "txt2img" UI). | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-10-11 02:22:46 -03:00
										 |  |  | function get_uiCurrentTabContent() { | 
					
						
							| 
									
										
										
										
											2023-05-30 17:50:09 +03:00
										 |  |  |     return gradioApp().querySelector('#tabs > .tabitem[id^=tab_]:not([style*="display: none"])'); | 
					
						
							| 
									
										
										
										
											2022-10-11 02:22:46 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 09:59:10 +03:00
										 |  |  | var uiUpdateCallbacks = []; | 
					
						
							| 
									
										
										
										
											2023-05-25 09:05:06 +03:00
										 |  |  | var uiAfterUpdateCallbacks = []; | 
					
						
							| 
									
										
										
										
											2023-05-18 09:59:10 +03:00
										 |  |  | var uiLoadedCallbacks = []; | 
					
						
							|  |  |  | var uiTabChangeCallbacks = []; | 
					
						
							|  |  |  | var optionsChangedCallbacks = []; | 
					
						
							| 
									
										
										
										
											2023-05-25 09:05:06 +03:00
										 |  |  | var uiAfterUpdateTimeout = null; | 
					
						
							| 
									
										
										
										
											2023-05-18 09:59:10 +03:00
										 |  |  | var uiCurrentTab = null; | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-25 09:03:14 +03:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Register callback to be called at each UI update. | 
					
						
							|  |  |  |  * The callback receives an array of MutationRecords as an argument. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-18 08:37:03 +03:00
										 |  |  | function onUiUpdate(callback) { | 
					
						
							|  |  |  |     uiUpdateCallbacks.push(callback); | 
					
						
							| 
									
										
										
										
											2022-09-17 01:03:03 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-25 09:03:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-25 09:05:06 +03:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Register callback to be called soon after UI updates. | 
					
						
							|  |  |  |  * The callback receives no arguments. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This is preferred over `onUiUpdate` if you don't need | 
					
						
							|  |  |  |  * access to the MutationRecords, as your function will | 
					
						
							|  |  |  |  * not be called quite as often. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function onAfterUiUpdate(callback) { | 
					
						
							|  |  |  |     uiAfterUpdateCallbacks.push(callback); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-25 09:03:14 +03:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Register callback to be called when the UI is loaded. | 
					
						
							|  |  |  |  * The callback receives no arguments. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-01-21 08:36:07 +03:00
										 |  |  | function onUiLoaded(callback) { | 
					
						
							|  |  |  |     uiLoadedCallbacks.push(callback); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-25 09:03:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Register callback to be called when the UI tab is changed. | 
					
						
							|  |  |  |  * The callback receives no arguments. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  | function onUiTabChange(callback) { | 
					
						
							|  |  |  |     uiTabChangeCallbacks.push(callback); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-25 09:03:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Register callback to be called when the options are changed. | 
					
						
							|  |  |  |  * The callback receives no arguments. | 
					
						
							|  |  |  |  * @param callback | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-01-14 15:55:40 +03:00
										 |  |  | function onOptionsChanged(callback) { | 
					
						
							|  |  |  |     optionsChangedCallbacks.push(callback); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-17 01:03:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-25 09:02:38 +03:00
										 |  |  | function executeCallbacks(queue, arg) { | 
					
						
							|  |  |  |     for (const callback of queue) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             callback(arg); | 
					
						
							|  |  |  |         } catch (e) { | 
					
						
							|  |  |  |             console.error("error running callback", callback, ":", e); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-25 09:05:06 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Schedule the execution of the callbacks registered with onAfterUiUpdate. | 
					
						
							|  |  |  |  * The callbacks are executed after a short while, unless another call to this function | 
					
						
							|  |  |  |  * is made before that time. IOW, the callbacks are executed only once, even | 
					
						
							|  |  |  |  * when there are multiple mutations observed. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function scheduleAfterUiUpdateCallbacks() { | 
					
						
							|  |  |  |     clearTimeout(uiAfterUpdateTimeout); | 
					
						
							|  |  |  |     uiAfterUpdateTimeout = setTimeout(function() { | 
					
						
							|  |  |  |         executeCallbacks(uiAfterUpdateCallbacks); | 
					
						
							|  |  |  |     }, 200); | 
					
						
							| 
									
										
										
										
											2022-08-31 22:19:30 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-21 08:36:07 +03:00
										 |  |  | var executedOnLoaded = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 22:19:30 +03:00
										 |  |  | document.addEventListener("DOMContentLoaded", function() { | 
					
						
							|  |  |  |     var mutationObserver = new MutationObserver(function(m) { | 
					
						
							| 
									
										
										
										
											2023-01-21 08:36:07 +03:00
										 |  |  |         if (!executedOnLoaded && gradioApp().querySelector('#txt2img_prompt')) { | 
					
						
							|  |  |  |             executedOnLoaded = true; | 
					
						
							|  |  |  |             executeCallbacks(uiLoadedCallbacks); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-17 21:15:32 +03:00
										 |  |  |         executeCallbacks(uiUpdateCallbacks, m); | 
					
						
							| 
									
										
										
										
											2023-05-25 09:05:06 +03:00
										 |  |  |         scheduleAfterUiUpdateCallbacks(); | 
					
						
							| 
									
										
										
										
											2022-09-24 01:12:13 +02:00
										 |  |  |         const newTab = get_uiCurrentTab(); | 
					
						
							|  |  |  |         if (newTab && (newTab !== uiCurrentTab)) { | 
					
						
							|  |  |  |             uiCurrentTab = newTab; | 
					
						
							|  |  |  |             executeCallbacks(uiTabChangeCallbacks); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-08-31 22:19:30 +03:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-05-18 09:59:10 +03:00
										 |  |  |     mutationObserver.observe(gradioApp(), {childList: true, subtree: true}); | 
					
						
							| 
									
										
										
										
											2022-08-31 22:19:30 +03:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-09-26 18:12:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-10 18:16:04 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Add a ctrl+enter as a shortcut to start a generation | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-01-21 08:36:07 +03:00
										 |  |  | document.addEventListener('keydown', function(e) { | 
					
						
							| 
									
										
										
										
											2022-10-10 18:16:04 +02:00
										 |  |  |     var handled = false; | 
					
						
							|  |  |  |     if (e.key !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-10-15 11:48:13 +08:00
										 |  |  |         if ((e.key == "Enter" && (e.metaKey || e.ctrlKey || e.altKey))) handled = true; | 
					
						
							| 
									
										
										
										
											2022-10-10 18:16:04 +02:00
										 |  |  |     } else if (e.keyCode !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-10-15 11:48:13 +08:00
										 |  |  |         if ((e.keyCode == 13 && (e.metaKey || e.ctrlKey || e.altKey))) handled = true; | 
					
						
							| 
									
										
										
										
											2022-10-10 18:16:04 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-10-11 02:22:46 -03:00
										 |  |  |     if (handled) { | 
					
						
							| 
									
										
										
										
											2023-05-18 09:59:10 +03:00
										 |  |  |         var button = get_uiCurrentTabContent().querySelector('button[id$=_generate]'); | 
					
						
							| 
									
										
										
										
											2022-10-11 02:22:46 -03:00
										 |  |  |         if (button) { | 
					
						
							|  |  |  |             button.click(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-10-10 18:16:04 +02:00
										 |  |  |         e.preventDefault(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-26 18:12:55 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * checks that a UI element is not in another hidden element or tab content | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function uiElementIsVisible(el) { | 
					
						
							| 
									
										
										
										
											2023-05-18 16:09:09 -07:00
										 |  |  |     if (el === document) { | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2022-09-26 18:12:55 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 16:09:09 -07:00
										 |  |  |     const computedStyle = getComputedStyle(el); | 
					
						
							|  |  |  |     const isVisible = computedStyle.display !== 'none'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 23:43:01 -07:00
										 |  |  |     if (!isVisible) return false; | 
					
						
							|  |  |  |     return uiElementIsVisible(el.parentNode); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function uiElementInSight(el) { | 
					
						
							| 
									
										
										
										
											2023-05-18 16:09:09 -07:00
										 |  |  |     const clRect = el.getBoundingClientRect(); | 
					
						
							|  |  |  |     const windowHeight = window.innerHeight; | 
					
						
							| 
									
										
										
										
											2023-05-18 23:43:01 -07:00
										 |  |  |     const isOnScreen = clRect.bottom > 0 && clRect.top < windowHeight; | 
					
						
							| 
									
										
										
										
											2023-05-18 16:09:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 23:43:01 -07:00
										 |  |  |     return isOnScreen; | 
					
						
							| 
									
										
										
										
											2022-12-05 16:30:15 +01:00
										 |  |  | } |