XUiPanelPrivateChatView = XClass(nil, "XUiPanelPrivateChatView") local XUiTogFriendBox = require("XUi/XUiSocial/PrivateChatModel/ItemModel/XUiTogFriendBox") -- WorldChatBoxType = { -- OtherChatBox = 1, -- OtherChatBoxEmoji = 2, -- SelfChatBox = 3, -- SelfChatBoxEmoji = 4 -- } function XUiPanelPrivateChatView:Ctor(rootUi, ui, onBtnBackClick) self.RootUi = rootUi self.GameObject = ui.gameObject self.Transform = ui.transform self.OnBtnBackClick = onBtnBackClick XTool.InitUiObject(self) self:InitAutoScript() self.ChatButtonGroups = {} self.FriendId = 0 self:InitView() self:Hide() self.XUiPanelFriendEmoji = XUiPanelEmoji.New(self.RootUi, self.PanelEmoji, self) local clickCallBack = function(content) self.XUiPanelFriendEmoji:Hide() self:OnClickEmoji(content) end self.XUiPanelFriendEmoji:SetClickCallBack(clickCallBack) self.XUiPanelSocialPools = XUiPanelSocialPools.New(self.PanelSocialPools) self.PrivateDynamicList = XDynamicList.New(self.PanelChatView.transform, self) self.PrivateDynamicList:SetReverse(true) self.PanelMsgListPools = XUiPanelSocialPools.New(self.PanelMsgListPools) self.PanelMsgListPools:InitData(self.PrivateDynamicList) self.GroupDynamicListManager = XDynamicTableNormal.New(self.ContactGroupList) self.GroupDynamicListManager:SetProxy(XUiTogFriendBox) self.GroupDynamicListManager:SetDelegate(self) self.GroupDynamicListManager:SetDynamicEventDelegate(function(...) self:OnGroupDynamicTableEvent(...) end) end function XUiPanelPrivateChatView:InitView() --初始化View self.PanelEmoji.gameObject:SetActive(false) self.PanelInputField.characterLimit = CS.XGame.ClientConfig:GetInt("PrivateChatTextLimit") end -- auto -- Automatic generation of code, forbid to edit function XUiPanelPrivateChatView:InitAutoScript() self:AutoInitUi() self.SpecialSoundMap = {} self:AutoAddListener() end function XUiPanelPrivateChatView:AutoInitUi() -- self.PanelChatView = self.Transform:Find("Content/MsgList/Content/PanelChatView"):GetComponent("XVerticalDynamicList") -- self.PanelSocialPools = self.Transform:Find("Content/MsgList/Content/PanelChatView/PanelSocialPools") -- self.PanelInputField = self.Transform:Find("Content/MsgList/Share/PanelInputField"):GetComponent("InputField") -- self.ContactGroupList = self.Transform:Find("Content/ContactGroupList") -- self.PanelEmoji = self.Transform:Find("Content/MsgList/Share/PanelEmoji") -- self.PanelMsgListPools = self.Transform:Find("Content/MsgList/Content/PanelChatView/PanelSocialPools") -- self.BtnSendMsg = self.Transform:Find("Content/MsgList/Share/BtnSendMsg"):GetComponent("XUiButton") -- self.BtnEmoji = self.Transform:Find("Content/MsgList/Share/BtnEmoji"):GetComponent("XUiButton") -- self.BtnLuomu = self.Transform:Find("Content/MsgList/Share/BtnLuomu"):GetComponent("XUiButton") end function XUiPanelPrivateChatView:GetAutoKey(uiNode, eventName) if not uiNode then return end return eventName .. uiNode:GetHashCode() end function XUiPanelPrivateChatView: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("XUiPanelPrivateChatView: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 XUiPanelPrivateChatView:AutoAddListener() self.AutoCreateListeners = {} XUiHelper.RegisterClickEvent(self, self.BtnSendMsg, self.OnBtnSendMsgClick) self.BtnSendMsg.CallBack = function() self:OnBtnSendMsgClick() end self.BtnEmoji.CallBack = function() self:OnBtnEmojiPanelClick() end self.BtnLuomu.CallBack = function() self:OnBtnCoinPanelClick() end end -- auto function XUiPanelPrivateChatView:OnBtnSendMsgClick() --发送聊天消息 local text = self.PanelInputField.text if text == nil or text == "" then return end self.PanelInputField.text = "" -- 替换空白控制符 text = string.gsub(text, "%s", " ") local sendChat = {} sendChat.ChannelType = ChatChannelType.Private sendChat.MsgType = ChatMsgType.Normal sendChat.Content = text sendChat.TargetIds = { self.FriendId } XDataCenter.ChatManager.SendChat(sendChat, nil, true) end function XUiPanelPrivateChatView:OnBtnAddClick() if self.PanelEmoji.gameObject.activeInHierarchy then self.PanelEmoji.gameObject:SetActive(false) end end function XUiPanelPrivateChatView:OnBtnEmojiPanelClick() --打开表情面板 self.XUiPanelFriendEmoji:OpenOrClosePanel() end function XUiPanelPrivateChatView:OnBtnCoinPanelClick() --发送螺母 if XDataCenter.SocialManager.GetFriendInfo(self.FriendId) == nil then XUiManager.TipError(CS.XTextManager.GetText("ChatManagerNotSendCoinToNotFriend")) return end local sendChat = {} sendChat.ChannelType = ChatChannelType.Private sendChat.MsgType = ChatMsgType.Gift sendChat.Content = "" sendChat.TargetIds = { self.FriendId } XDataCenter.ChatManager.SendChat(sendChat) end function XUiPanelPrivateChatView:OnBtnPanelChooseBackClick() self.XUiPanelFriendEmoji:Hide() end function XUiPanelPrivateChatView:OnClickEmoji(content) --发送表情 local sendChat = {} sendChat.ChannelType = ChatChannelType.Private sendChat.MsgType = ChatMsgType.Emoji sendChat.Content = content sendChat.TargetIds = { self.FriendId } XDataCenter.ChatManager.SendChat(sendChat) end ----------------------------------------------------------------------------------- function XUiPanelPrivateChatView:OnEnable() if self.GameObject.activeSelf == false then return end self:InitData() end function XUiPanelPrivateChatView:Refresh(friendId) --friend为选中的玩家ID self.GameObject:SetActive(true) self.RootUi:PlayAnimation("PrivateChatViewEnable") self.FriendId = friendId self:InitData() XEventManager.AddEventListener(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, self.NewChatMsgHandler, self) XEventManager.AddEventListener(XEventId.EVENT_BLACK_DATA_CHANGE, self.OnBtnBackClick, self) end function XUiPanelPrivateChatView:InitData() XDataCenter.ChatManager.UpdateGiftStatus() self:UpdatePrivateDynamicList() self:UpdateGroupDynamicList() end function XUiPanelPrivateChatView:UpdatePrivateDynamicList() local msgData = XDataCenter.ChatManager.GetPrivateDynamicList(self.FriendId) --初始化私聊动态列表数据 self.PrivateDynamicList:SetData(msgData, function(data, cb) local poolName = nil local ctor = nil if (data.MsgType == ChatMsgType.Normal or data.MsgType == ChatMsgType.RoomMsg) and data.SenderId == XPlayer.Id then poolName = "myMsg" ctor = XUiPanelSocialMyMsgItem.New elseif (data.MsgType == ChatMsgType.Normal or data.MsgType == ChatMsgType.RoomMsg) and data.SenderId ~= XPlayer.Id then poolName = "otherMsg" ctor = XUiPanelSocialMyMsgItem.New elseif data.MsgType == ChatMsgType.Emoji and data.SenderId == XPlayer.Id then poolName = "myEmoji" ctor = XUiPanelSocialMyMsgEmojiItem.New elseif data.MsgType == ChatMsgType.Emoji and data.SenderId ~= XPlayer.Id then poolName = "otherEmoji" ctor = XUiPanelSocialMyMsgEmojiItem.New elseif data.MsgType == ChatMsgType.Gift and data.SenderId == XPlayer.Id then poolName = "myGift" ctor = XUiPanelSocialMyMsgGiftItem.New elseif data.MsgType == ChatMsgType.Gift and data.SenderId ~= XPlayer.Id then poolName = "otherGift" ctor = XUiPanelSocialMyMsgGiftItem.New elseif data.MsgType == ChatMsgType.Tips then poolName = "tips" ctor = XUiPanelSocialTipsItem.New end if cb and poolName and ctor then local item = cb(poolName, ctor) item.RootUi = self.RootUi item.Parent = self item:Refresh(data) else XLog.Error("------Init social privateChatData item is error!------") end end) XDataCenter.ChatManager.SetPrivateChatReadByFriendId(self.FriendId) end function XUiPanelPrivateChatView:UpdateGroupDynamicList() self.FriendGroupData = XDataCenter.ChatManager.GetPrivateChatGroupData(self.FriendId) self.GroupDynamicListManager:SetDataSource(self.FriendGroupData) self.GroupDynamicListManager:ReloadDataASync() end function XUiPanelPrivateChatView:OnDynamicTableEvent() end function XUiPanelPrivateChatView:OnGroupDynamicTableEvent(event, index, grid) local friend = self.FriendGroupData[index] if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then grid:Init(self.RootUi) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then grid:Refresh(friend, friend.FriendId == self.FriendId) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then local lastIndex, lastFriend = self:GetGroupDataByFriendId(self.FriendId) local lastGrid = self.GroupDynamicListManager:GetGridByIndex(lastIndex) if lastGrid then lastGrid:Refresh(lastFriend, false) end self.FriendId = friend.FriendId self:UpdatePrivateDynamicList() grid:Refresh(friend, true) end end function XUiPanelPrivateChatView:GetGroupDataByFriendId(friendId) for k, friend in pairs(self.FriendGroupData) do if friendId == friend.FriendId then return k, friend end end end function XUiPanelPrivateChatView:Hide() XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, self.NewChatMsgHandler, self) XEventManager.RemoveEventListener(XEventId.EVENT_BLACK_DATA_CHANGE, self.BlackDataChange, self) if not XTool.UObjIsNil(self.GameObject) and self.GameObject.activeSelf then self.GameObject:SetActive(false) end end --当有新的私聊进来的时候调用 function XUiPanelPrivateChatView:NewChatMsgHandler(chatData) if chatData == nil then return end if (chatData.ChannelType ~= ChatChannelType.Private and chatData.ChaneelType ~= ChatChannelType.PrivateInvite) then return end self:UpdateGroupDynamicList() if self.FriendId ~= chatData.TargetId and self.FriendId ~= chatData.SenderId then return end self:UpdatePrivateDynamicList() end function XUiPanelPrivateChatView:OnClose() self:StopPanelEmojiTimer() XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, self.NewChatMsgHandler, self) XEventManager.RemoveEventListener(XEventId.EVENT_BLACK_DATA_CHANGE, self.OnBtnBackClick, self) end function XUiPanelPrivateChatView:StopPanelEmojiTimer() if self.XUiPanelFriendEmoji then self.XUiPanelFriendEmoji:EmojiUnScheduleTime() end end function XUiPanelPrivateChatView:BlackDataChange() self:UpdateGroupDynamicList() self:UpdatePrivateDynamicList() end