void DisplayHighlightedSubMenuContents() { m_BackButton.allowInteraction = true; ForceClearHomeMenuElements(); // Find any element hovered by a ray, for later comparison and selection override // of menu elements highlighted via other input modes SpatialMenu.SpatialMenuData rayHoveredElementMenuData = null; if (spatialInterfaceInputMode == SpatialInterfaceInputMode.Ray) { foreach (var menuElement in m_CurrentlyDisplayedMenuElements) { if (menuElement.hoveringNode != Node.None && menuElement.parentMenuData != null) { rayHoveredElementMenuData = menuElement.parentMenuData; break; } } } foreach (var menuData in spatialMenuData) { // Ray-based elements that are highlighted should take precedence over elements highlighted by other means // (neutral, BCI, etc) when changing menu levels if (menuData.highlighted && (rayHoveredElementMenuData == null || rayHoveredElementMenuData == menuData)) { m_CurrentlyDisplayedMenuElements.Clear(); var deleteOldChildren = m_SubMenuContainer.GetComponentsInChildren <Transform>().Where(x => x != m_SubMenuContainer); foreach (var child in deleteOldChildren) { if (child != null && child.gameObject != null) { ObjectUtils.Destroy(child.gameObject); } } foreach (var subMenuElement in menuData.spatialMenuElements) { var instantiatedPrefab = ObjectUtils.Instantiate(m_SubMenuElementPrefab).transform as RectTransform; var providerMenuElement = instantiatedPrefab.GetComponent <SpatialMenuElement>(); this.ConnectInterfaces(providerMenuElement); providerMenuElement.Setup(subMenuContainer, () => Debug.Log("Setting up SubMenu : " + subMenuElement.name), subMenuElement.name, subMenuElement.tooltipText); m_CurrentlyDisplayedMenuElements.Add(providerMenuElement); subMenuElement.VisualElement = providerMenuElement; providerMenuElement.parentMenuData = menuData; providerMenuElement.visible = true; providerMenuElement.selected = subMenuElement.correspondingFunction; } break; } } m_HomeSectionDescription.gameObject.SetActive(false); this.RestartCoroutine(ref m_HomeSectionTitlesBackgroundBordersTransitionCoroutine, AnimateTopAndBottomCenterBackgroundBorders(false)); }
void SpawnActions() { m_SpatialMenuData.Clear(); var spatialMenuActions = new List <SpatialMenu.SpatialMenuElementContainer>(); var spatialMenuData = new SpatialMenu.SpatialMenuData("Actions", "Perform actions on selected object", spatialMenuActions); m_SpatialMenuData.Add(spatialMenuData); m_MenuActions.Clear(); var actionTypes = CollectionPool <List <Type>, Type> .GetCollection(); typeof(IAction).GetImplementationsOfInterface(actionTypes); foreach (var actionType in actionTypes) { // Don't treat vanilla actions or tool actions as first class actions if (actionType.IsNested || !typeof(MonoBehaviour).IsAssignableFrom(actionType)) { continue; } var action = EditorXRUtils.AddComponent(actionType, gameObject) as IAction; this.ConnectInterfaces(action); this.InjectFunctionalitySingle(action); var defaultActionAttribute = (ActionMenuItemAttribute)actionType.GetCustomAttributes(typeof(ActionMenuItemAttribute), false).FirstOrDefault(); if (defaultActionAttribute != null) { var actionMenuData = new ActionMenuData() { name = defaultActionAttribute.name, sectionName = defaultActionAttribute.sectionName, priority = defaultActionAttribute.priority, action = action, }; m_MenuActions.Add(actionMenuData); } var spatialMenuAttribute = (SpatialMenuItemAttribute)actionType.GetCustomAttributes(typeof(SpatialMenuItemAttribute), false).FirstOrDefault(); if (spatialMenuAttribute != null) { spatialMenuActions.Add(new SpatialMenu.SpatialMenuElementContainer(spatialMenuAttribute.name, spatialMenuAttribute.description, (node) => action.ExecuteAction())); } m_Actions.Add(action); } CollectionPool <List <Type>, Type> .RecycleCollection(actionTypes); m_MenuActions.Sort((x, y) => y.priority.CompareTo(x.priority)); }
void OnButtonHighlighted(SpatialMenu.SpatialMenuData menuData) { m_HomeSectionDescription.text = menuData.spatialMenuDescription; const string kNoMenuHighlightedText = "Select a menu option"; string highlightedMenuDataText = kNoMenuHighlightedText; foreach (var data in spatialMenuData) { if (data.highlighted) { highlightedMenuDataText = data.spatialMenuDescription; break; } } m_HomeSectionDescription.text = highlightedMenuDataText; }