imageviewer.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // A full size 'lightbox' preview modal shown when left clicking on gallery previews
  2. function closeModal() {
  3. gradioApp().getElementById("lightboxModal").style.display = "none";
  4. }
  5. function showModal(event) {
  6. const source = event.target || event.srcElement;
  7. const modalImage = gradioApp().getElementById("modalImage")
  8. const lb = gradioApp().getElementById("lightboxModal")
  9. modalImage.src = source.src
  10. if (modalImage.style.display === 'none') {
  11. lb.style.setProperty('background-image', 'url(' + source.src + ')');
  12. }
  13. lb.style.display = "block";
  14. lb.focus()
  15. event.stopPropagation()
  16. }
  17. function negmod(n, m) {
  18. return ((n % m) + m) % m;
  19. }
  20. function modalImageSwitch(offset){
  21. var allgalleryButtons = gradioApp().querySelectorAll(".gallery-item.transition-all")
  22. var galleryButtons = []
  23. allgalleryButtons.forEach(function(elem){
  24. if(elem.parentElement.offsetParent){
  25. galleryButtons.push(elem);
  26. }
  27. })
  28. if(galleryButtons.length>1){
  29. var allcurrentButtons = gradioApp().querySelectorAll(".gallery-item.transition-all.\\!ring-2")
  30. var currentButton = null
  31. allcurrentButtons.forEach(function(elem){
  32. if(elem.parentElement.offsetParent){
  33. currentButton = elem;
  34. }
  35. })
  36. var result = -1
  37. galleryButtons.forEach(function(v, i){ if(v==currentButton) { result = i } })
  38. if(result != -1){
  39. nextButton = galleryButtons[negmod((result+offset),galleryButtons.length)]
  40. nextButton.click()
  41. const modalImage = gradioApp().getElementById("modalImage");
  42. const modal = gradioApp().getElementById("lightboxModal");
  43. modalImage.src = nextButton.children[0].src;
  44. if (modalImage.style.display === 'none') {
  45. modal.style.setProperty('background-image', `url(${modalImage.src})`)
  46. }
  47. setTimeout( function(){modal.focus()},10)
  48. }
  49. }
  50. }
  51. function modalNextImage(event){
  52. modalImageSwitch(1)
  53. event.stopPropagation()
  54. }
  55. function modalPrevImage(event){
  56. modalImageSwitch(-1)
  57. event.stopPropagation()
  58. }
  59. function modalKeyHandler(event){
  60. switch (event.key) {
  61. case "ArrowLeft":
  62. modalPrevImage(event)
  63. break;
  64. case "ArrowRight":
  65. modalNextImage(event)
  66. break;
  67. case "Escape":
  68. closeModal();
  69. break;
  70. }
  71. }
  72. function showGalleryImage(){
  73. setTimeout(function() {
  74. fullImg_preview = gradioApp().querySelectorAll('img.w-full.object-contain')
  75. if(fullImg_preview != null){
  76. fullImg_preview.forEach(function function_name(e) {
  77. if(e && e.parentElement.tagName == 'DIV'){
  78. e.style.cursor='pointer'
  79. e.addEventListener('click', function (evt) {
  80. if(!opts.js_modal_lightbox) return;
  81. modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initialy_zoomed)
  82. showModal(evt)
  83. },true);
  84. }
  85. });
  86. }
  87. }, 100);
  88. }
  89. function modalZoomSet(modalImage, enable){
  90. if( enable ){
  91. modalImage.classList.add('modalImageFullscreen');
  92. } else{
  93. modalImage.classList.remove('modalImageFullscreen');
  94. }
  95. }
  96. function modalZoomToggle(event){
  97. modalImage = gradioApp().getElementById("modalImage");
  98. modalZoomSet(modalImage, !modalImage.classList.contains('modalImageFullscreen'))
  99. event.stopPropagation()
  100. }
  101. function modalTileImageToggle(event){
  102. const modalImage = gradioApp().getElementById("modalImage");
  103. const modal = gradioApp().getElementById("lightboxModal");
  104. const isTiling = modalImage.style.display === 'none';
  105. if (isTiling) {
  106. modalImage.style.display = 'block';
  107. modal.style.setProperty('background-image', 'none')
  108. } else {
  109. modalImage.style.display = 'none';
  110. modal.style.setProperty('background-image', `url(${modalImage.src})`)
  111. }
  112. event.stopPropagation()
  113. }
  114. function galleryImageHandler(e){
  115. if(e && e.parentElement.tagName == 'BUTTON'){
  116. e.onclick = showGalleryImage;
  117. }
  118. }
  119. onUiUpdate(function(){
  120. fullImg_preview = gradioApp().querySelectorAll('img.w-full')
  121. if(fullImg_preview != null){
  122. fullImg_preview.forEach(galleryImageHandler);
  123. }
  124. })
  125. document.addEventListener("DOMContentLoaded", function() {
  126. const modalFragment = document.createDocumentFragment();
  127. const modal = document.createElement('div')
  128. modal.onclick = closeModal;
  129. modal.id = "lightboxModal";
  130. modal.tabIndex=0
  131. modal.addEventListener('keydown', modalKeyHandler, true)
  132. const modalControls = document.createElement('div')
  133. modalControls.className = 'modalControls gradio-container';
  134. modal.append(modalControls);
  135. const modalZoom = document.createElement('span')
  136. modalZoom.className = 'modalZoom cursor';
  137. modalZoom.innerHTML = '⤡'
  138. modalZoom.addEventListener('click', modalZoomToggle, true)
  139. modalZoom.title = "Toggle zoomed view";
  140. modalControls.appendChild(modalZoom)
  141. const modalTileImage = document.createElement('span')
  142. modalTileImage.className = 'modalTileImage cursor';
  143. modalTileImage.innerHTML = '⊞'
  144. modalTileImage.addEventListener('click', modalTileImageToggle, true)
  145. modalTileImage.title = "Preview tiling";
  146. modalControls.appendChild(modalTileImage)
  147. const modalClose = document.createElement('span')
  148. modalClose.className = 'modalClose cursor';
  149. modalClose.innerHTML = '×'
  150. modalClose.onclick = closeModal;
  151. modalClose.title = "Close image viewer";
  152. modalControls.appendChild(modalClose)
  153. const modalImage = document.createElement('img')
  154. modalImage.id = 'modalImage';
  155. modalImage.onclick = closeModal;
  156. modalImage.tabIndex=0
  157. modalImage.addEventListener('keydown', modalKeyHandler, true)
  158. modal.appendChild(modalImage)
  159. const modalPrev = document.createElement('a')
  160. modalPrev.className = 'modalPrev';
  161. modalPrev.innerHTML = '❮'
  162. modalPrev.tabIndex=0
  163. modalPrev.addEventListener('click',modalPrevImage,true);
  164. modalPrev.addEventListener('keydown', modalKeyHandler, true)
  165. modal.appendChild(modalPrev)
  166. const modalNext = document.createElement('a')
  167. modalNext.className = 'modalNext';
  168. modalNext.innerHTML = '❯'
  169. modalNext.tabIndex=0
  170. modalNext.addEventListener('click',modalNextImage,true);
  171. modalNext.addEventListener('keydown', modalKeyHandler, true)
  172. modal.appendChild(modalNext)
  173. gradioApp().getRootNode().appendChild(modal)
  174. document.body.appendChild(modalFragment);
  175. });