| //--------------------------------------------------------  | 
| //    [Author]:           第二世界  | 
| //    [  Date ]:           Monday, January 28, 2019  | 
| //--------------------------------------------------------  | 
|   | 
| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
| using UnityEngine;  | 
| using UnityEngine.UI;  | 
|   | 
| namespace vnxbqy.UI  | 
| {  | 
|       | 
|     public class FestivalRedpackWin : Window  | 
|     {  | 
|         [SerializeField] FestivalRedpackSystemBehaviour m_FestivalSystemBehaviour;  | 
|         [SerializeField] Transform m_ContainerAchievement;  | 
|         [SerializeField] ScrollerController m_AchievementController;  | 
|         [SerializeField] Transform m_ContainerRedEnvelope;  | 
|         [SerializeField] ScrollerController m_RedEnvelopeControl;  | 
|         [SerializeField] Transform m_ContainerNoEnvelope;  | 
|         [SerializeField] Text m_OpenTime;  | 
|         [SerializeField] Transform m_ContainerGrab;  | 
|         [SerializeField] Transform m_ContainerCount;  | 
|         [SerializeField] Text m_GrabCount;  | 
|         [SerializeField] Text m_GrabJade;  | 
|   | 
|         FestivalRedpackModel model { get { return ModelCenter.Instance.GetModel<FestivalRedpackModel>(); } }  | 
|   | 
|         AchievementModel achieveModel  | 
|         {  | 
|             get { return ModelCenter.Instance.GetModel<AchievementModel>(); }  | 
|         }  | 
|   | 
|         RedEnvelopeModel envelopeModel { get { return ModelCenter.Instance.GetModel<RedEnvelopeModel>(); } }  | 
|   | 
|         #region Built-in  | 
|         protected override void BindController()  | 
|         {  | 
|         }  | 
|   | 
|         protected override void AddListeners()  | 
|         {  | 
|             m_AchievementController.OnRefreshCell += OnRefreshAchievementCell;  | 
|             m_RedEnvelopeControl.OnRefreshCell += OnRefreshRedEnvelopeCell;  | 
|         }  | 
|   | 
|         protected override void OnPreOpen()  | 
|         {  | 
|             model.selectTypeRefresh += SelectTypeRefresh;  | 
|             model.redpackGrabRefresh += RedpackGrabRefresh;  | 
|             WindowCenter.Instance.windowAfterOpenEvent += WindowAfterOpenEvent;  | 
|             OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;  | 
|             achieveModel.achievementCompletedEvent += FestivalAchievementRefresh;  | 
|             achieveModel.achievementProgressUpdateEvent += FestivalAchievementRefresh;  | 
|             model.taskRedpackRefresh += TaskRedpackRefresh;  | 
|             Display();  | 
|   | 
|             model.SetDayRemind();  | 
|         }  | 
|   | 
|         protected override void OnAfterOpen()  | 
|         {  | 
|         }  | 
|   | 
|         protected override void OnPreClose()  | 
|         {  | 
|             model.selectTypeRefresh -= SelectTypeRefresh;  | 
|             model.redpackGrabRefresh -= RedpackGrabRefresh;  | 
|             WindowCenter.Instance.windowAfterOpenEvent -= WindowAfterOpenEvent;  | 
|             OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;  | 
|             achieveModel.achievementCompletedEvent -= FestivalAchievementRefresh;  | 
|             achieveModel.achievementProgressUpdateEvent -= FestivalAchievementRefresh;  | 
|             model.taskRedpackRefresh -= TaskRedpackRefresh;  | 
|             m_FestivalSystemBehaviour.Dispose();  | 
|         }  | 
|   | 
|         protected override void OnAfterClose()  | 
|         {  | 
|         }  | 
|         #endregion  | 
|   | 
|         void Display()  | 
|         {  | 
|             DisplayType();  | 
|             DisplayOpenTime();  | 
|             DisplayGrab();  | 
|         }  | 
|   | 
|         void DisplayType()  | 
|         {  | 
|             m_FestivalSystemBehaviour.SetActive(model.selectType == 1);  | 
|             m_ContainerAchievement.SetActive(model.selectType == 2);  | 
|             m_ContainerRedEnvelope.SetActive(model.selectType == 3);  | 
|             m_ContainerGrab.SetActive(model.selectType != 2);  | 
|             m_ContainerCount.SetActive(model.selectType == 3);  | 
|             switch (model.selectType)  | 
|             {  | 
|                 case 1:  | 
|                     m_FestivalSystemBehaviour.Display();  | 
|                     break;  | 
|                 case 2:  | 
|                     m_FestivalSystemBehaviour.Dispose();  | 
|                     DisplayAchievements();  | 
|                     break;  | 
|                 case 3:  | 
|                     m_FestivalSystemBehaviour.Dispose();  | 
|                     DisplayRedpacks();  | 
|                     break;  | 
|             }  | 
|         }  | 
|   | 
|         void DisplayAchievements()  | 
|         {  | 
|             m_AchievementController.Refresh();  | 
|             model.displayAchievements.Clear();  | 
|             List<FestivalRedpackAchievement> list;  | 
|             if (model.TryGetAchievements(model.operationDay + 1, out list))  | 
|             {  | 
|                 model.displayAchievements.AddRange(list);  | 
|                 model.displayAchievements.Sort(model.AchievementSort);  | 
|             }  | 
|             for (int i = 0; i < model.displayAchievements.Count; i++)  | 
|             {  | 
|                 m_AchievementController.AddCell(ScrollerDataType.Header, i);  | 
|             }  | 
|             m_AchievementController.Restart();  | 
|         }  | 
|   | 
|         void DisplayRedpacks()  | 
|         {  | 
|             m_RedEnvelopeControl.Refresh();  | 
|             model.taskDisplayRedpacks.Clear();  | 
|             List<int> list;  | 
|             if (envelopeModel.TryGetEnvelopes(FestivalRedpackModel.FESTIVALTASKREDPACKTYPE, out list))  | 
|             {  | 
|                 model.taskDisplayRedpacks.AddRange(list);  | 
|             }  | 
|             model.taskDisplayRedpacks.Sort(model.CompareEnvelope);  | 
|             var _line = Mathf.CeilToInt((float)model.taskDisplayRedpacks.Count / 5);  | 
|             for (int i = 0; i < _line; i++)  | 
|             {  | 
|                 m_RedEnvelopeControl.AddCell(ScrollerDataType.Header, i);  | 
|             }  | 
|             m_RedEnvelopeControl.Restart();  | 
|             m_ContainerNoEnvelope.SetActive(model.taskDisplayRedpacks.Count == 0);  | 
|         }  | 
|   | 
|         void DisplayOpenTime()  | 
|         {  | 
|             OperationFestivalRedpack operation;  | 
|             if (OperationTimeHepler.Instance.TryGetOperation(Operation.FestivalRedpack, out operation))  | 
|             {  | 
|                 m_OpenTime.text = StringUtility.Contact(Language.Get("ExpActivity_Text1"), operation.ToDisplayTime());  | 
|             }  | 
|         }  | 
|   | 
|         void DisplayGrab()  | 
|         {  | 
|             m_GrabCount.text = model.grabRedpackTimes.ToString();  | 
|             m_GrabJade.text = model.grabTotalJade.ToString();  | 
|         }  | 
|   | 
|         private void OnRefreshAchievementCell(ScrollerDataType type, CellView cell)  | 
|         {  | 
|             var achievementCell = cell as FestivalAchievementCell;  | 
|             achievementCell.Display(cell.index);  | 
|         }  | 
|   | 
|         private void OnRefreshRedEnvelopeCell(ScrollerDataType type, CellView cell)  | 
|         {  | 
|             var redpackCell = cell as OSRedEnvelopeCell;  | 
|             redpackCell.DisplayFestivalRedpacks(cell.index);  | 
|         }  | 
|   | 
|         private void SelectTypeRefresh()  | 
|         {  | 
|             DisplayType();  | 
|         }  | 
|   | 
|         private void RedpackGrabRefresh()  | 
|         {  | 
|             DisplayGrab();  | 
|         }  | 
|   | 
|         private void WindowAfterOpenEvent(Window win)  | 
|         {  | 
|             if (win is OpenServerActivityWin)  | 
|             {  | 
|                 AutoOpenRedpack();  | 
|             }  | 
|         }  | 
|   | 
|         void AutoOpenRedpack()  | 
|         {  | 
|             if (model.autoOpen && model.selectType == 3)  | 
|             {  | 
|                 for (int i = 0; i < model.taskDisplayRedpacks.Count; i++)  | 
|                 {  | 
|                     RedEnvelopeModel.RedEnvelope envelope;  | 
|                     if (envelopeModel.TryGetEnvelope(model.taskDisplayRedpacks[i], out envelope)  | 
|                         && envelope.state == 1)  | 
|                     {  | 
|                         if (PlayerDatas.Instance.PlayerId == envelope.player  | 
|                             || model.grabRedpackTimes > 0)  | 
|                         {  | 
|                             ModelCenter.Instance.GetModel<RedPacketModel>().RedBagId = envelope.id;  | 
|                             WindowCenter.Instance.Open<RedpackOpenWin>();  | 
|                             break;  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|             else if (model.autoOpen && model.selectType == 1)  | 
|             {  | 
|                 for (int i = 0; i < model.systemDisplayRedpacks.Count; i++)  | 
|                 {  | 
|                     var redpackServerId = 0;  | 
|                     if (model.IsExistSystemRedpack(model.systemDisplayRedpacks[i], out redpackServerId))  | 
|                     {  | 
|                         RedEnvelopeModel.RedEnvelope envelope;  | 
|                         if (envelopeModel.TryGetEnvelope(redpackServerId, out envelope)  | 
|                             && envelope.state == 1)  | 
|                         {  | 
|                             RedpackSystemOpenWin.redpackId = model.systemDisplayRedpacks[i];  | 
|                             RedpackSystemOpenWin.redpackServerId = redpackServerId;  | 
|                             WindowCenter.Instance.Open<RedpackSystemOpenWin>();  | 
|                             break;  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|             model.autoOpen = false;  | 
|         }  | 
|   | 
|         private void DayResetEvent(int resetType)  | 
|         {  | 
|             OperationFestivalRedpack operation;  | 
|             if (OperationTimeHepler.Instance.TryGetOperation(Operation.FestivalRedpack, out operation))  | 
|             {  | 
|                 if (resetType == operation.resetType)  | 
|                 {  | 
|                     if (model.selectType == 2)  | 
|                     {  | 
|                         DisplayAchievements();  | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         private void FestivalAchievementRefresh(int id)  | 
|         {  | 
|             if (model.selectType != 2)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             Achievement achievement;  | 
|             if (model.IsContainsAchievement(model.displayAchievements, id))  | 
|             {  | 
|                 FestivalRedpackAchievement festivalRedpackAchievement = model.displayAchievements.Find((x) =>  | 
|                 {  | 
|                     return x.Contains(id);  | 
|                 });  | 
|                 if (festivalRedpackAchievement != null)  | 
|                 {  | 
|                     if (achieveModel.TryGetAchievement(festivalRedpackAchievement.CurrentAchieve, out achievement))  | 
|                     {  | 
|                         if (Achievement.IsReach(achievement.id, achievement.progress))  | 
|                         {  | 
|                             DisplayAchievements();  | 
|                             return;  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|             m_AchievementController.m_Scorller.RefreshActiveCellViews();  | 
|         }  | 
|   | 
|         private void TaskRedpackRefresh()  | 
|         {  | 
|             if (model.selectType == 3)  | 
|             {  | 
|                 DisplayRedpacks();  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
| }  | 
|   | 
|   | 
|   | 
|   |