namespace UIWidgets { using System; using System.Collections.Generic; using UIWidgets.Styles; using UnityEngine; using UnityEngine.UI; /// /// Analog Time widget. /// public class TimeAnalog : TimeBase { /// /// The button to increase hours. /// [SerializeField] protected CircularSlider Slider; /// /// Step in minutes. /// [SerializeField] [Tooltip("Step in minutes.")] [Range(1, 60)] protected int step = 5; /// /// Step in minutes. /// public int Step { get { Init(); return (Slider != null) ? Slider.Step : step; } set { step = value; Slider.Step = value; } } /// /// The AMPM button. /// [SerializeField] protected Button AMPMButton; /// /// The AMPM text. /// [SerializeField] protected TextAdapter ampmText; /// /// The AMPM text. /// public TextAdapter AMPMTextAdapter { get { return ampmText; } set { ampmText = value; UpdateInputs(); } } /// /// Hours labels. /// [SerializeField] public List HoursLabels = new List(); /// /// Adds the listeners. /// protected override void AddListeners() { if (AMPMButton != null) { AMPMButton.onClick.AddListener(ToggleAMPM); } if (Slider != null) { Slider.OnChange.AddListener(SliderChanged); } } /// /// Removes the listeners. /// protected override void RemoveListeners() { if (AMPMButton != null) { AMPMButton.onClick.RemoveListener(ToggleAMPM); } if (Slider != null) { Slider.OnChange.RemoveListener(SliderChanged); } } /// /// Process slider changed event. /// protected virtual void SliderChanged() { if (Slider != null) { var h = Mathf.FloorToInt(Slider.Value / 60); var m = Mathf.FloorToInt(Slider.Value - (h * 60)); if (Time.Hours >= 12) { h += 12; } Time += new TimeSpan(h - Time.Hours, m - Time.Minutes, 0); } } /// /// Convert time to the slider value. /// /// Time. /// Slider value. protected int Time2SliderValue(TimeSpan time) { var hours = time.Hours; if (hours >= 12) { hours -= 12; } return (hours * 60) + time.Minutes; } /// /// Toggles the AMPM. /// public virtual void ToggleAMPM() { Time += new TimeSpan(12, 0, 0); } /// /// Updates the inputs. /// public override void UpdateInputs() { if (Slider != null) { Slider.Value = Time2SliderValue(Time); } if (AMPMTextAdapter != null) { AMPMTextAdapter.text = Time.Hours < 12 ? "AM" : "PM"; } } /// /// Init the input. /// protected override void InitInput() { if (Slider != null) { Slider.StartAngle = 270; Slider.Step = step; Slider.MinValue = 0; Slider.MaxValue = 12 * 60; } } /// /// Process interactable change. /// /// Current interactable state. protected override void OnInteractableChange(bool interactableState) { if (Slider != null) { Slider.Interactable = interactableState; } } /// /// Process the destroy event. /// protected override void OnDestroy() { RemoveListeners(); } #region IStylable implementation /// public override bool SetStyle(Style style) { // TODO time labels foreach (var label in HoursLabels) { style.Time.HourLabel.ApplyTo(label); } if (AMPMButton != null) { style.Time.AMPMBackground.ApplyTo(AMPMButton); } if (AMPMTextAdapter != null) { style.Time.AMPMText.ApplyTo(AMPMTextAdapter.gameObject); } if (Slider != null) { Slider.SetStyle(style); } return true; } /// public override bool GetStyle(Style style) { foreach (var label in HoursLabels) { style.Time.HourLabel.GetFrom(label); } if (AMPMButton != null) { style.Time.AMPMBackground.GetFrom(AMPMButton); } if (AMPMTextAdapter != null) { style.Time.AMPMText.GetFrom(AMPMTextAdapter.gameObject); } if (Slider != null) { Slider.GetStyle(style); } return true; } #endregion } }