using Nova;
using UnityEngine;
using UnityEngine.Events;
namespace NovaSamples.UIControls
{
///
/// A UI control which reacts to user input and flips an underlying bool to track a state as it is clicked.
///
public class Toggle : UIControl
{
[Tooltip("Event invoked when the toggle state changes. Provides the ToggledOn state.")]
public UnityEvent OnToggled = null;
[Tooltip("The toggle state of this toggle control")]
[SerializeField]
private bool toggledOn = false;
///
/// The state of this toggle control
///
public bool ToggledOn
{
get => toggledOn;
set
{
if (value == toggledOn)
{
return;
}
toggledOn = value;
UpdateToggleIndicator();
OnToggled?.Invoke(toggledOn);
}
}
private void OnEnable()
{
if (View.TryGetVisuals(out ToggleVisuals visuals))
{
// Set default state
visuals.UpdateVisualState(VisualState.Default);
}
// Subscribe to desired events
View.UIBlock.AddGestureHandler(HandleClicked);
View.UIBlock.AddGestureHandler(ToggleVisuals.HandleHovered);
View.UIBlock.AddGestureHandler(ToggleVisuals.HandleUnhovered);
View.UIBlock.AddGestureHandler(ToggleVisuals.HandlePressed);
View.UIBlock.AddGestureHandler(ToggleVisuals.HandleReleased);
View.UIBlock.AddGestureHandler(ToggleVisuals.HandlePressCanceled);
UpdateToggleIndicator();
}
private void OnDisable()
{
// Unsubscribe from events
View.UIBlock.RemoveGestureHandler(HandleClicked);
View.UIBlock.RemoveGestureHandler(ToggleVisuals.HandleHovered);
View.UIBlock.RemoveGestureHandler(ToggleVisuals.HandleUnhovered);
View.UIBlock.RemoveGestureHandler(ToggleVisuals.HandlePressed);
View.UIBlock.RemoveGestureHandler(ToggleVisuals.HandleReleased);
View.UIBlock.RemoveGestureHandler(ToggleVisuals.HandlePressCanceled);
}
///
/// Flip the toggle state on click.
///
/// The click event data.
/// The toggle visuals associated with the click event.
private void HandleClicked(Gesture.OnClick evt, ToggleVisuals visuals) => ToggledOn = !ToggledOn;
///
/// Update the visual toggle indicate to match the underlying state.
///
private void UpdateToggleIndicator()
{
if (!(View.Visuals is ToggleVisuals visuals) || visuals.IsOnIndicator == null)
{
return;
}
visuals.IsOnIndicator.gameObject.SetActive(toggledOn);
}
}
}