import type { Context } from '../engine/engine_context.js'; import { serializable } from '../engine/engine_serialization.js'; import { DeviceUtilities } from '../engine/engine_utils.js'; import { Behaviour } from './Component.js'; /** * Provides configuration options for the built-in Needle Menu. * Needle Menu uses HTML in 2D mode, and automatically switches to a 3D menu in VR/AR mode. * * Controls display options, button visibility, and menu positioning. * From code, you can access the menu via {@link Context.menu}. * @category User Interface * @group Components **/ export class NeedleMenu extends Behaviour { /** * Determines the vertical positioning of the menu on the screen */ @serializable() position: "top" | "bottom" = "bottom"; /** * Controls the visibility of the Needle logo in the menu (requires PRO license) */ @serializable() showNeedleLogo: boolean = false; /** * When enabled, displays the menu in VR/AR mode when the user looks up * @default undefined */ @serializable() showSpatialMenu?: boolean; /** * When enabled, adds a fullscreen toggle button to the menu * @default undefined */ @serializable() createFullscreenButton?: boolean; /** * When enabled, adds an audio mute/unmute button to the menu * @default undefined */ @serializable() createMuteButton?: boolean; /** * When enabled, adds a button to display a QR code for sharing the application. * The QR code is only displayed on desktop devices. * @default undefined */ @serializable() createQRCodeButton?: boolean; /** * Applies the configured menu options when the component is enabled * @hidden */ onEnable() { this.applyOptions(); } /** * Applies all configured options to the active {@link Context.menu}. */ applyOptions() { this.context.menu.setPosition(this.position); this.context.menu.showNeedleLogo(this.showNeedleLogo); if (this.createFullscreenButton === true) this.context.menu.showFullscreenOption(true); if (this.createMuteButton === true) this.context.menu.showAudioPlaybackOption(true); if (this.showSpatialMenu === true) this.context.menu.showSpatialMenu(this.showSpatialMenu); if (this.createQRCodeButton === true) { if (!DeviceUtilities.isMobileDevice()) { this.context.menu.showQRCodeButton(true); } } } }