// Copyright 2016 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; [RequireComponent(typeof(Toggle))] public class Tab : MonoBehaviour { #if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR) /// The prefab to use for this tab's page. [Tooltip("The prefab for this tab's page.")] [SerializeField] private GameObject pagePrefab; /// When the page is cached, it will only be instantiated the first /// time the tab is opened. On subsequent times it will just be /// activated/deactivated. [Tooltip("Cache the page when the tab is closed.")] [SerializeField] private bool cachePage; private Toggle toggle; /// Represents the tab's page. public GameObject Page { get; private set; } /// Returns true if the tab is open. public bool IsOpen { get; private set; } void Awake() { toggle = GetComponent(); toggle.onValueChanged.AddListener(OnValueChanged); OnValueChanged(toggle.isOn); } void OnDestroy() { toggle.onValueChanged.RemoveListener(OnValueChanged); if (Page != null) { GameObject.Destroy(Page); } } void OnValidate() { // Awake probably hasn't been called yet, so set this here. toggle = GetComponent(); // Make sure that this tab is part of a ToggleGroup. if (toggle.group == null) { Debug.LogError("Tab (" + gameObject.name + ") must be part of a ToggleGroup."); } // Make sure that the ToggleGroup has a TabGroup. TabGroup tabGroup = FindTabGroup(); if (tabGroup == null) { Debug.LogError("Tab (" + gameObject.name + ")'s ToggleGroup must have a TabGroup."); } } /// Call this function to open this tab. /// When called, the currently open tab in the /// TabGroup will automatically be closed. /// At least one Tab in the TabGroup must be open at all times. public void Open() { SetOpen(true); } private void SetOpen(bool open) { if (IsOpen == open) { return; } if (open) { EnablePage(); // Transition In IUITransition transition = FindTransition(); if (transition != null) { transition.TransitionIn(Page.transform, null, null); } } else { // Transition Out IUITransition transition = FindTransition(); if (transition != null) { transition.TransitionOut(Page.transform, () => { DisablePage(); }, null); } else { DisablePage(); } } IsOpen = open; // Make sure the toggle is in the correct state // in case SetOpen was called directly. toggle.isOn = open; EventTrigger eventTrigger = GetComponent(); if (eventTrigger != null) { eventTrigger.enabled = !open; } } private void EnablePage() { // If the page already exists, just activate it, // otherwise create it. if (Page != null) { Page.SetActive(true); } else { Page = GameObject.Instantiate(pagePrefab); TabGroup tabGroup = FindTabGroup(); Page.transform.SetParent(tabGroup.TabPageParent, false); } } private void DisablePage() { // If we are caching the page, then // just deactivate it. Otherwise, destroy it. if (cachePage) { Page.SetActive(false); } else { GameObject.Destroy(Page); Page = null; } } private void OnValueChanged(bool isOn) { SetOpen(isOn); } private TabGroup FindTabGroup() { // The TabGroup is expected to be on the same object as the ToggleGroup. ToggleGroup toggleGroup = toggle.group; TabGroup tabGroup = toggleGroup.GetComponent(); return tabGroup; } private IUITransition FindTransition() { return GetComponent(); } #endif // UNITY_HAS_GOOGLEVR &&(UNITY_ANDROID || UNITY_EDITOR }