namespace UIWidgets { using System; using UIWidgets.Styles; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; /// /// Base class for Calendar date. /// public class CalendarDateBase : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler { /// /// Text component to display day. /// [SerializeField] protected TextAdapter dayAdapter; /// /// Text component to display day. /// public TextAdapter DayAdapter { get { return dayAdapter; } set { dayAdapter = value; DateChanged(); } } /// /// Image component to display day background. /// [SerializeField] protected Image DayImage; /// /// Selected date background. /// [SerializeField] public Sprite SelectedDayBackground; /// /// Selected date color. /// [SerializeField] public Color SelectedDay = Color.white; /// /// Default date background. /// [SerializeField] public Sprite DefaultDayBackground; /// /// Color for date in current month. /// [SerializeField] public Color CurrentMonth = Color.white; /// /// Weekend date color. /// [SerializeField] public Color Weekend = Color.red; /// /// Color for date not in current month. /// [SerializeField] public Color OtherMonth = Color.gray; /// /// Current date to display. /// protected DateTime CurrentDate; /// /// Date belongs to this calendar. /// [HideInInspector] public CalendarBase Calendar; /// /// Set current date. /// /// Current date. public virtual void SetDate(DateTime currentDate) { CurrentDate = currentDate; DateChanged(); } /// /// Update displayed date. /// public virtual void DateChanged() { DayAdapter.text = CurrentDate.ToString("dd", Calendar.Culture); if (Calendar.IsSameDay(Calendar.Date, CurrentDate)) { DayAdapter.color = SelectedDay; DayImage.sprite = SelectedDayBackground; } else { DayImage.sprite = DefaultDayBackground; if (Calendar.IsSameMonth(Calendar.DateDisplay, CurrentDate)) { if (Calendar.IsWeekend(CurrentDate) || Calendar.IsHoliday(CurrentDate)) { DayAdapter.color = Weekend; } else { DayAdapter.color = CurrentMonth; } } else { if (Calendar.IsWeekend(CurrentDate) || Calendar.IsHoliday(CurrentDate)) { DayAdapter.color = Weekend * OtherMonth; } else { DayAdapter.color = OtherMonth; } } if (CurrentDate < Calendar.DateMin) { DayAdapter.color *= OtherMonth; } else if (CurrentDate > Calendar.DateMax) { DayAdapter.color *= OtherMonth; } } } /// /// OnPoiterDown event. /// /// Event data. public void OnPointerDown(PointerEventData eventData) { } /// /// OnPointerUp event. /// /// Event data. public void OnPointerUp(PointerEventData eventData) { } /// /// PointerClick event. /// Change calendar date to clicked date. /// /// Event data. public void OnPointerClick(PointerEventData eventData) { if (!Calendar.IsActive()) { return; } if (CurrentDate < Calendar.DateMin) { return; } if (CurrentDate > Calendar.DateMax) { return; } Calendar.Date = CurrentDate; Calendar.OnDateClick.Invoke(CurrentDate); } /// /// Apply specified style. /// /// Style for the calendar. /// Full style data. public virtual void SetStyle(StyleCalendar styleCalendar, Style style) { if (DayAdapter != null) { styleCalendar.DayText.ApplyTo(DayAdapter.gameObject); } styleCalendar.DayBackground.ApplyTo(DayImage); DefaultDayBackground = styleCalendar.DayBackground.Sprite; SelectedDayBackground = styleCalendar.SelectedDayBackground; SelectedDay = styleCalendar.ColorSelectedDay; Weekend = styleCalendar.ColorWeekend; CurrentMonth = styleCalendar.ColorCurrentMonth; OtherMonth = styleCalendar.ColorOtherMonth; if (Calendar != null) { DateChanged(); } } /// /// Set style options from widget properties. /// /// Style for the calendar. /// Full style data. public virtual void GetStyle(StyleCalendar styleCalendar, Style style) { if (DayAdapter != null) { styleCalendar.DayText.GetFrom(DayAdapter.gameObject); } styleCalendar.DayBackground.GetFrom(DayImage); styleCalendar.DayBackground.Sprite = DefaultDayBackground; styleCalendar.SelectedDayBackground = SelectedDayBackground; styleCalendar.ColorSelectedDay = SelectedDay; styleCalendar.ColorWeekend = Weekend; styleCalendar.ColorCurrentMonth = CurrentMonth; styleCalendar.ColorOtherMonth = OtherMonth; } } }