threepipe
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

FullScreenPlugin.ts 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import {uiButton, uiFolderContainer} from 'uiconfig.js'
  2. import {AViewerPluginSync} from '../../viewer'
  3. /**
  4. * Full Screen Plugin
  5. *
  6. * A simple plugin that provides functions to {@link enter}, {@link exit}, {@link toggle} full screen mode and check if the viewer is in full screen mode with {@link isFullScreen}.
  7. *
  8. * Implementation from:
  9. * https://stackoverflow.com/questions/50568474/how-to-enter-fullscreen-in-three-js
  10. *
  11. * @todo: try out some lib like https://github.com/sindresorhus/screenfull for proper cross browser support
  12. * @category Plugins
  13. */
  14. @uiFolderContainer('Full Screen')
  15. export class FullScreenPlugin extends AViewerPluginSync<'enter'|'exit'> {
  16. public static readonly PluginType = 'FullScreenPlugin'
  17. toJSON: any = undefined
  18. enabled = true
  19. constructor() {
  20. super()
  21. this.enter = this.enter.bind(this)
  22. this.exit = this.exit.bind(this)
  23. }
  24. private _lastSize = ['100%', '100%']
  25. private _lastFsElement: any = null
  26. private _fsChangeHandler = (_: Event) => {
  27. if (this.isFullScreen()) {
  28. /* Run code when going to fs mode */
  29. this.dispatchEvent({type: 'enter'})
  30. } else {
  31. /* Run code when going back from fs mode */
  32. const elem = this._lastFsElement || this._viewer?.canvas
  33. if (elem) {
  34. elem.style.width = this._lastSize[0]
  35. elem.style.height = this._lastSize[1]
  36. }
  37. document.removeEventListener('webkitfullscreenchange', this._fsChangeHandler, false)
  38. document.removeEventListener('mozfullscreenchange', this._fsChangeHandler, false)
  39. document.removeEventListener('fullscreenchange', this._fsChangeHandler, false)
  40. document.removeEventListener('MSFullscreenChange', this._fsChangeHandler, false)
  41. this.dispatchEvent({type: 'exit'})
  42. }
  43. }
  44. @uiButton('Enter FullScreen', {sendArgs: false})
  45. async enter(element?: HTMLElement): Promise<void> {
  46. if (this.isFullScreen()) return
  47. const elem = element || this._viewer?.canvas as any
  48. if (!elem) return
  49. this._lastFsElement = elem
  50. if (document.addEventListener) {
  51. document.addEventListener('webkitfullscreenchange', this._fsChangeHandler, false)
  52. document.addEventListener('mozfullscreenchange', this._fsChangeHandler, false)
  53. document.addEventListener('fullscreenchange', this._fsChangeHandler, false)
  54. document.addEventListener('MSFullscreenChange', this._fsChangeHandler, false)
  55. }
  56. this._lastSize = [elem.style.width, elem.style.height]
  57. elem.style.width = '100%'
  58. elem.style.height = '100%'
  59. if (elem.requestFullscreen) {
  60. return elem.requestFullscreen()
  61. } else if (elem.mozRequestFullScreen) { /* Firefox */
  62. return elem.mozRequestFullScreen()
  63. } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari & Opera */
  64. return elem.webkitRequestFullscreen()
  65. } else if (elem.msRequestFullscreen) { /* IE/Edge */
  66. return elem.msRequestFullscreen()
  67. }
  68. }
  69. @uiButton('Exit FullScreen', {sendArgs: false})
  70. async exit(): Promise<void> {
  71. if (document.exitFullscreen) {
  72. return document.exitFullscreen()
  73. } else if ((document as any).mozCancelFullScreen) { /* Firefox */
  74. return (document as any).mozCancelFullScreen()
  75. } else if ((document as any).webkitExitFullscreen) { /* Chrome, Safari and Opera */
  76. return (document as any).webkitExitFullscreen()
  77. } else if ((document as any).msExitFullscreen) { /* IE/Edge */
  78. return (document as any).msExitFullscreen()
  79. }
  80. }
  81. @uiButton('Toggle FullScreen', {sendArgs: false})
  82. async toggle(element?: HTMLElement): Promise<void> {
  83. if (this.isFullScreen()) {
  84. return this.exit()
  85. } else {
  86. return this.enter(element)
  87. }
  88. }
  89. isFullScreen() {
  90. return (document as any).webkitIsFullScreen ||
  91. (document as any).mozFullScreen ||
  92. (document as any).msFullscreenElement !== undefined
  93. }
  94. }