forked from endernon/PGRData
317 lines
10 KiB
Lua
317 lines
10 KiB
Lua
---@class XUiWeekChallenge
|
|
local XUiWeekChallenge = XClass(nil, "XUiWeekChallenge")
|
|
|
|
function XUiWeekChallenge:Ctor(ui, rootUi)
|
|
self.GameObject = ui.gameObject
|
|
self.Transform = ui.transform
|
|
self.RootUi = rootUi
|
|
|
|
self._Timer = false
|
|
self._WeekIndex = 0
|
|
self._TaskDataList = false
|
|
self._UiWeekTab = {}
|
|
self._UiDynamicTask = false
|
|
---@type XUiWeekChallengeCourse[]
|
|
self._UiRewardGrid = {}
|
|
self._IsInit = false
|
|
self._IsSelectDefaultWeek = false
|
|
|
|
self._TodayRefreshTime = -1
|
|
end
|
|
|
|
function XUiWeekChallenge:OnShow()
|
|
self:Refresh()
|
|
end
|
|
|
|
function XUiWeekChallenge:Init()
|
|
if self._IsInit then
|
|
return
|
|
end
|
|
self._IsInit = true
|
|
self:InitUi()
|
|
self:InitDynamicTableTask()
|
|
self:InitUiWeekTab()
|
|
self:InitRewardGrid()
|
|
self:AddListener()
|
|
self:StartTimer()
|
|
end
|
|
|
|
function XUiWeekChallenge:OnHide()
|
|
self:RemoveListener()
|
|
self:StopTimer()
|
|
end
|
|
|
|
function XUiWeekChallenge:AddListener()
|
|
XEventManager.AddEventListener(XEventId.EVENT_WEEK_CHALLENGE_UPDATE_REWARD, self.RefreshReward, self)
|
|
XEventManager.AddEventListener(XEventId.EVENT_TASK_SYNC, self.OnTaskUpdate, self)
|
|
end
|
|
|
|
function XUiWeekChallenge:RemoveListener()
|
|
XEventManager.RemoveEventListener(XEventId.EVENT_WEEK_CHALLENGE_UPDATE_REWARD, self.RefreshReward, self)
|
|
XEventManager.RemoveEventListener(XEventId.EVENT_TASK_SYNC, self.OnTaskUpdate, self)
|
|
end
|
|
|
|
function XUiWeekChallenge:OnTaskUpdate()
|
|
self:Refresh()
|
|
self:RefreshReward()
|
|
end
|
|
|
|
function XUiWeekChallenge:Refresh()
|
|
self:Init()
|
|
self:RefreshProgress()
|
|
self:RefreshWeek()
|
|
if not self._IsSelectDefaultWeek then
|
|
self._IsSelectDefaultWeek = true
|
|
self:SelectDefaultWeek()
|
|
end
|
|
self:RefreshWeek()
|
|
XEventManager.DispatchEvent(XEventId.EVENT_SING_IN_OPEN_BTN, true)
|
|
end
|
|
|
|
function XUiWeekChallenge:OnClickWeek(weekIndex)
|
|
if self:SelectWeek(weekIndex) then
|
|
XDataCenter.WeekChallengeManager.SetLastSelectedWeek(weekIndex)
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:SelectWeek(weekIndex, clickTab)
|
|
if self._WeekIndex == weekIndex then
|
|
return false
|
|
end
|
|
if XDataCenter.WeekChallengeManager.GetWeekState(weekIndex) == XWeekChallengeConfigs.WeekState.Lock then
|
|
if not clickTab then
|
|
XDataCenter.WeekChallengeManager.TipWeekLock(weekIndex)
|
|
end
|
|
return false
|
|
end
|
|
local oldWeekIndex = self._WeekIndex
|
|
self._WeekIndex = weekIndex
|
|
self:RefreshWeek()
|
|
if oldWeekIndex > 0 then
|
|
self.QieHuan.gameObject:PlayTimelineAnimation()
|
|
end
|
|
if clickTab then
|
|
self.TabGroup:SelectIndex(weekIndex)
|
|
end
|
|
return true
|
|
end
|
|
|
|
function XUiWeekChallenge:RefreshWeekTabBtn(weekIndex)
|
|
local state = XDataCenter.WeekChallengeManager.GetWeekState(weekIndex)
|
|
local button = self._UiWeekTab[weekIndex]
|
|
if not button then
|
|
return
|
|
end
|
|
if state == XWeekChallengeConfigs.WeekState.Lock then
|
|
button:SetButtonState(XUiButtonState.Disable)
|
|
elseif button.ButtonState == CS.UiButtonState.Disable then -- c#枚举不等于数值3
|
|
button:SetButtonState(XUiButtonState.Normal)
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:RefreshWeek()
|
|
local weekIndex = self._WeekIndex
|
|
local taskDataList = XDataCenter.WeekChallengeManager.GetTaskDataArraySorted(weekIndex)
|
|
self._TaskDataList = taskDataList
|
|
self._UiDynamicTask:SetDataSource(taskDataList)
|
|
self:UpdateTask()
|
|
end
|
|
|
|
function XUiWeekChallenge:UpdateTask()
|
|
self._UiDynamicTask:ReloadDataASync(1)
|
|
end
|
|
|
|
function XUiWeekChallenge:OnDynamicTableEvent(event, index, grid)
|
|
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
|
|
local data = self._TaskDataList[index]
|
|
grid.RootUi = self.RootUi
|
|
grid:ResetData(data)
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:InitUiWeekTab()
|
|
local weekAmount = XDataCenter.WeekChallengeManager.GetWeekAmount()
|
|
for i = 1, weekAmount do
|
|
self._UiWeekTab[i] = XUiHelper.TryGetComponent(self.Transform, "PanelRound1/TopBtnWeek/BtnWeek" .. i, "Button")
|
|
end
|
|
self.TabGroup:Init(
|
|
self._UiWeekTab,
|
|
function(tab)
|
|
self:OnClickWeek(tab)
|
|
end
|
|
)
|
|
self:RefreshAllWeekTabBtn()
|
|
end
|
|
|
|
function XUiWeekChallenge:RefreshAllWeekTabBtn()
|
|
for i = 1, #self._UiWeekTab do
|
|
self:RefreshWeekTabBtn(i)
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:SelectDefaultWeek()
|
|
-- 玩家选中的页签会被保存,本次登录后再次打开该界面会默认选中上次离开时的页签
|
|
local lastSelectedWeek = XDataCenter.WeekChallengeManager.GetLastSelectedWeek()
|
|
if lastSelectedWeek and self:SelectWeek(lastSelectedWeek, true) then
|
|
return
|
|
end
|
|
|
|
-- 默认选中当前周的页签,如果当前周任务未完成
|
|
local currentWeekIndex = XDataCenter.WeekChallengeManager.GetWeekIndex()
|
|
if
|
|
not XDataCenter.WeekChallengeManager.IsThisWeekAllTaskFinished(currentWeekIndex) and
|
|
self:SelectWeek(currentWeekIndex, true)
|
|
then
|
|
return
|
|
end
|
|
|
|
-- 如果已完成,则选中周数最靠前且存在未完成任务的页签。如果全部任务完成则仍选中当前周的页签
|
|
local weekOfTaskUnfinished = XDataCenter.WeekChallengeManager.GetWeekOfTaskUnfinished()
|
|
if weekOfTaskUnfinished and self:SelectWeek(weekOfTaskUnfinished, true) then
|
|
return
|
|
end
|
|
|
|
-- 都不符合,选当前周
|
|
self:SelectWeek(currentWeekIndex or 1, true)
|
|
end
|
|
|
|
function XUiWeekChallenge:InitDynamicTableTask()
|
|
local taskTransform = self.Transform:Find("PanelRound1/PanelTaskStoryList")
|
|
self._UiDynamicTask = XDynamicTableNormal.New(taskTransform)
|
|
self._UiDynamicTask:SetProxy(XDynamicGridTask)
|
|
self._UiDynamicTask:SetDelegate(self)
|
|
end
|
|
|
|
-- update number
|
|
function XUiWeekChallenge:RefreshProgress()
|
|
local value = XDataCenter.WeekChallengeManager.GetNumberOfCompletedTasks()
|
|
local maxValue = XDataCenter.WeekChallengeManager.GetNumberOfTasks()
|
|
self.ProgressTxt.text = string.format("%d/%d", value, maxValue)
|
|
self.ImgProgress.fillAmount = value / maxValue
|
|
end
|
|
|
|
function XUiWeekChallenge:InitRewardGrid()
|
|
local XUiWeekChallengeCourse = require("XUi/XUiWeekChallenge/XUiWeekChallengeCourse")
|
|
local obj =
|
|
self.Transform:Find("PanelRound1/PanelReward/SViewCourse/Viewport/Container/PanelCourseContainer/GridCourse")
|
|
local instance = XUiWeekChallengeCourse.New(obj)
|
|
self._UiRewardGrid[1] = instance
|
|
|
|
local arrayRewardId = XDataCenter.WeekChallengeManager.GetArrayReward()
|
|
for i = 2, #arrayRewardId do
|
|
local obj = CS.UnityEngine.Object.Instantiate(instance.Transform, instance.Transform.parent)
|
|
local grid = XUiWeekChallengeCourse.New(obj)
|
|
self._UiRewardGrid[i] = grid
|
|
end
|
|
|
|
local arrayTaskCount = XDataCenter.WeekChallengeManager.GetArrayTaskCount()
|
|
for i = 1, #self._UiRewardGrid do
|
|
local rewardId = arrayRewardId[i]
|
|
local grid = self._UiRewardGrid[i]
|
|
local taskCount = arrayTaskCount[i]
|
|
grid:SetReward(rewardId)
|
|
grid:SetTaskCount(taskCount)
|
|
XUiHelper.RegisterClickEvent(
|
|
self,
|
|
grid:GetButtonComponent(),
|
|
function()
|
|
if not XDataCenter.WeekChallengeManager.RequestReceiveReward(taskCount) then
|
|
grid:CallClickItem()
|
|
end
|
|
end
|
|
)
|
|
end
|
|
|
|
local obj = self._UiRewardGrid[1].Transform
|
|
local containerWidth = self.Container.rect.width
|
|
self.ProgressBg.sizeDelta = Vector2(containerWidth, self.ProgressBg.sizeDelta.y)
|
|
local maxValue = XDataCenter.WeekChallengeManager.GetNumberOfTasks()
|
|
local eachTaskWidth = containerWidth / maxValue
|
|
for i = 1, #self._UiRewardGrid do
|
|
local taskCount = arrayTaskCount[i]
|
|
local adjustPosition = CS.UnityEngine.Vector3(taskCount * eachTaskWidth, obj.anchoredPosition3D.y, 0)
|
|
self._UiRewardGrid[i].Transform.anchoredPosition3D = adjustPosition
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:RefreshReward()
|
|
for i = 1, #self._UiRewardGrid do
|
|
local grid = self._UiRewardGrid[i]
|
|
grid:UpdateState()
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:RefreshUpdateTime()
|
|
self._TodayRefreshTime = XTime.GetSeverNextRefreshTime()
|
|
end
|
|
|
|
function XUiWeekChallenge:StartTimer()
|
|
if self._Timer then
|
|
return
|
|
end
|
|
self:UpdateTime()
|
|
self:RefreshUpdateTime()
|
|
self._Timer =
|
|
XScheduleManager.ScheduleForever(
|
|
function()
|
|
self:UpdateTime()
|
|
self:CheckActivityEnd()
|
|
end,
|
|
XScheduleManager.SECOND
|
|
)
|
|
end
|
|
|
|
function XUiWeekChallenge:StopTimer()
|
|
if not self._Timer then
|
|
return
|
|
end
|
|
XScheduleManager.UnSchedule(self._Timer)
|
|
self._Timer = false
|
|
end
|
|
|
|
function XUiWeekChallenge:UpdateTime()
|
|
local remainSeconds = XDataCenter.WeekChallengeManager.GetActivityRemainSeconds()
|
|
self.ActivityTimeTxt.text = XUiHelper.GetTime(remainSeconds, XUiHelper.TimeFormatType.PASSPORT)
|
|
|
|
if self._TodayRefreshTime > 0 then
|
|
local currentTime = XTime.GetServerNowTimestamp()
|
|
if currentTime > self._TodayRefreshTime then
|
|
self:RefreshUpdateTime()
|
|
self:Refresh()
|
|
self:RefreshAllWeekTabBtn()
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:CheckActivityEnd()
|
|
if not XDataCenter.WeekChallengeManager.IsOpen() then
|
|
if XLuaUiManager.IsUiShow("UiSign") then
|
|
XLuaUiManager.Close("UiSign")
|
|
end
|
|
if XLuaUiManager.IsUiShow("UiSignBanner") then
|
|
XLuaUiManager.Close("UiSignBanner")
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiWeekChallenge:InitUi()
|
|
self.ActivityTimeTxt = XUiHelper.TryGetComponent(self.Transform, "PanelRound1/PanelTime/TextTime", "Text")
|
|
self.ProgressTxt = XUiHelper.TryGetComponent(self.Transform, "PanelRound1/PanelReward/TextNum", "Text")
|
|
self.ImgProgress =
|
|
XUiHelper.TryGetComponent(
|
|
self.Transform,
|
|
"PanelRound1/PanelReward/SViewCourse/Viewport/Container/ProgressBg/ImgProgress",
|
|
"Image"
|
|
)
|
|
self.ProgressBg =
|
|
XUiHelper.TryGetComponent(
|
|
self.Transform,
|
|
"PanelRound1/PanelReward/SViewCourse/Viewport/Container/ProgressBg",
|
|
"RectTransform"
|
|
)
|
|
self.Container = self.Transform:Find("PanelRound1/PanelReward/SViewCourse/Viewport/Container")
|
|
self.QieHuan = XUiHelper.TryGetComponent(self.Transform, "Animation/QieHuan", "PlayableDirector")
|
|
self.TabGroup = XUiHelper.TryGetComponent(self.Transform, "PanelRound1/TopBtnWeek", "XUiButtonGroup")
|
|
end
|
|
|
|
return XUiWeekChallenge
|