using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Unity.VRTemplate
{
///
/// Controls the visual states of a boolean toggle switch UI
///
[RequireComponent(typeof(Toggle))]
public class BooleanToggleVisualsController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
const float k_TargetPositionX = 17f;
#pragma warning disable 649
[SerializeField, Tooltip("The boolean toggle knob.")]
RectTransform m_Knob;
[SerializeField, Tooltip("How much to translate the button imagery on the z on hover.")]
float m_ZTranslation = 5f;
#pragma warning restore 649
Toggle m_Toggle;
float m_InitialBackground;
Coroutine m_ColorFade;
Coroutine m_LocalMove;
void Awake()
{
m_Toggle = gameObject.GetComponent();
//Add listener for when the state of the Toggle changes, to take action
m_Toggle.onValueChanged.AddListener(ToggleValueChanged);
if (m_Knob != null)
{
m_InitialBackground = m_Knob.localPosition.z;
}
}
void OnEnable()
{
ToggleValueChanged(m_Toggle.isOn);
}
///
void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData)
{
PerformEntranceActions();
}
///
void IPointerExitHandler.OnPointerExit(PointerEventData eventData)
{
PerformExitActions();
}
void ToggleValueChanged(bool value)
{
if (value)
{
m_Knob.localPosition = new Vector3(k_TargetPositionX, m_Knob.localPosition.y, m_Knob.localPosition.z);
}
else
{
m_Knob.localPosition = new Vector3(-k_TargetPositionX, m_Knob.localPosition.y, m_Knob.localPosition.z);
}
}
void PerformEntranceActions()
{
if (m_Knob != null)
{
var backgroundLocalPosition = m_Knob.localPosition;
backgroundLocalPosition.z = m_InitialBackground - m_ZTranslation;
m_Knob.localPosition = backgroundLocalPosition;
}
}
void PerformExitActions()
{
if (m_Knob != null)
{
var backgroundLocalPosition = m_Knob.localPosition;
backgroundLocalPosition.z = m_InitialBackground;
m_Knob.localPosition = backgroundLocalPosition;
m_Knob.localScale = Vector3.one;
}
}
}
}