using Nova;
using UnityEngine;
using UnityEngine.Events;
namespace NovaSamples.UIControls
{
///
/// A UI control which reacts to user input and fires click events
///
public class Button : UIControl
{
[Tooltip("Event fired when the button is clicked.")]
public UnityEvent OnClicked = null;
private void OnEnable()
{
if (View.TryGetVisuals(out ButtonVisuals visuals))
{
// Set default state
visuals.UpdateVisualState(VisualState.Default);
}
// Subscribe to desired events
View.UIBlock.AddGestureHandler(HandleClicked);
View.UIBlock.AddGestureHandler(ButtonVisuals.HandleHovered);
View.UIBlock.AddGestureHandler(ButtonVisuals.HandleUnhovered);
View.UIBlock.AddGestureHandler(ButtonVisuals.HandlePressed);
View.UIBlock.AddGestureHandler(ButtonVisuals.HandleReleased);
View.UIBlock.AddGestureHandler(ButtonVisuals.HandlePressCanceled);
}
private void OnDisable()
{
// Unsubscribe from events
View.UIBlock.RemoveGestureHandler(HandleClicked);
View.UIBlock.RemoveGestureHandler(ButtonVisuals.HandleHovered);
View.UIBlock.RemoveGestureHandler(ButtonVisuals.HandleUnhovered);
View.UIBlock.RemoveGestureHandler(ButtonVisuals.HandlePressed);
View.UIBlock.RemoveGestureHandler(ButtonVisuals.HandleReleased);
View.UIBlock.RemoveGestureHandler(ButtonVisuals.HandlePressCanceled);
}
///
/// Fire the Unity event on Click.
///
/// The click event data.
/// The buttons visuals which received the click.
private void HandleClicked(Gesture.OnClick evt, ButtonVisuals visuals) => OnClicked?.Invoke();
}
}