PGRData/Script/matrix/xui/xuisocial/contactmodel/XUiPanelContactView.lua
2024-09-01 22:49:41 +02:00

332 lines
No EOL
11 KiB
Lua

XUiPanelContactView = XClass(nil, "XUiPanelContactView")
local XUiGridContactItem = require("XUi/XUiSocial/ContactModel/XUiGridContactItem")
function XUiPanelContactView:Ctor(ui, mainPanel)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.MainPanel = mainPanel
XTool.InitUiObject(self)
self:InitAutoScript()
self.FriendList = {}
self.IsDeleteFriendState = false
self.BtnGroupThrowCb = function() XUiManager.TipText("FriendThrowSuccess") end
self.FriendDatas = {}
self.RemoveIds = {}
self.DynamicListManager = XDynamicTableNormal.New(self.GameObject)
self.DynamicListManager:SetProxy(XUiGridContactItem)
self.DynamicListManager:SetDelegate(self)
-- 收到私聊就更新好友排序
XEventManager.AddEventListener(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, self.RefreshDynamicList, self)
XEventManager.AddEventListener(XEventId.EVENT_BLACK_DATA_CHANGE, self.RefreshDynamicList, self)
end
function XUiPanelContactView:ResetStatus()
self.IsDeleteFriendState = false
self.PanelShare.gameObject:SetActiveEx(true)
self.PanelFriendList.gameObject:SetActiveEx(true)
self.PanelDeleteFriend.gameObject:SetActiveEx(false)
end
-- auto
-- Automatic generation of code, forbid to edit
function XUiPanelContactView:InitAutoScript()
self:AutoInitUi()
self.SpecialSoundMap = {}
self:AutoAddListener()
end
function XUiPanelContactView:AutoInitUi()
-- self.GridContact = self.Transform:Find("Viewport/ContactList/GridContact")
-- self.PanelDeleteFriend = self.Transform:Find("PanelDeleteFriend")
-- self.BtnRemove = self.Transform:Find("PanelDeleteFriend/BtnRemove"):GetComponent("Button")
-- self.BtnClose = self.Transform:Find("PanelDeleteFriend/BtnClose"):GetComponent("XUiButton")
-- self.PanelShare = self.Transform:Find("Share")
-- self.PanelFriendList = self.Transform:Find("PanelFriendList")
-- self.TxtFriendCount = self.Transform:Find("Share/TxtFriendCount"):GetComponent("Text")
-- self.Tips = self.Transform:Find("Tips")
-- self.BtnAdd = self.Transform:Find("Tips/BtnAdd"):GetComponent("Button")
-- self.BtnDelete = self.Transform:Find("Share/BtnDelete"):GetComponent("XUiButton")
-- self.BtnAllCharge = self.Transform:Find("PanelFriendList/BtnAllCharge"):GetComponent("XUiButton")
-- self.BtnGroupThrow = self.Transform:Find("PanelFriendList/BtnGroupThrow"):GetComponent("XUiButton")
self.BtnGroupThrow.gameObject:SetActiveEx(false)
end
function XUiPanelContactView:GetAutoKey(uiNode, eventName)
if not uiNode then
return
end
return eventName .. uiNode:GetHashCode()
end
function XUiPanelContactView:RegisterListener(uiNode, eventName, func)
local key = self:GetAutoKey(uiNode, eventName)
if not key then
return
end
local listener = self.AutoCreateListeners[key]
if listener ~= nil then
uiNode[eventName]:RemoveListener(listener)
end
if func ~= nil then
if type(func) ~= "function" then
XLog.Error("XUiPanelContactView:RegisterListener函数错误, 参数func需要是function类型, func的类型是" .. type(func))
end
listener = function(...)
XSoundManager.PlayBtnMusic(self.SpecialSoundMap[key], eventName)
func(self, ...)
end
uiNode[eventName]:AddListener(listener)
self.AutoCreateListeners[key] = listener
end
end
function XUiPanelContactView:AutoAddListener()
self.AutoCreateListeners = {}
XUiHelper.RegisterClickEvent(self, self.BtnAdd, self.OnBtnAddClick)
self.BtnDelete.CallBack = function() self:OnBtnDeleteClick() end
self.BtnClose.CallBack = function() self:OnBtnCloseClick() end
self.BtnAllCharge.CallBack = function() self:OnBtnAllChargeClick() end
--self.BtnGroupThrow.CallBack = function() self:OnBtnGroupThrowClick() end
self.BtnRemove.CallBack = function() self:OnBtnRemoveClick() end
end
-- auto
function XUiPanelContactView:OnBtnAddClick()
--跳转去添加好友
self.MainPanel:SetSelectedIndex(self.MainPanel.BtnTabIndex.MainAddContact)
end
function XUiPanelContactView:SetSelectDeleteId(id, isDelete)
self.RemoveIds[id] = isDelete
end
function XUiPanelContactView:OnBtnRemoveClick()
--确认删除好友
if not self.IsDeleteFriendState then
return
end
local removeIds = {}
for k, v in pairs(self.RemoveIds) do
if v then
table.insert(removeIds, k)
end
end
if #removeIds <= 0 then
XUiManager.TipText("FriendSelectRemoveTip")
self.RemoveIds = {}
return
end
--确认删除好友的回调
local removeTip = CS.XTextManager.GetText("FriendRemoveTip")
XUiManager.DialogTip("", removeTip, XUiManager.DialogType.Normal, nil, function()
local callBack = function()
self:UpdateDeleteState(false)
self:RefreshFriendCount()
self:RefreshDynamicList()
end
XDataCenter.SocialManager.DeleteFriends(removeIds, callBack)
self.RemoveIds = {}
end)
end
function XUiPanelContactView:OnBtnAllChargeClick()
--群收礼物
local callback = function(giftInfoList, rewardGoodsList)
for i, info in ipairs(giftInfoList) do
local giftCount
if rewardGoodsList and rewardGoodsList[i] then
giftCount = rewardGoodsList[i].Count
end
XDataCenter.ChatManager.UpdateGiftData(info.FriendId, info.GiftId, ChatGiftState.Received, giftCount)
end
if not rewardGoodsList or #rewardGoodsList < 0 then
return
end
XUiManager.OpenUiObtain(rewardGoodsList, nil, function()
self:Refresh()
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self.Tips)
end, nil)
end
XDataCenter.ChatManager.GetAllGiftsRequest(callback)
end
function XUiPanelContactView:OnBtnGroupThrowClick()
-- 判断是否有好友
local targetIds = XDataCenter.SocialManager.GetFriendIds()
if targetIds == nil or #targetIds <= 0 then
return
end
--群发礼物
local sendChat = {}
sendChat.ChannelType = ChatChannelType.Private
sendChat.MsgType = ChatMsgType.Gift
sendChat.Content = ""
sendChat.TargetIds = targetIds
XDataCenter.ChatManager.SendChat(sendChat, self.BtnGroupThrowCb)
end
function XUiPanelContactView:OnBtnDeleteClick()
self:UpdateDeleteState(not self.IsDeleteFriendState)
end
function XUiPanelContactView:OnBtnCloseClick()
self:UpdateDeleteState(false)
end
function XUiPanelContactView:UpdateDeleteState(State)
self.RemoveIds = {}
--点击删除好友(状态改变)
self.IsDeleteFriendState = State
if #self.FriendDatas == 0 then
return
end
self.PanelDeleteFriend.gameObject:SetActiveEx(State)
self.PanelFriendList.gameObject:SetActiveEx(not State)
for i, v in ipairs(self.FriendDatas) do
local grid = self.DynamicListManager:GetGridByIndex(i)
if grid ~= nil then
grid:ShowDeleteState(State, self.RemoveIds[v.FriendId])
end
end
if State then
self.MainPanel:PlayAnimation("DeleteFriendEnable")
end
end
function XUiPanelContactView:Show()
if not self.GameObject:Exist() then
return
end
if self.GameObject.activeSelf == false then
self.GameObject:SetActiveEx(true)
end
self.MainPanel:PlayAnimation("ContactViewQieHuan")
self:Refresh()
XDataCenter.SocialManager.GetFriendsInfo(function() self:Refresh() end)
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self.Tips)
end
function XUiPanelContactView:RefreshGiftCount()
self.BtnAllCharge:SetName(CS.XTextManager.GetText("SocialGiftTips", XPlayer.DailyReceiveGiftCount, XDataCenter.SocialManager.GetGiftMaxCount()))
end
function XUiPanelContactView:Hide()
if not self.GameObject:Exist() then
return
end
if self.GameObject.activeSelf then
self.GameObject:SetActiveEx(false)
end
end
function XUiPanelContactView:Refresh()
XDataCenter.ChatManager.UpdateGiftStatus()
self:RefreshFriendCount()
self:RefreshGiftCount()
self:ResetStatus()
self:RefreshDynamicList()
end
function XUiPanelContactView:RefreshDynamicList()
local friendDatas = XDataCenter.SocialManager.GetFriendList()
if #friendDatas > 0 then
self.Tips.gameObject:SetActiveEx(false)
else
self.Tips.gameObject:SetActiveEx(true)
end
self.FriendDatas = self:SortFriendList(friendDatas)
self.DynamicListManager:SetDataSource(self.FriendDatas)
self.DynamicListManager:ReloadDataASync()
end
function XUiPanelContactView:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:Init(self.MainPanel, self)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local friend = self.FriendDatas[index]
if friend then
grid:Refresh(friend, self.IsDeleteFriendState, self.RemoveIds[friend.FriendId])
end
end
end
function XUiPanelContactView:IsDeletingIds(friendId)
return self.RemoveIds[friendId]
end
function XUiPanelContactView:SortFriendList(friendDatas)
--对好友进行排序
if friendDatas == nil or #friendDatas <= 1 then
return friendDatas
end
local function FriendSort(item1, item2)
-- 是否有未读消息
local item1UnreadChat = XDataCenter.ChatManager.GetPrivateUnreadChatCountByFriendId(item1.FriendId) > 0
local item2UnreadChat = XDataCenter.ChatManager.GetPrivateUnreadChatCountByFriendId(item2.FriendId) > 0
if item1UnreadChat == item2UnreadChat then
if item1.IsOnline == item2.IsOnline then
if item1.IsOnline then
-- 双方都在线
if item1.FriendExp == item2.FriendExp then
return item1.Level > item2.Level
end
return item1.FriendExp > item2.FriendExp
else
-- 双方都不在线
if item1.LastLoginTime == item2.LastLoginTime then
if item1.FriendExp == item2.FriendExp then
return item1.Level > item2.Level
end
return item1.FriendExp > item2.FriendExp
end
return item1.LastLoginTime > item2.LastLoginTime
end
end
return item1.IsOnline
end
return item1UnreadChat
end
table.sort(friendDatas, FriendSort)
return friendDatas
end
function XUiPanelContactView:RefreshFriendCount()
local friendCountText = CS.XTextManager.GetText("FriendCount")
local maxCount = XPlayerManager.GetMaxFriendCount(XPlayer.GetLevelOrHonorLevel(), XPlayer.IsHonorLevelOpen())
self.TxtFriendCount.text = string.format('%s %d / %d', friendCountText, XDataCenter.SocialManager.GetFriendCount(), maxCount)
end
--当离开面板的时候调用
function XUiPanelContactView:OnClose()
XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, self.RefreshDynamicList, self)
XEventManager.RemoveEventListener(XEventId.EVENT_BLACK_DATA_CHANGE, self.RefreshDynamicList, self)
end