342 lines
10 KiB
C#
342 lines
10 KiB
C#
/*
|
||
* Created by JacobKay - 2022.08.24
|
||
*/
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
namespace ZTools
|
||
{
|
||
public class ZCalendarController
|
||
{
|
||
public int Year { set; get; }
|
||
public int Month { set; get; }
|
||
public int Day { set; get; }
|
||
/// <summary>
|
||
/// <20><>ǰ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>״̬
|
||
/// </summary>
|
||
private bool isInRange = false;
|
||
public bool IsInRange { get { return isInRange; } }
|
||
private string week;
|
||
private DateTime now;
|
||
private int days;
|
||
/// <summary>
|
||
/// <20><>ǰѡ<C7B0>е<EFBFBD>λ<EFBFBD><CEBB>
|
||
/// </summary>
|
||
public Vector3 pos;
|
||
private int lastMonthDays;
|
||
private int nextMonthDays;
|
||
public ZCalendar zCalendar;
|
||
public ZCalendarModel zCalendarModel;
|
||
public DateTime nowTime = DateTime.Today;
|
||
private int lastMonthEmptyDays;
|
||
bool isShow = true;
|
||
public bool isInit = false;
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
||
/// </summary>
|
||
public Color greyColor;
|
||
|
||
public System.Globalization.ChineseLunisolarCalendar cncld = new System.Globalization.ChineseLunisolarCalendar();
|
||
/// <summary>
|
||
/// ũ<><C5A9><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
public string[] lunarMonths = { "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "ʮ", "ʮһ", "<22><>" };
|
||
|
||
public string[] lunarDaysT = { "<22><>", "ʮ", "إ", "<22><>" };
|
||
|
||
/// <summary>
|
||
/// ũ<><C5A9><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
public string[] lunarDays = { "һ", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "<22><>", "ʮ" };
|
||
DateTime monthFirstDay;
|
||
/// <summary>
|
||
/// <20><>ʼ<EFBFBD><CABC>
|
||
/// </summary>
|
||
/// <param name="date"></param>
|
||
public void Init()
|
||
{
|
||
zCalendarModel.zCalendarController = this;
|
||
zCalendarModel.Init();
|
||
if (zCalendarModel.isStaticCalendar) return;
|
||
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹر<C9B9>
|
||
|
||
|
||
zCalendarModel.btnClose.onClick.AddListener(() =>
|
||
{
|
||
Hide();
|
||
});
|
||
|
||
zCalendarModel.btnLastYear.onClick.AddListener(LastYear);
|
||
zCalendarModel.btnNextYear.onClick.AddListener(NextYear);
|
||
zCalendarModel.btnLastMonth.onClick.AddListener(LastMonth);
|
||
zCalendarModel.btnNextMonth.onClick.AddListener(NextMonth);
|
||
Hide();
|
||
}
|
||
|
||
/// <summary>
|
||
/// <20><><EFBFBD>չ涨ʱ<E6B6A8><CAB1><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
public void InitDate(DateTime date)
|
||
{
|
||
now = date;
|
||
DestroyAllChildren();
|
||
UpdateYear();
|
||
UpdateMonth();
|
||
UpdateDays();
|
||
UpdateData();
|
||
if (!isInit)
|
||
{
|
||
isInit = true;
|
||
// 安全检查:确保 zCalendar 不为空,防止空引用异常
|
||
if (zCalendar != null)
|
||
{
|
||
zCalendar.DateComplete();
|
||
}
|
||
}
|
||
}
|
||
void LastYear()
|
||
{
|
||
now = now.AddYears(-1);
|
||
DestroyAllChildren();
|
||
UpdateYear();
|
||
UpdateMonth();
|
||
UpdateDays();
|
||
UpdateData();
|
||
}
|
||
void NextYear()
|
||
{
|
||
now = now.AddYears(1);
|
||
DestroyAllChildren();
|
||
UpdateYear();
|
||
UpdateMonth();
|
||
UpdateDays();
|
||
UpdateData();
|
||
}
|
||
void LastMonth()
|
||
{
|
||
now = now.AddMonths(-1);
|
||
DestroyAllChildren();
|
||
UpdateYear();
|
||
UpdateMonth();
|
||
UpdateDays();
|
||
UpdateData();
|
||
}
|
||
void NextMonth()
|
||
{
|
||
now = now.AddMonths(1);
|
||
DestroyAllChildren();
|
||
UpdateYear();
|
||
UpdateMonth();
|
||
UpdateDays();
|
||
UpdateData();
|
||
}
|
||
|
||
List<ZCalendarDayItem> dayItemList = new List<ZCalendarDayItem>();
|
||
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD>жϵ<D0B6>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>״̬
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public void ChangeRangeType(ZCalendarDayItem dayItem)
|
||
{
|
||
isInRange = !isInRange;
|
||
if (dayItemList.Count >= 2)
|
||
{
|
||
dayItemList.Clear();
|
||
}
|
||
if (dayItemList.Count == 0)
|
||
{
|
||
dayItemList.Add(dayItem);
|
||
}
|
||
else
|
||
{
|
||
int compare = DateTime.Compare(dayItemList[0].dateTime, dayItem.dateTime);
|
||
if (compare <= 0)
|
||
{
|
||
dayItemList.Add(dayItem);
|
||
}
|
||
else
|
||
{
|
||
dayItemList.Insert(0, dayItem);
|
||
}
|
||
}
|
||
if (!isInRange)
|
||
{
|
||
// 安全检查:确保列表中有至少2个元素才调用 RangeCalendar,防止数组越界异常
|
||
if (dayItemList.Count >= 2)
|
||
{
|
||
zCalendar.RangeCalendar(dayItemList[0], dayItemList[1]);
|
||
}
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
public void Show()
|
||
{
|
||
if (pos != null && !isShow)
|
||
{
|
||
isShow = true;
|
||
//zCalendar.transform.localPosition = pos;
|
||
if(zCalendarModel.writeTime!= null)
|
||
{
|
||
Vector3 mousePosition = Input.mousePosition + new Vector3(-960, -540, 0);
|
||
//<2F><>mousePositionתΪzCalendarModel<65><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + (mousePosition));
|
||
zCalendar.transform.localPosition = mousePosition + new Vector3(0, -280, 0);
|
||
}
|
||
else
|
||
{
|
||
zCalendar.transform.localPosition = pos;
|
||
}
|
||
|
||
zCalendar.transform.localScale = Vector3.one;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
public void Hide()
|
||
{
|
||
if (isShow && !isInRange)
|
||
{
|
||
isShow = false;
|
||
//Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||
zCalendar.transform.localPosition = new Vector3(pos.x, 5000, pos.z);
|
||
zCalendar.transform.localScale = Vector3.zero;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
void UpdateYear()
|
||
{
|
||
Year = now.Year;
|
||
}
|
||
/// <summary>
|
||
/// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
void UpdateMonth()
|
||
{
|
||
Month = int.Parse(now.Month.ToString("00"));
|
||
}
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
void UpdateDays()
|
||
{
|
||
days = DateTime.DaysInMonth(Year, Month);
|
||
if (Day == 0)
|
||
{
|
||
Day = now.Day;
|
||
}
|
||
else if (Day > days)
|
||
{
|
||
Day = days;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>·<EFBFBD>
|
||
/// </summary>
|
||
void UpdateData()
|
||
{
|
||
zCalendarModel.SetTimeTxt(Year, Month);
|
||
FillLastMonth();
|
||
for (int i = 0; i < days; i++)
|
||
{
|
||
AddDayItem(monthFirstDay.AddDays(i));
|
||
}
|
||
FillNextMonth();
|
||
}
|
||
/// <summary>
|
||
/// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
void FillLastMonth()
|
||
{
|
||
monthFirstDay = new DateTime(Year, Month, 1);
|
||
lastMonthEmptyDays = GetLastMonthDays();
|
||
|
||
|
||
for (int i = lastMonthEmptyDays; i > 0; i--)
|
||
{
|
||
AddDayItem(monthFirstDay.AddDays(-i));
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8>µ<EFBFBD>ʱ<EFBFBD><CAB1>
|
||
/// </summary>
|
||
void FillNextMonth()
|
||
{
|
||
int nextMonthDays = 42 - (lastMonthEmptyDays + days);
|
||
if (nextMonthDays != 0)
|
||
{
|
||
|
||
|
||
DateTime lastDay = monthFirstDay.AddDays(days);
|
||
for (int i = 0; i < nextMonthDays; i++)
|
||
{
|
||
AddDayItem(lastDay.AddDays(i));
|
||
}
|
||
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
|
||
/// </summary>
|
||
void AddDayItem(DateTime dateTime)
|
||
{
|
||
ZCalendarDayItem dayItem = zCalendarModel.Instantiate();
|
||
dayItem.zCalendarController = this;
|
||
dayItem.Init(dateTime, nowTime);
|
||
// 安全检查:确保 zCalendar 不为空,防止空引用异常
|
||
if (zCalendar != null)
|
||
{
|
||
zCalendar.UpdateDate(dayItem);
|
||
}
|
||
if (!isInRange && dayItemList.Count >= 2)
|
||
{
|
||
// 安全检查:确保列表中有至少2个元素,防止数组越界异常
|
||
dayItem.IsRangeDayItem(dayItemList[0], dayItemList[1]);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// <20>ж<EFBFBD><D0B6><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int GetLastMonthDays()
|
||
{
|
||
string firstWeek = new DateTime(Year, Month, 1).DayOfWeek.ToString();
|
||
return (int)Enum.Parse(typeof(DayOfWeek), firstWeek);
|
||
}
|
||
/// <summary>
|
||
/// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
/// </summary>
|
||
void DestroyAllChildren()
|
||
{
|
||
List<Transform> lst = new List<Transform>();
|
||
int count = zCalendarModel.dayContent.childCount;
|
||
for (int i = 0; i < count; i++)
|
||
{
|
||
Transform child = zCalendarModel.dayContent.GetChild(i);
|
||
lst.Add(child);
|
||
}
|
||
for (int i = 0; i < lst.Count; i++)
|
||
{
|
||
MonoBehaviour.Destroy(lst[i].gameObject);
|
||
}
|
||
}
|
||
}
|
||
}
|