mirror of
				https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
				synced 2025-10-31 01:54:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| let gamepads = [];
 | |
| 
 | |
| window.addEventListener('gamepadconnected', (e) => {
 | |
|     const index = e.gamepad.index;
 | |
|     let isWaiting = false;
 | |
|     gamepads[index] = setInterval(async() => {
 | |
|         if (!opts.js_modal_lightbox_gamepad || isWaiting) return;
 | |
|         const gamepad = navigator.getGamepads()[index];
 | |
|         const xValue = gamepad.axes[0];
 | |
|         if (xValue <= -0.3) {
 | |
|             modalPrevImage(e);
 | |
|             isWaiting = true;
 | |
|         } else if (xValue >= 0.3) {
 | |
|             modalNextImage(e);
 | |
|             isWaiting = true;
 | |
|         }
 | |
|         if (isWaiting) {
 | |
|             await sleepUntil(() => {
 | |
|                 const xValue = navigator.getGamepads()[index].axes[0];
 | |
|                 if (xValue < 0.3 && xValue > -0.3) {
 | |
|                     return true;
 | |
|                 }
 | |
|             }, opts.js_modal_lightbox_gamepad_repeat);
 | |
|             isWaiting = false;
 | |
|         }
 | |
|     }, 10);
 | |
| });
 | |
| 
 | |
| window.addEventListener('gamepaddisconnected', (e) => {
 | |
|     clearInterval(gamepads[e.gamepad.index]);
 | |
| });
 | |
| 
 | |
| /*
 | |
| Primarily for vr controller type pointer devices.
 | |
| I use the wheel event because there's currently no way to do it properly with web xr.
 | |
|  */
 | |
| let isScrolling = false;
 | |
| window.addEventListener('wheel', (e) => {
 | |
|     if (!opts.js_modal_lightbox_gamepad || isScrolling) return;
 | |
|     isScrolling = true;
 | |
| 
 | |
|     if (e.deltaX <= -0.6) {
 | |
|         modalPrevImage(e);
 | |
|     } else if (e.deltaX >= 0.6) {
 | |
|         modalNextImage(e);
 | |
|     }
 | |
| 
 | |
|     setTimeout(() => {
 | |
|         isScrolling = false;
 | |
|     }, opts.js_modal_lightbox_gamepad_repeat);
 | |
| });
 | |
| 
 | |
| function sleepUntil(f, timeout) {
 | |
|     return new Promise((resolve) => {
 | |
|         const timeStart = new Date();
 | |
|         const wait = setInterval(function() {
 | |
|             if (f() || new Date() - timeStart > timeout) {
 | |
|                 clearInterval(wait);
 | |
|                 resolve();
 | |
|             }
 | |
|         }, 20);
 | |
|     });
 | |
| }
 | 
