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); } } }