Menubar.View.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. // new helpers are visible by default, the global visibility state
  50. // of helpers is managed in this component. every time a helper is added,
  51. // we request a viewport updated by firing the showHelpersChanged signal.
  52. signals.helperAdded.add( function () {
  53. signals.showHelpersChanged.dispatch( states );
  54. } );
  55. //
  56. options.add( new UIHorizontalRule() );
  57. // Fullscreen
  58. option = new UIRow();
  59. option.setClass( 'option' );
  60. option.setTextContent( strings.getKey( 'menubar/view/fullscreen' ) );
  61. option.onClick( function () {
  62. if ( document.fullscreenElement === null ) {
  63. document.documentElement.requestFullscreen();
  64. } else if ( document.exitFullscreen ) {
  65. document.exitFullscreen();
  66. }
  67. // Safari
  68. if ( document.webkitFullscreenElement === null ) {
  69. document.documentElement.webkitRequestFullscreen();
  70. } else if ( document.webkitExitFullscreen ) {
  71. document.webkitExitFullscreen();
  72. }
  73. } );
  74. options.add( option );
  75. // XR (Work in progress)
  76. if ( 'xr' in navigator ) {
  77. if ( 'offerSession' in navigator.xr ) {
  78. signals.offerXR.dispatch( 'immersive-ar' );
  79. } else {
  80. navigator.xr.isSessionSupported( 'immersive-ar' )
  81. .then( function ( supported ) {
  82. if ( supported ) {
  83. const option = new UIRow();
  84. option.setClass( 'option' );
  85. option.setTextContent( 'AR' );
  86. option.onClick( function () {
  87. signals.enterXR.dispatch( 'immersive-ar' );
  88. } );
  89. options.add( option );
  90. } else {
  91. navigator.xr.isSessionSupported( 'immersive-vr' )
  92. .then( function ( supported ) {
  93. if ( supported ) {
  94. const option = new UIRow();
  95. option.setClass( 'option' );
  96. option.setTextContent( 'VR' );
  97. option.onClick( function () {
  98. signals.enterXR.dispatch( 'immersive-vr' );
  99. } );
  100. options.add( option );
  101. }
  102. } );
  103. }
  104. } );
  105. }
  106. }
  107. //
  108. return container;
  109. }
  110. export { MenubarView };
粤ICP备19079148号