PGRData/Script/matrix/xui/xuiplayerinfo/XUiPanelCharacterList.lua

172 lines
6.5 KiB
Lua
Raw Normal View History

XUiPanelCharacterList = XClass(nil, "XUiPanelCharacterList")
local TextManager = CS.XTextManager
local tableInsert = table.insert
local tableSort = table.sort
local Sort = function(a, b)
if a.IsLocked ~= b.IsLocked then
return not a.IsLocked
end
if a.Data.Quality ~= b.Data.Quality then
return a.Data.Quality > b.Data.Quality
end
if a.Data.Level ~= b.Data.Level then
return a.Data.Level > b.Data.Level
end
return a.Data.Id > b.Data.Id
end
function XUiPanelCharacterList:Ctor(ui, rootUi)
self.RootUi = rootUi
self.Transform = ui.transform
self.GameObject = ui.gameObject
XTool.InitUiObject(self)
self.AllCharList = {} --全部成员
self.CharacterList = {} --展示的成员
self:InitDynamicTable()
end
function XUiPanelCharacterList:InitDynamicTable()
self.DynamicTable = XDynamicTableNormal.New(self.PanelCharacterList)
self.DynamicTable:SetProxy(XUiPlayerInfoCharacterGrid)
self.DynamicTable:SetDelegate(self)
self.PlayerInfoCharacterGrid.gameObject:SetActiveEx(false)
end
function XUiPanelCharacterList:Show()
self.GameObject:SetActiveEx(true)
self.PanelScore.gameObject:SetActiveEx(true)
self.AppearanceShowType = self.RootUi.Data.AppearanceShowType or XPlayerInfoConfigs.CharactersAppearanceType.All
if self.RootUi.IsOpenFromSetting then
--从设置面板进入,使用预览数据
for _,v in pairs(self.RootUi.Data.CharacterShow) do
local temData = { Data = v, IsLocked = false }
tableInsert(self.CharacterList, temData)
end
self:Refresh(true)
else
self:Refresh()
if self:HasPermission() then
XDataCenter.PlayerInfoManager.RequestPlayerCharacterListData(self.RootUi.Data.Id, function(data)
for _,v in pairs(data) do
local temData = { Data = v, IsLocked = false }
tableInsert(self.CharacterList, temData)
end
self:Refresh(true)
end)
end
end
end
function XUiPanelCharacterList:Refresh(hasPermission)
local hasCharacterDisplay = self:HasCharacterDisplay()
self:SetupDynamicTable(hasPermission,hasCharacterDisplay)
end
function XUiPanelCharacterList:SetupDynamicTable(hasPermission, hasCharacterDisplay, index)
self.DynamicTable:SetDataSource(self:HandleData(hasPermission,hasCharacterDisplay))
self.DynamicTable:ReloadDataSync(index and index or 1)
end
--==============================--
--desc: 是否拥有权限查看信息
--@return: 有true无false
--==============================--
function XUiPanelCharacterList:HasPermission()
self.AppearanceSettingInfo = self.RootUi.Data.AppearanceSettingInfo and
self.RootUi.Data.AppearanceSettingInfo.CharacterType or XUiAppearanceShowType.ToSelf
local isFriend = XDataCenter.SocialManager.CheckIsFriend(self.RootUi.Data.Id)
local hasPermission = (self.AppearanceSettingInfo == XUiAppearanceShowType.ToAll)
or (self.AppearanceSettingInfo == XUiAppearanceShowType.ToFriend and isFriend)
return hasPermission
end
--==============================--
--desc: 自选成员展示时是否有设置成员
--==============================--
function XUiPanelCharacterList:HasCharacterDisplay()
--展示类型为自选成员没有设置成员时返回false
local hasCharacterDisplay = not (self.AppearanceShowType == XPlayerInfoConfigs.CharactersAppearanceType.Select and #self.CharacterList < 1)
return hasCharacterDisplay
end
--==============================--
--desc: 处理动态列表的数据源
--@return: 有序的成员表,全部展示包括未拥有成员
--==============================--
function XUiPanelCharacterList:HandleData(hasPermission, hasCharacterDisplay)
local isLoadData = hasPermission and hasCharacterDisplay
if not isLoadData then
self.PanelScore.gameObject:SetActiveEx(false)
self.PanelCharacterNone.gameObject:SetActiveEx(true)
if not hasPermission then
self.EmptyText.text = TextManager.GetText("PlayerInfoWithoutPermission")
else
self.EmptyText.text = TextManager.GetText("PlayerInfoCharacterEmpty")
end
return {}
end
self.PanelCharacterNone.gameObject:SetActiveEx(false)
if self.AppearanceShowType == XPlayerInfoConfigs.CharactersAppearanceType.All then
-- 全成员展示,数据源包括未解锁成员
local score = 0
local allCharList = {} --最终数据,拥有成员排在前面
local characterListById = {} --拥有成员字典,Id做索引用来查询未解锁成员
for _, v in ipairs(self.CharacterList) do
characterListById[v.Data.Id] = v
local characterShowScoreList = XPlayerInfoConfigs.GetCharacterShowScore(v.Data.Id)
local addScore = characterShowScoreList[v.Data.Quality] and characterShowScoreList[v.Data.Quality] or 0
score = score + addScore
end
self.PanelScore.gameObject:SetActiveEx(true)
self.TxtScore.text = score
for k, v in pairs(XCharacterConfigs.GetCharacterTemplates()) do
local temData = { IsLocked = true }
if characterListById[k] then
tableInsert(allCharList, characterListById[k])
else
temData.Data = v
tableInsert(allCharList, temData)
end
end
tableSort(allCharList, function(item1, item2) return Sort(item1, item2) end)
self.AllCharList = allCharList
return allCharList
else
-- 自选成员展示,数据源不包括未解锁成员
self.PanelScore.gameObject:SetActiveEx(false)
return self.CharacterList
end
end
function XUiPanelCharacterList:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:Init(self.RootUi.Data.Id)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
if self.AppearanceShowType == XPlayerInfoConfigs.CharactersAppearanceType.All then
grid:UpdateGrid(self.AllCharList[index], self.AppearanceShowType, self.RootUi.Data.AssistCharacterDetail)
else
grid:UpdateGrid(self.CharacterList[index], self.AppearanceShowType, self.RootUi.Data.AssistCharacterDetail)
end
end
end
function XUiPanelCharacterList:Close()
self.AllCharList = {}
self.CharacterList = {}
self.AppearanceShowType = nil
self.GameObject:SetActiveEx(false)
end