forked from endernon/PGRData
264 lines
8.1 KiB
Lua
264 lines
8.1 KiB
Lua
|
local XUiGridSkinVote = XClass(nil, "XUiGridSkinVote")
|
||
|
|
||
|
local ProgressAnimationDuration = 1
|
||
|
|
||
|
---@class XUiGridSkinVote 投票按钮类
|
||
|
function XUiGridSkinVote:Ctor(ui, onClick)
|
||
|
XTool.InitUiObjectByUi(self, ui)
|
||
|
self.OnClick = onClick
|
||
|
self.BtnClick.CallBack = function()
|
||
|
self:OnBtnClick()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--- 设置投票数据
|
||
|
---@param voteData XSkinVoteData
|
||
|
--------------------------
|
||
|
function XUiGridSkinVote:SetVoteData(voteData)
|
||
|
self.VoteData = voteData
|
||
|
end
|
||
|
|
||
|
--- 刷新界面
|
||
|
---@param idx number 下标
|
||
|
---@param voteNameId number 玩家投票Id
|
||
|
---@param isVoteExpired boolean 投票时间过期
|
||
|
--------------------------
|
||
|
function XUiGridSkinVote:Refresh(idx, voteNameId, isVoteExpired)
|
||
|
local isVoted = XTool.IsNumberValid(voteNameId)
|
||
|
self.ForbidVote = isVoted or isVoteExpired
|
||
|
self.PanelVote.gameObject:SetActiveEx(self.ForbidVote)
|
||
|
local isCurVote = isVoted and voteNameId == self.VoteData.Id
|
||
|
if self.ForbidVote then
|
||
|
self:PlayProgressAnimation()
|
||
|
self.PanelSelect.gameObject:SetActiveEx(false)
|
||
|
self.PanelNormal.gameObject:SetActiveEx(false)
|
||
|
end
|
||
|
self.BtnClick:ShowTag(isCurVote)
|
||
|
self.BtnClick:SetNameByGroup(0, self.VoteData.Name)
|
||
|
self.BtnClick:SetNameByGroup(1, string.format("%02d", idx))
|
||
|
end
|
||
|
|
||
|
function XUiGridSkinVote:PlayProgressAnimation()
|
||
|
local percent = self.VoteData.Percent
|
||
|
self.TxtProgress.text = "0%"
|
||
|
self.ImgProgress.fillAmount = 0
|
||
|
if percent <= 0 then
|
||
|
return
|
||
|
end
|
||
|
local fillAmount = XUiHelper.GetFillAmountValue(percent, 100)
|
||
|
self.Timer = XUiHelper.Tween(ProgressAnimationDuration, function(delta)
|
||
|
if XTool.UObjIsNil(self.GameObject) then
|
||
|
return
|
||
|
end
|
||
|
self.TxtProgress.text = math.floor(percent * delta) .. "%"
|
||
|
self.ImgProgress.fillAmount = fillAmount * delta;
|
||
|
end, function()
|
||
|
self.TxtProgress.text = percent .. "%"
|
||
|
self.ImgProgress.fillAmount = fillAmount;
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiGridSkinVote:StopProgressAnimationTimer()
|
||
|
if self.Timer then
|
||
|
XScheduleManager.UnSchedule(self.Timer)
|
||
|
self.Timer = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGridSkinVote:Select(select)
|
||
|
self.PanelSelect.gameObject:SetActiveEx(select)
|
||
|
self.PanelNormal.gameObject:SetActiveEx(not select)
|
||
|
self.IsSelect = select
|
||
|
end
|
||
|
|
||
|
function XUiGridSkinVote:OnBtnClick()
|
||
|
if self.ForbidVote or self.IsSelect then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
self:Select(true)
|
||
|
if self.OnClick then
|
||
|
self:OnClick(self)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGridSkinVote:PlayTimelineAnimation()
|
||
|
if self.Enable then
|
||
|
self.Enable:PlayTimelineAnimation()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
---@class XUiPanelSkinVote 投票主界面
|
||
|
---@field
|
||
|
local XUiPanelSkinVote = XClass(nil, "XUiPanelSkinVote")
|
||
|
|
||
|
--剩余时间标题
|
||
|
local LeftTimeName = {
|
||
|
VotingPeriod = XUiHelper.GetText("VotingPeriod"),
|
||
|
StatisticalPeriod = XUiHelper.GetText("StatisticalPeriod"),
|
||
|
}
|
||
|
|
||
|
function XUiPanelSkinVote:Ctor(ui, uiRoot)
|
||
|
XTool.InitUiObjectByUi(self, ui)
|
||
|
---@type XUiSkinVoteMain
|
||
|
self.UiRoot = uiRoot
|
||
|
---@type XSkinVote
|
||
|
self.ViewModel = XDataCenter.SkinVoteManager.GetViewModel()
|
||
|
self:InitUi()
|
||
|
self:InitCb()
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:InitUi()
|
||
|
---@type XUiGridSkinVote[]
|
||
|
self.GirdVote = {}
|
||
|
self.SwitchAnim = self.Transform:Find("Animation/QieHuan")
|
||
|
if not self.TxtDesc then
|
||
|
self.TxtDesc = self.Transform:Find("RImg03/PanelRight/Text"):GetComponent("Text")
|
||
|
end
|
||
|
self.ConfirmAnim = self.BtnConfirm.transform:Find("Animation/Enable")
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:InitCb()
|
||
|
self.BtnConfirm.CallBack = function()
|
||
|
self:OnBtnConfirmClick()
|
||
|
end
|
||
|
|
||
|
self.BtnName.CallBack = function()
|
||
|
self:OnBtnPreviewClick()
|
||
|
end
|
||
|
|
||
|
self.BtnRightArrow.CallBack = function()
|
||
|
self.SwitchAnim:PlayTimelineAnimation()
|
||
|
self.ViewModel:PlayPreviewNext()
|
||
|
end
|
||
|
|
||
|
self.BtnLeftArrow.CallBack = function()
|
||
|
self.SwitchAnim:PlayTimelineAnimation()
|
||
|
self.ViewModel:PlayPreviewLast()
|
||
|
end
|
||
|
|
||
|
self.BtnSigh.CallBack = function()
|
||
|
self.UiRoot:ShowDialog(XUiHelper.GetText("SkinNameVoteTip"), self.ViewModel:GetActivityDesc())
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:Show()
|
||
|
self.GameObject:SetActiveEx(true)
|
||
|
|
||
|
self:Refresh()
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:Hide()
|
||
|
self.GameObject:SetActiveEx(false)
|
||
|
self:OnStopGridTimer()
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:Refresh()
|
||
|
local viewModel = self.ViewModel
|
||
|
|
||
|
self.IsVoteExpired = viewModel:IsVoteExpired()
|
||
|
self.SmallPreviewList = viewModel:GetActivityPreviewImgSmall()
|
||
|
if self.TxtDesc then
|
||
|
self.TxtDesc.text = XUiHelper.ReplaceUnicodeSpace(XUiHelper.ReplaceTextNewLine(viewModel:GetActivityVoteTips()))
|
||
|
end
|
||
|
--投票选项
|
||
|
local nameIds = viewModel:GetProperty("_RandomNameIds")
|
||
|
for idx, nameId in ipairs(nameIds) do
|
||
|
local grid = self.GirdVote[idx]
|
||
|
if not grid then
|
||
|
local ui = idx == 1 and self.BtnSkinVote or XUiHelper.Instantiate(self.BtnSkinVote, self.PanelSlotContent)
|
||
|
grid = XUiGridSkinVote.New(ui, handler(self, self.OnGridVoteClick))
|
||
|
self.GirdVote[idx] = grid
|
||
|
end
|
||
|
grid:SetVoteData(viewModel:GetVoteNameData(nameId))
|
||
|
end
|
||
|
|
||
|
--是否投票
|
||
|
self.UiRoot:BindViewModelPropertyToObj(viewModel, function(voteNameId)
|
||
|
self:OnRefreshVoteView(voteNameId)
|
||
|
end, "_VoteNameId")
|
||
|
|
||
|
--预览图下标
|
||
|
self.UiRoot:BindViewModelPropertyToObj(viewModel, function(index)
|
||
|
self.RImg02:SetRawImage(self.SmallPreviewList[index])
|
||
|
self.BtnName:ShowReddot(XDataCenter.SkinVoteManager.CheckPreviewRedPoint())
|
||
|
end, "_PreviewIndex")
|
||
|
|
||
|
self:RefreshTime()
|
||
|
self:RefreshBtnState()
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:RefreshTime()
|
||
|
local isVoteExpired = self.ViewModel:IsVoteExpired()
|
||
|
self.TxtLeftTime.text = isVoteExpired and self.ViewModel:GetVoteExpiredTimeStr() or self.ViewModel:GetVoteTimeStr()
|
||
|
self.TxtLeftName.text = isVoteExpired and LeftTimeName.StatisticalPeriod or LeftTimeName.VotingPeriod
|
||
|
if self.IsVoteExpired ~= isVoteExpired then
|
||
|
self:OnRefreshVoteView()
|
||
|
self:RefreshBtnState()
|
||
|
end
|
||
|
self.IsVoteExpired = isVoteExpired
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:OnRefreshVoteView(voteNameId)
|
||
|
local viewModel = self.ViewModel
|
||
|
local isVoteExpired = viewModel:IsVoteExpired()
|
||
|
voteNameId = voteNameId or viewModel:GetProperty("_VoteNameId")
|
||
|
for idx, grid in ipairs(self.GirdVote) do
|
||
|
grid:Refresh(idx, voteNameId, isVoteExpired)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:OnStopGridTimer()
|
||
|
for _, grid in ipairs(self.GirdVote) do
|
||
|
grid:StopProgressAnimationTimer()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:RefreshBtnState()
|
||
|
local viewModel = self.ViewModel
|
||
|
local isVoteExpired = viewModel:IsVoteExpired()
|
||
|
local voteNameId = viewModel:GetProperty("_VoteNameId")
|
||
|
--未选
|
||
|
local disable = not XTool.IsNumberValid(self.SelectId)
|
||
|
self.BtnConfirm:SetDisable(disable)
|
||
|
-- 过期 || 已投
|
||
|
local forbidden = isVoteExpired or XTool.IsNumberValid(voteNameId)
|
||
|
self.BtnConfirm.gameObject:SetActiveEx(not forbidden)
|
||
|
-- 过期
|
||
|
self.BtnEnd.gameObject:SetActiveEx(isVoteExpired)
|
||
|
-- 已投
|
||
|
self.BtnVoted.gameObject:SetActiveEx(not isVoteExpired and XTool.IsNumberValid(voteNameId))
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:OnGridVoteClick(grid)
|
||
|
if self.LastGrid then
|
||
|
self.LastGrid:Select(false)
|
||
|
end
|
||
|
self.SelectId = grid.VoteData.Id
|
||
|
self.LastGrid = grid
|
||
|
self.ConfirmAnim:PlayTimelineAnimation()
|
||
|
self:RefreshBtnState()
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:OnBtnConfirmClick()
|
||
|
if not XTool.IsNumberValid(self.SelectId) then
|
||
|
XUiManager.TipText("SkinNameVoteNotSelectButConfirm")
|
||
|
return
|
||
|
end
|
||
|
local confirmCb = function()
|
||
|
XDataCenter.SkinVoteManager.RequestSkinVoteName(self.SelectId, function()
|
||
|
self:RefreshBtnState()
|
||
|
if self.LastGrid then
|
||
|
self.LastGrid:PlayTimelineAnimation()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
self.UiRoot:ShowDialog(XUiHelper.GetText("TipTitle"), XUiHelper.GetText("SkinNameVoteSecondaryConfirmation"), nil,
|
||
|
function() end, nil, confirmCb)
|
||
|
end
|
||
|
|
||
|
function XUiPanelSkinVote:OnBtnPreviewClick()
|
||
|
XLuaUiManager.Open("UiSkinVoteSee")
|
||
|
end
|
||
|
|
||
|
return XUiPanelSkinVote
|