Test-TaizhouWarehousePhaseII/3d/Assets/3rdParty/ZCalendar/Scripts/ZCalendarController.cs

342 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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>
if (zCalendarModel.isPopupCalendar)
{
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();
if (zCalendarModel.autoFillDate)
{
for (int i = lastMonthEmptyDays; i > 0; i--)
{
AddDayItem(monthFirstDay.AddDays(-i));
}
}
else
{
for (int i = 0; i < lastMonthEmptyDays; i++)
{
ZCalendarDayItem dayItem = zCalendarModel.Instantiate();
dayItem.zCalendarController = this;
dayItem.CloseClickAble();
}
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8>µ<EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
void FillNextMonth()
{
int nextMonthDays = 42 - (lastMonthEmptyDays + days);
if (nextMonthDays != 0)
{
if (zCalendarModel.autoFillDate)
{
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);
}
}
}
}