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