Menubar.View.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import { UIHorizontalRule, UIPanel, UIRow } from './libs/ui.js';
  2. function MenubarView( editor ) {
  3. const signals = editor.signals;
  4. const strings = editor.strings;
  5. const container = new UIPanel();
  6. container.setClass( 'menu' );
  7. const title = new UIPanel();
  8. title.setClass( 'title' );
  9. title.setTextContent( strings.getKey( 'menubar/view' ) );
  10. container.add( title );
  11. const options = new UIPanel();
  12. options.setClass( 'options' );
  13. container.add( options );
  14. // Helpers
  15. const states = {
  16. gridHelper: true,
  17. cameraHelpers: true,
  18. lightHelpers: true,
  19. skeletonHelpers: true
  20. };
  21. // Grid Helper
  22. let option = new UIRow().addClass( 'option' ).addClass( 'toggle' ).setTextContent( strings.getKey( 'menubar/view/gridHelper' ) ).onClick( function () {
  23. states.gridHelper = ! states.gridHelper;
  24. this.toggleClass( 'toggle-on', states.gridHelper );
  25. signals.showHelpersChanged.dispatch( states );
  26. } ).toggleClass( 'toggle-on', states.gridHelper );
  27. options.add( option );
  28. // Camera Helpers
  29. option = new UIRow().addClass( 'option' ).addClass( 'toggle' ).setTextContent( strings.getKey( 'menubar/view/cameraHelpers' ) ).onClick( function () {
  30. states.cameraHelpers = ! states.cameraHelpers;
  31. this.toggleClass( 'toggle-on', states.cameraHelpers );
  32. signals.showHelpersChanged.dispatch( states );
  33. } ).toggleClass( 'toggle-on', states.cameraHelpers );
  34. options.add( option );
  35. // Light Helpers
  36. option = new UIRow().addClass( 'option' ).addClass( 'toggle' ).setTextContent( strings.getKey( 'menubar/view/lightHelpers' ) ).onClick( function () {
  37. states.lightHelpers = ! states.lightHelpers;
  38. this.toggleClass( 'toggle-on', states.lightHelpers );
  39. signals.showHelpersChanged.dispatch( states );
  40. } ).toggleClass( 'toggle-on', states.lightHelpers );
  41. options.add( option );
  42. // Skeleton Helpers
  43. option = new UIRow().addClass( 'option' ).addClass( 'toggle' ).setTextContent( strings.getKey( 'menubar/view/skeletonHelpers' ) ).onClick( function () {
  44. states.skeletonHelpers = ! states.skeletonHelpers;
  45. this.toggleClass( 'toggle-on', states.skeletonHelpers );
  46. signals.showHelpersChanged.dispatch( states );
  47. } ).toggleClass( 'toggle-on', states.skeletonHelpers );
  48. options.add( option );
  49. //
  50. options.add( new UIHorizontalRule() );
  51. // Fullscreen
  52. option = new UIRow();
  53. option.setClass( 'option' );
  54. option.setTextContent( strings.getKey( 'menubar/view/fullscreen' ) );
  55. option.onClick( function () {
  56. if ( document.fullscreenElement === null ) {
  57. document.documentElement.requestFullscreen();
  58. } else if ( document.exitFullscreen ) {
  59. document.exitFullscreen();
  60. }
  61. // Safari
  62. if ( document.webkitFullscreenElement === null ) {
  63. document.documentElement.webkitRequestFullscreen();
  64. } else if ( document.webkitExitFullscreen ) {
  65. document.webkitExitFullscreen();
  66. }
  67. } );
  68. options.add( option );
  69. // XR (Work in progress)
  70. if ( 'xr' in navigator ) {
  71. if ( 'offerSession' in navigator.xr ) {
  72. signals.offerXR.dispatch( 'immersive-ar' );
  73. } else {
  74. navigator.xr.isSessionSupported( 'immersive-ar' )
  75. .then( function ( supported ) {
  76. if ( supported ) {
  77. const option = new UIRow();
  78. option.setClass( 'option' );
  79. option.setTextContent( 'AR' );
  80. option.onClick( function () {
  81. signals.enterXR.dispatch( 'immersive-ar' );
  82. } );
  83. options.add( option );
  84. } else {
  85. navigator.xr.isSessionSupported( 'immersive-vr' )
  86. .then( function ( supported ) {
  87. if ( supported ) {
  88. const option = new UIRow();
  89. option.setClass( 'option' );
  90. option.setTextContent( 'VR' );
  91. option.onClick( function () {
  92. signals.enterXR.dispatch( 'immersive-vr' );
  93. } );
  94. options.add( option );
  95. }
  96. } );
  97. }
  98. } );
  99. }
  100. }
  101. //
  102. return container;
  103. }
  104. export { MenubarView };