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