using System; using System.Collections; using System.Collections.Generic; using System.Data; using UnityEngine; using UnityEngine.Events; namespace ZTools { [RequireComponent(typeof(ZCalendarModel))] public class ZCalendar : MonoBehaviour { /// /// 数据更新时,可获取到每一个日期,并对其进行操作 /// public class UpdateDateEvent : UnityEvent { } public UpdateDateEvent m_DayRefresh = new UpdateDateEvent(); /// /// 可以获取到点击的某一天 /// public class ChoiceDayEvent : UnityEvent { } public ChoiceDayEvent m_DayValueChanged = new ChoiceDayEvent(); /// /// 选择区间时间事件 /// public class RangeTimeEvent : UnityEvent { } public RangeTimeEvent m_RangeTimeEvent = new RangeTimeEvent(); /// /// 日历加载结束 /// public class CompleteEvent : UnityEvent { } public CompleteEvent m_completeEvent = new CompleteEvent(); /// /// 获取当前选中的天对象 /// public DateTime CrtTime { get; set; } /// /// model /// private ZCalendarModel zCalendarModel; /// /// controller /// private ZCalendarController zCalendarController; public CompleteEvent onComplete { set { m_completeEvent = value; } get { return m_completeEvent; } } public RangeTimeEvent onRangeTimeValueChanged { set { m_RangeTimeEvent = value; } get { return m_RangeTimeEvent; } } public ChoiceDayEvent onDayValueChanged { set { m_DayValueChanged = value; } get { return m_DayValueChanged; } } public UpdateDateEvent onDayRefresh { set { m_DayRefresh = value; } get { return m_DayRefresh; } } public event Action dayValueChangedDayItemListenerEvent; public event Action RangeTimeChangedDayItemListenerEvent; /// /// 入口 /// private void Start() { zCalendarModel = this.GetComponent(); // 开启时自动初始化 if (zCalendarModel.awake2Init) { Init(); } } /// /// 初始化 /// public void Init() { zCalendarController = new ZCalendarController() { zCalendar = this, zCalendarModel = zCalendarModel, pos = this.transform.localPosition }; zCalendarController.Init(); RefreshDate(); } /// /// 按照现在时间初始化 /// public void RefreshDate() { zCalendarController.RefreshDate(DateTime.Today); } /// /// 按照DateTime格式初始化日历 /// public void RefreshDate(DateTime dateTime) { if (dateTime.Hour != 0 || dateTime.Month != 0 || dateTime.Second != 0) { dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0); } zCalendarController.RefreshDate(dateTime); } /// /// 按照YYYY-MM-DD格式初始化日历 /// public void RefreshDate(string dateTime) { if (!dateTime.Contains("-") || dateTime.Contains(":")) { Debug.LogError("wrong format: Time divided by '-' and do not contains hour minute or second"); return; } string[] dateTimes = dateTime.Split('-'); zCalendarController.RefreshDate(new DateTime(int.Parse(dateTimes[0]), int.Parse(dateTimes[1]), int.Parse(dateTimes[2]))); } /// /// 初始化区间日历 /// public void RefreshDate(DateTime startDateTime, DateTime endDateTime) { if (!zCalendarModel.rangeCalendar) { Debug.LogError("ZCalendar Init Error:The config is not RangeCalendar!!!"); return; } if (startDateTime.Hour != 0 || startDateTime.Minute != 0 || startDateTime.Second != 0) { startDateTime = new DateTime(startDateTime.Year, startDateTime.Month, startDateTime.Day, 0, 0, 0); } if (endDateTime.Hour != 0 || endDateTime.Minute != 0 || endDateTime.Second != 0) { endDateTime = new DateTime(endDateTime.Year, endDateTime.Month, endDateTime.Day, 0, 0, 0); } zCalendarController.RefreshDate(startDateTime, endDateTime); } /// /// 初始化区间日历 /// /// 开始时间,以‘-’分割 /// 结束时间,以‘-’分割 public void RefreshDate(string startDateTime, string endDateTime) { if (!startDateTime.Contains("-") || !endDateTime.Contains("-")) { Debug.LogError("wrong format: Time divided by '-' and do not contains hour minute or second"); return; } string[] startDateTimes = startDateTime.Split('-'); string[] endDataTimes = endDateTime.Split('-'); zCalendarController.RefreshDate(new DateTime(int.Parse(startDateTimes[0]), int.Parse(startDateTimes[1]), int.Parse(startDateTimes[2])), new DateTime(int.Parse(endDataTimes[0]), int.Parse(endDataTimes[1]), int.Parse(endDataTimes[2]))); } /// /// 显示弹窗 /// public void Show() { zCalendarController.Show(); } /// /// 隐藏弹窗 /// public void Hide() { zCalendarController.Hide(); } /// /// 切换时间 /// /// [Obsolete("事件触发器,请使用UpdateDateEvent获取切换月份时加载的时间对象")] public void UpdateDate(DateTime obj) { m_DayRefresh.Invoke(obj); } DateTime choiceTime; /// /// 日期点击 /// [Obsolete("事件触发器,请使用ChoiceDayEvent获取当前选择的时间")] public void DayClick(DateTime dayItem) { choiceTime = new DateTime(dayItem.Year, dayItem.Month, dayItem.Day, zCalendarModel.hour.choiceTime, zCalendarModel.min.choiceTime, zCalendarModel.second.choiceTime); dayValueChangedDayItemListenerEvent.Invoke(dayItem); m_DayValueChanged.Invoke(dayItem.AddHours(zCalendarModel.hour.choiceTime).AddMinutes(zCalendarModel.min.choiceTime).AddSeconds(zCalendarModel.second.choiceTime)); CrtTime = dayItem; } public void TimeChoice() { if (zCalendarModel.rangeCalendar) { RangeCalendar(rangeStartTime, rangeEndTime); } else { DayClick(CrtTime); } } /// /// 加载结束 /// [Obsolete("事件触发器,请使用CompleteEvent获取日历加载完成事件")] public void DateComplete() { onComplete?.Invoke(); } DateTime rangeStartTime, rangeEndTime; /// /// 区间日期选择 /// /// /// [Obsolete("事件触发器,请使用RangeTimeEvent获取区间时间")] public void RangeCalendar(DateTime firstDay, DateTime secondDay ) { RangeTimeChangedDayItemListenerEvent?.Invoke(firstDay, secondDay); m_RangeTimeEvent?.Invoke(firstDay.AddHours(zCalendarModel.hour.choiceTime).AddMinutes(zCalendarModel.min.choiceTime).AddSeconds(zCalendarModel.second.choiceTime), secondDay.AddHours(zCalendarModel.hour.choiceTime).AddMinutes(zCalendarModel.min.choiceTime).AddSeconds(zCalendarModel.second.choiceTime)); rangeStartTime = firstDay; rangeEndTime = secondDay; } private void OnDestroy() { zCalendarController = null; GC.Collect(); } } }