EnergyEfficiencyManagement/Assets/Zion/DatePicker/DatePicker_Config.cs

337 lines
10 KiB
C#

using System;
using System.Collections;
using System.Globalization;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UI.Tables;
namespace UI.Dates
{
[Serializable]
public class DatePickerEvent : UnityEvent<DateTime> { }
[Serializable]
public struct DatePickerConfig
{
public DatePickerMiscConfig Misc;
[Space]
public DatePickerSizeConfig Sizing;
[Space]
public DatePickerModalConfig Modal;
[Space]
public DatePickerDateRangeConfig DateRange;
[Space]
public DatePickerFormatConfig Format;
[Space]
public DatePickerBorderConfig Border;
[Space]
public DatePickerHeaderConfig Header;
[Space]
public DatePickerWeekDaysConfig WeekDays;
[Space]
public DatePickerDayConfig Days;
[Space]
public DatePickerAnimationConfig Animation;
[Space]
public DatePickerInputFieldConfig InputField;
[Space]
public DatePickerEventConfig Events;
}
[Serializable]
public class DatePickerSizeConfig
{
public bool OverrideTransformHeight = false;
public float PreferredHeight = 256f;
public bool UsePreferredWidthInsteadOfInputFieldWidth = false;
public float PreferredWidth = 256f;
}
[Serializable]
public class DatePickerDayConfig
{
public Color BackgroundColor;
public Font Font;
public int FontSize;
public DatePickerDayButtonConfig CurrentMonth;
public DatePickerDayButtonConfig OtherMonths;
public DatePickerDayButtonConfig Today;
public DatePickerDayButtonConfig SelectedDay;
}
[Serializable]
public class DatePickerBorderConfig
{
public RectOffset Size = null;
public Color Color;
}
[Serializable]
public class DatePickerDayButtonConfig
{
[Tooltip("If this value is set, then the values provided here will override the values of the template. If you wish to modify the template directly, this value should be cleared.")]
public bool OverrideTemplate = true;
[Header("Text")]
public Color TextColor;
[Header("Background")]
public Sprite BackgroundImage;
public ColorBlock BackgroundColors;
public void ApplyConfig(DatePicker_Button button)
{
if (!OverrideTemplate) return;
button.Text.color = TextColor;
//button.Button.colors = BackgroundColors;
button.Button.colors.Apply(BackgroundColors);
button.Button.image.sprite = BackgroundImage;
}
}
[Serializable]
public class DatePickerWeekDaysConfig
{
[Header("Week Numbers")]
public bool ShowWeekNumbers = false;
public WeekNumberMode WeekNumberMode = WeekNumberMode.WeekOfYear;
public CalendarWeekRule CalendarWeekRule = CalendarWeekRule.FirstFullWeek;
[Tooltip("0 == Auto")]
public float WeekNumberColumnWidth = 0f;
[Header("Appearance")]
[Tooltip("If this value is set, then the values provided here will override the values of the template. If you wish to modify the template directly, this value should be cleared.")]
public bool OverrideTemplate = true;
[Header("Text")]
public Color TextColor;
public Font Font;
public int FontSize;
[Header("Background")]
public Sprite BackgroundImage;
public Color BackgroundColor;
public void ApplyConfig(DatePicker_DayHeader header)
{
if (!OverrideTemplate) return;
header.HeaderText.color = TextColor;
header.HeaderText.font = Font;
header.HeaderText.fontSize = FontSize;
header.Cell.image.sprite = BackgroundImage;
header.Cell.image.color = BackgroundColor;
}
}
[Serializable]
public class DatePickerButtonConfig
{
public Sprite Image;
public ColorBlock Colors;
public void ApplyConfig(DatePicker_Button button)
{
//button.Button.colors = Colors;
button.Button.colors.Apply(Colors);
button.Button.image.sprite = Image;
}
}
[Serializable]
public class DatePickerHeaderConfig
{
public bool ShowHeader = true;
[Header("Background")]
public Color BackgroundColor;
[Header("Text")]
public Color TextColor;
public Font Font;
[Header("Buttons")]
public bool ShowNextAndPreviousMonthButtons = true;
public bool ShowNextAndPreviousYearButtons = true;
[Header("Height")]
public float Height = 48f;
public DatePickerButtonConfig PreviousMonthButton;
public DatePickerButtonConfig NextMonthButton;
public DatePickerButtonConfig PreviousYearButton;
public DatePickerButtonConfig NextYearButton;
public void Apply(DatePicker_Header header)
{
if (header == null) return;
if (ShowHeader)
{
header.gameObject.SetActive(true);
}
else
{
header.gameObject.SetActive(false);
return;
}
header.Background.color = BackgroundColor;
header.HeaderText.color = TextColor;
header.HeaderText.font = Font;
if (ShowNextAndPreviousMonthButtons)
{
header.NextMonthButton.gameObject.SetActive(true);
header.PreviousMonthButton.gameObject.SetActive(true);
NextMonthButton.ApplyConfig(header.NextMonthButton);
PreviousMonthButton.ApplyConfig(header.PreviousMonthButton);
}
else
{
header.NextMonthButton.gameObject.SetActive(false);
header.PreviousMonthButton.gameObject.SetActive(false);
}
if (ShowNextAndPreviousYearButtons)
{
header.NextYearButton.gameObject.SetActive(true);
header.PreviousYearButton.gameObject.SetActive(true);
NextYearButton.ApplyConfig(header.NextYearButton);
PreviousYearButton.ApplyConfig(header.PreviousYearButton);
}
else
{
header.NextYearButton.gameObject.SetActive(false);
header.PreviousYearButton.gameObject.SetActive(false);
}
header.Row.preferredHeight = Height;
}
}
[Serializable]
public struct DatePickerEventConfig
{
[SerializeField]
public DatePickerEvent OnDaySelected;
[SerializeField]
public DatePickerEvent OnDayMouseOver;
}
[Serializable]
public class DatePickerMiscConfig
{
[Tooltip("If this is set, the DatePicker will always switch to the selected month when a new date is selected.")]
public bool SwitchToSelectedMonthWhenDateSelected = true;
public bool ShowDatesInOtherMonths = true;
[Tooltip("If this is set, then the DatePicker will be closed when a date is selected. Useful for popup datepicker dialogs.")]
public bool CloseWhenDateSelected = false;
public DatePickerMiscConfig Clone()
{
return new DatePickerMiscConfig
{
SwitchToSelectedMonthWhenDateSelected = SwitchToSelectedMonthWhenDateSelected,
ShowDatesInOtherMonths = ShowDatesInOtherMonths,
CloseWhenDateSelected = CloseWhenDateSelected
};
}
}
[Serializable]
public class DatePickerFormatConfig
{
public string DateFormat = DatePickerUtilities.DateFormat;
}
[Serializable]
public class DatePickerModalConfig
{
[Tooltip("If this is set to true, then the DatePicker will be the only thing on the screen which can be interacted with when it is active.")]
public bool IsModal = false;
[Tooltip("If this is set to true, then the DatePicker will be closed when the screen overlay is clicked. Relevant to Modal DatePickers only.")]
public bool CloseWhenModalOverlayClicked = true;
public Color ScreenOverlayColor;
}
[Serializable]
public class DatePickerDateRangeConfig
{
public bool RestrictFromDate = false;
public SerializableDate FromDate;
public bool RestrictToDate = false;
public SerializableDate ToDate;
public bool Validate(bool silent = false)
{
if (RestrictFromDate && !FromDate.HasValue)
{
if(!silent) Debug.Log("[DatePicker] Restrict From Date requires a 'From Date' to be specified.");
return false;
}
if (RestrictToDate && !ToDate.HasValue)
{
if(!silent) Debug.Log("[DatePicker] Restrict To Date requires a 'To Date' to be specified.");
return false;
}
if (RestrictFromDate && RestrictToDate)
{
if (ToDate.Date.CompareTo(FromDate.Date) < 0)
{
if(!silent) Debug.Log("[DatePicker] Invalid Date range specified.");
return false;
}
}
return true;
}
public DatePickerDateRangeConfig Clone()
{
return new DatePickerDateRangeConfig
{
RestrictFromDate = RestrictFromDate,
RestrictToDate = RestrictToDate,
FromDate = new SerializableDate(FromDate),
ToDate = new SerializableDate(ToDate)
};
}
}
[Serializable]
public class DatePickerInputFieldConfig
{
public bool ToggleDisplayWhenInputFieldClicked = true;
public bool ShowToggleButton = true;
public float ToggleButtonWidth = 64f;
public Dates.Alignment DatePickerAlignmentRelativeToInputField = Dates.Alignment.Left;
}
[Serializable]
public class DatePickerAnimationConfig
{
public Animation ShowAnimation = Animation.None;
public Animation HideAnimation = Animation.None;
public Animation MonthChangedAnimation = Animation.None;
}
}