SocialityMailView = SocialityMailView or BaseClass(BaseItem) function SocialityMailView:__init() self.base_file = "sociality" self.layout_file = "SocialityMailView" self.model = MailModel:getInstance() self.loop_mgr = LoopScrowViewMgr.New() self.column_num = 1 --一行多少个图标 self.show_count = 8 --存放 Item 的列表 self.mail_item_list = {} --存放 mailItem self.award_item_list = {} --存放 awardItem self.event_id_list = {} --存放事件ID self.need_refresh = false --是否需要重新调用 self.have_mail = true --是否拥有邮件 self:Load() end function SocialityMailView:Load_callback() self:LoadSuccess() self:InitEvent() if self.need_refresh then self:RefreshMailList() end -- MsgManager:getInstance():Remove(Config.ConfigMainIcon.TipType.mail) -- 2020/3/26 邮件红点只在接到邮件的时候才闪5s end function SocialityMailView:LoadSuccess() self.scroll, self.scroll_content, self.parent, self.mail_content_parent, self.mail_content_tra, self.mail_award_parent = GetChildTransforms(self.transform, { "ItemScrollView", "ItemScrollView/Viewport/Content", "ItemScrollView/Viewport/Content/parent", "Detail/DetailScrollView/Viewport/Content", "Detail/DetailScrollView/Viewport/Content/txtDetail", "Detail/Attachment/AwardScrollView/Viewport/Content", }) self.mail_delBtn = self:GetChild("mailBottom/delBtn").gameObject self.mail_takeBtn = self:GetChild("mailBottom/takeBtn").gameObject self.mail_empty = self:GetChild("Empty").gameObject self.mail_detail = self:GetChild("Detail").gameObject self.mail_bottom = self:GetChild("mailBottom").gameObject self.oneKeyGet = self:GetChild("oneKeyGet").gameObject self.oneKeyDelete = self:GetChild("oneKeyDelete").gameObject self.businessTab = self:GetChild("topBarCon/businessTab").gameObject self.systemTab = self:GetChild("topBarCon/systemTab").gameObject self.systemRed = self:GetChild("topBarCon/systemTab/systemRed").gameObject self.businessRed = self:GetChild("topBarCon/businessTab/businessRed").gameObject self.received_obj = self:GetChild("Detail/Attachment/received").gameObject self.mail_takeBtn_image, self.businessTabImg, self.systemTabImg, self.mailBg2, self.mailListBg, self.mail_head = GetChildImages(self.transform, { "mailBottom/takeBtn", "topBarCon/businessTab", "topBarCon/systemTab", "Detail/image", "mailListBg", "Detail/Sender/mail_head", }) self.DetailScrollView_tran = self:GetChild("Detail/DetailScrollView") self.mail_sender = self:GetChild("Detail/Sender/txtTitle"):GetComponent("TextMeshProUGUI") self.mail_title = self:GetChild("Detail/Title/txtTitle"):GetComponent("TextMeshProUGUI") self.mail_content = self:GetChild("Detail/DetailScrollView/Viewport/Content/txtDetail"):GetComponent("Text") self.systemTabTxt = self:GetChild("topBarCon/systemTab/Text"):GetComponent("TextMeshProUGUI") self.businessTabTxt = self:GetChild("topBarCon/businessTab/Text"):GetComponent("TextMeshProUGUI") self.mailTimeTxt = self:GetChild("Detail/Sender/mailTime"):GetComponent("TextMeshProUGUI") self.deadTime = self:GetChild("Detail/Sender/deadTime"):GetComponent("TextMeshProUGUI") self.takeBtn_txt = self:GetChild("mailBottom/takeBtn/Text"):GetComponent("TextMeshProUGUI") self.empty_girl = self:GetChild("Empty/empty/girl"):GetComponent("RawImage") self.empty_talk_bg = self:GetChild("Empty/empty/image"):GetComponent("RawImage") lua_resM:setOutsideImageSprite(self, self.mailListBg, GameResPath.GetSocialityImage("sociality_friend_list_bg")) lua_resM:setOutsideImageSprite(self, self.mailBg2, GameResPath.GetSocialityImage("sociality_chat_bg")) lua_resM:setOutsideRawImage(self, self.empty_girl, GameResPath.GetRoleBg("team_empty_bg_267_589")) lua_resM:setOutsideRawImage(self, self.empty_talk_bg, GameResPath.GetViewBigBg("com_empty_bg1")) self.mail_empty:SetActive(false) self.mail_detail:SetActive(false) -- SetAnchoredPosition(self.DetailScrollView_tran,15,-170) -- SetSizeDelta(self.DetailScrollView_tran, 667, 276) self.model.mail_tab_index = 1 local system_red,business_red = self:RefreshMailTabRed()--打开界面时处理一下topbar的红点 if system_red then self.model.mail_tab_index = 1 elseif not system_red and business_red then self.model.mail_tab_index = 2 else self.model.mail_tab_index = 1 end end function SocialityMailView:InitEvent() --注册点击事件 local function onBtnClickHandler(target) if target == self.mail_delBtn then if self.have_mail then self:DeleteMail() else Message.show("没有邮件") end elseif target == self.mail_takeBtn then if self.have_mail then self:TakeAttachment() else Message.show("没有邮件") end elseif target == self.oneKeyGet then self:GetAllMail() elseif target == self.oneKeyDelete then self:DeleteAllMail() elseif target == self.systemTab then if self.model.mail_tab_index == 1 then return end self.model.mail_tab_index = 1 self.model.now_select_mail = nil self:RefreshMailList() elseif target == self.businessTab then if self.model.mail_tab_index == 2 then return end self.model.mail_tab_index = 2 self.model.now_select_mail = nil self:RefreshMailList() end end AddClickEvent(self.mail_delBtn, onBtnClickHandler) AddClickEvent(self.mail_takeBtn, onBtnClickHandler) AddClickEvent(self.oneKeyGet, onBtnClickHandler) AddClickEvent(self.oneKeyDelete, onBtnClickHandler) AddClickEvent(self.systemTab, onBtnClickHandler) AddClickEvent(self.businessTab, onBtnClickHandler) --绑定更新邮件列表的方法 local update_mail_list_fun = function() self:ShowPanel() end table.insert(self.event_id_list, self.model:Bind(MailEvent.UPDATE_MAIL_LIST, update_mail_list_fun)) --绑定更新邮件内容的方法 local update_mail_detail_fun = function(vo) self:ShowMailDetail(vo) end table.insert(self.event_id_list, self.model:Bind(MailEvent.UPDATE_MAIL_DETAIL, update_mail_detail_fun)) function select_fun() self:SetBtnGray() end table.insert(self.event_id_list, self.model:Bind(MailEvent.SELECT_MAIL_ITEM, select_fun)) --刷新topbar的红点 function on_update_top_bar_red() self:RefreshMailTabRed() end table.insert(self.event_id_list, self.model:Bind(MailEvent.UPDATE_TOP_BAR_RED, on_update_top_bar_red)) end --刷新topbar“系统”“交易”按钮的红点 function SocialityMailView:RefreshMailTabRed() local system_red = self.model:CheckSystemMailRedDot() local business_red = self.model:CheckBusinessMailRedDot() self.systemRed:SetActive(system_red) self.businessRed:SetActive(business_red) --哪里有红点,界面就打开哪个界面,同时有红点时,系统邮件优先 return system_red,business_red end function SocialityMailView:SetBtnGray() for i, v in pairs(self.model.select_mail_list) do if v.is_attach == 1 and v.state ~= 3 then self.mail_takeBtn_image.gray = false SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) self.mail_takeBtn:SetActive(false) return elseif v.is_attach ~= 1 then self.mail_takeBtn:SetActive(true) end end if self.model.now_select_mail then for i, v in ipairs(self.curr_list) do if v.mail_id == self.model.now_select_mail.mail_id then if v.is_attach == 1 and v.state ~= 3 then self.mail_takeBtn_image.gray = false SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) return end end end end self.mail_takeBtn_image.gray = true SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) end --打开界面 function SocialityMailView:ShowPanel() if self.is_loaded then self.need_refresh = false self:RefreshMailList() --更新邮件列表 else self.need_refresh = true end end --清除界面 function SocialityMailView:__delete() self.model:Clear() self.model:Fire(MailEvent.GET_MAIL_INFORM) --获取邮件通知 if self.loop_mgr then self.loop_mgr:DeleteMe() self.loop_mgr = nil end for i, v in pairs(self.mail_item_list) do v:DeleteMe() end self.mail_item_list = {} for i, v in pairs(self.award_item_list) do v:DeleteMe() -- v:ReleaseObj() v = nil end self.award_item_list = {} for i, v in pairs(self.event_id_list) do self.model:UnBind(v) end self.event_id_list = {} end function SocialityMailView:SetTabBtnImg() local businessTabAb = self.model.mail_tab_index == 1 and "uiComponent_asset" or "sociality_asset" local businessTabStr = self.model.mail_tab_index == 1 and "com_empty" or "sociality_tab_on" local systemTabAb = self.model.mail_tab_index == 1 and "sociality_asset" or "uiComponent_asset" local systemTabStr = self.model.mail_tab_index == 1 and "sociality_tab_on" or "com_empty" lua_resM:setImageSprite(self,self.businessTabImg, businessTabAb, businessTabStr) lua_resM:setImageSprite(self,self.systemTabImg, systemTabAb, systemTabStr) self.systemTabTxt.text = self.model.mail_tab_index == 1 and "<#ffffff>系统" or "<#9eb3cf>系统" self.businessTabTxt.text = self.model.mail_tab_index == 1 and "<#9eb3cf>交易" or "<#ffffff>交易" local systemTabMat = self.model.mail_tab_index == 1 and ShaderTools.TMPSharedMaterialType.HKYTW7OutlineBlueTab or ShaderTools.TMPSharedMaterialType.HKYTW7FFDefault local businessTabMat = self.model.mail_tab_index == 1 and ShaderTools.TMPSharedMaterialType.HKYTW7FFDefault or ShaderTools.TMPSharedMaterialType.HKYTW7OutlineBlueTab SetTMPSharedMaterial(self.systemTabTxt, systemTabMat) SetTMPSharedMaterial(self.businessTabTxt, businessTabMat) end --更新邮件列表 function SocialityMailView:RefreshMailList() self:SetTabBtnImg() --隐藏所有Item for i, v in ipairs(self.mail_item_list) do v:Hide() v.gameObject:SetActive(false) end local mail_list local total_mail_list_num = 0 local sys_mail_list = self.model:GetMailList() local business_mail_list = self.model:GetBusinessMailList() total_mail_list_num = #sys_mail_list + #business_mail_list if self.model.mail_tab_index == 1 then mail_list = sys_mail_list else mail_list = business_mail_list end if total_mail_list_num > 98 then Message.show("当前邮件列表已达上限,清理邮箱后才可继续收取邮件") end if #mail_list < 1 then self.have_mail = false self.mail_empty:SetActive(true) self.oneKeyDelete:SetActive(false) self.oneKeyGet:SetActive(false) self.mail_detail:SetActive(false) self.mail_bottom:SetActive(false) self.curr_list = {} --以下为一键删除多于7个以上的邮件时 重新刷新邮件的列表 不然loop_mgr还会刷新出可见的item for k, v in ipairs(mail_list) do self.curr_list[k] = v self.curr_list[k].index = k end self.loop_mgr:Init(self.scroll, self.scroll_content, self.column_num, 360, 106, function(item,index,realIndex) if item and realIndex > 0 and realIndex <= #self.curr_list then item:SetData(self.curr_list[realIndex]) end end) self.loop_mgr:InitChildren(self.mail_item_list, #self.curr_list) self.loop_mgr:RestToBeginning() self.loop_mgr:SetContentSizeData() return end self.have_mail = true self.mail_empty:SetActive(false) self.oneKeyDelete:SetActive(true) self.oneKeyGet:SetActive(true) self.mail_detail:SetActive(true) self.mail_bottom:SetActive(true) self.curr_list = {} for k, v in ipairs(mail_list) do self.curr_list[k] = v self.curr_list[k].index = k end local create_count = math.min(self.show_count, #mail_list) for k = 1, create_count do local item = self.mail_item_list[k] if item == nil then item = MailItem.New(self.parent, nil, self.layer_name) self.mail_item_list[k] = item end end self.loop_mgr:Init(self.scroll,self.scroll_content, self.column_num, 360, 106+3, function(item,index,realIndex) self:OnInitializeItem(item,index,realIndex) end) self.loop_mgr:InitChildren(self.mail_item_list, #self.curr_list) self.loop_mgr:RestToBeginning() self.loop_mgr:SetContentSizeData() --设置选中邮件 local id if self.model.now_select_mail == nil then id = self.mail_item_list[1].data.mail_id --点选item列表中的第一个 else id = self.model.now_select_mail.mail_id end for i, v in ipairs(self.mail_item_list) do v:OnClickHandler(id) end self:RefreshMailTabRed()--处理一次红点 GlobalEventSystem:Fire(EventName.REFRESH_SOCIAL_RED_DOT) end function SocialityMailView:OnInitializeItem(item,index,realIndex) if item and realIndex > 0 and realIndex <= #self.curr_list then item:SetData(self.curr_list[realIndex]) -- item:SetChoice() self:UpdateItemState(item) end end function SocialityMailView:UpdateItemState(item) for k,v in pairs(self.mail_item_list) do if v.data and self.model.now_select_mail and v.data.mail_id == self.model.now_select_mail.mail_id then v:SetSelect(true) else v:SetSelect(false) end end end --显示邮件内容 function SocialityMailView:ShowMailDetail(vo) if vo == nil then return end if self.model.now_select_mail and self.model.now_select_mail.mail_id ~= vo.mail_id then return end --邮件类型图标 local mail_type = self.model:GetMailType(vo.mail_id) if mail_type == 5 then lua_resM:setImageSprite(self,self.mail_head,"sociality_asset","sociality_mail_head_2") else lua_resM:setImageSprite(self,self.mail_head,"sociality_asset","sociality_mail_head_1") end local sender_str if vo.sender and vo.sender ~= "" then sender_str = vo.sender else sender_str = mail_type == 5 and "交易系统管理员" or "系统管理员" end self.mail_sender.text = sender_str self.mail_title.text = vo.title self.mailTimeTxt.text = TimeUtil:timeConversion(vo.time, "yyyy-mm-dd hh:mm:ss") local effect_et = self.model:GetMailEffectTime(vo.mail_id) local now_time = TimeUtil:getServerTime() if effect_et and effect_et - now_time > 0 then local dead_time, f = math.modf((effect_et - now_time) / 86400) if dead_time>=1 then if f > 0 then dead_time = dead_time + 1 end self.deadTime.text = string.format("有效期剩余:<#60f448>%d天",dead_time) else local hour_time, f2 = math.modf((effect_et - now_time) / 3600) if hour_time>=1 then if f2>0 then hour_time = hour_time + 1 end self.deadTime.text = string.format("有效期剩余:<#60f448>%d小时",hour_time) else local minute_time, f3 = math.modf((effect_et - now_time) / 60) if f3>0 then minute_time = minute_time +1 end self.deadTime.text = string.format("有效期剩余:<#60f448>%d分",minute_time) end end else self.deadTime.text = "已过期" end --超链接处理 self.mail_content.text = "" if vo.content and vo.content ~= ""then local call_func = function ( param_list ) ChatModel:getInstance().clicked_item = self ChatModel:getInstance().chick_hyperlink_mark = true ChatModel:getInstance():FireSpecialTab(param_list) end AddInlineLickEvent(self.mail_content, call_func) --把坑爹的半角空格变成全角空格,inlietext组件用半角空格时会像英文一样在空格后面的文字太长时转成换行 vo.content = string.gsub(vo.content, " ", " ") --把换行换成换行加两个全角空格,使其变成首行自动缩进两字符 -- vo.content = string.gsub(vo.content, "\n ", "\n  ") vo.content = string.gsub(vo.content, "\n", "\n  ") --如果根本就没用到这种格式就不要再去特殊解析了 if not string.find(vo.content,"color@") then SetInlineText(self.mail_content, vo.content) else SetInlineText(self.mail_content, ChuanWenManager:FormatColorTag(vo.content)) end local height = self.mail_content.preferredHeight self.mail_content_parent.sizeDelta = Vector2(self.mail_content_parent.sizeDelta.x, height + 10) self.mail_content_tra.sizeDelta = Vector2(self.mail_content_parent.sizeDelta.x, height + 10) end if vo.is_receive == 1 then --附件已领取 self.mail_takeBtn_image.gray = true SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) -- self.received_obj:SetActive(true) else self.mail_takeBtn_image.gray = false SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) -- self.received_obj:SetActive(false) end for i, v in pairs(self.award_item_list) do v:SetVisible(false) end if vo.attachment and #vo.attachment > 0 then local new_attachment = {} local other_attachment = {} for k,v in pairs(vo.attachment) do local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.type_id) if basic and basic.color then v.color = tonumber(basic.color) table.insert(new_attachment, v) else table.insert(other_attachment, v) end end local sort_func = function(a,b) return a.color > b.color end table.sort(new_attachment, sort_func) for k,v in pairs(other_attachment) do table.insert(new_attachment, v) end vo.attachment = new_attachment for i, v in ipairs(vo.attachment) do local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(v.object_type, v.type_id) local item = self.award_item_list[i] if item == nil then item = MailAwardItem.New(self.mail_award_parent) self.award_item_list[i] = item end item:SetData(vo.is_receive,typeId, v.num, nil, v, v.lock, nil, false) item:SetVisible(true) item:SetItemSize(80, 80) end self.mail_award_parent.sizeDelta = Vector2(100 * #vo.attachment, 100) else self.mail_takeBtn_image.gray = true SetTMPSharedMaterial(self.takeBtn_txt, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) end if #self.model.select_mail_list > 0 then self:SetBtnGray() end end --设置附件是否只显示背景 function SocialityMailView:OnlyShowBg(item, b) if b then item.bg_trams.gameObject:SetActive(true) item.icon.gameObject:SetActive(false) item.numTextT.gameObject:SetActive(false) item.lock:SetActive(false) lua_resM:setImageSprite(item,item.bg,"common_asset","com_icon_bg_0") else item.bg_trams.gameObject:SetActive(true) item.icon.gameObject:SetActive(true) item.numTextT.gameObject:SetActive(true) end end --接受附件 function SocialityMailView:TakeAttachment() local list = {} if #self.model.select_mail_list > 0 then --有勾选邮件 --对邮件进行排序(按接受时间排序,最新收到的邮件最高) local sort_fun = function(a, b) if a and b then return a.time > b.time end end table.sort(self.model.select_mail_list, sort_fun) for i, v in ipairs(self.model.select_mail_list) do if v.is_attach == 1 then table.insert(list, v.mail_id) end end end if self.model.now_select_mail and self.model.now_select_mail.is_attach == 1 then local have = false for i, v in ipairs(list) do if v == self.model.now_select_mail.mail_id then have = true break end end if not have then table.insert(list, self.model.now_select_mail.mail_id) end end local mail_type = self.model:GetMailType(list[1]) if mail_type then self.model:Fire(MailEvent.GET_MAIL_ATTACHMENT, list,mail_type) end end --删除单个邮件 function SocialityMailView:DeleteMail() local list = {} if #self.model.select_mail_list > 0 then --有勾选邮件 for i, v in ipairs(self.model.select_mail_list) do table.insert(list, v.mail_id) end else --无勾选邮件 if not self.model.now_select_mail or not self.model.now_select_mail.mail_id then return end table.insert(list, self.model.now_select_mail.mail_id) end local mail_type = self.model:GetMailType(list[1]) if mail_type then self.model:Fire(MailEvent.DELETE_MAIL, list, mail_type) end end --一键删除 function SocialityMailView:DeleteAllMail( ... ) local list = {} if self.model.mail_tab_index == 2 then for i, v in ipairs(self.model.business_mail_list ) do if v.is_attach~=1 then if v.important == 1 then if v.state ~=2 then table.insert(list, v.mail_id) end else table.insert(list, v.mail_id) end end end else for i, v in ipairs(self.model.mail_list ) do if v.is_attach~=1 then if v.important == 1 then if v.state ~=2 then table.insert(list, v.mail_id) end else table.insert(list, v.mail_id) end end end end if #list>0 then local mail_type = self.model:GetMailType(list[1]) if mail_type then self.model:Fire(MailEvent.DELETE_MAIL, list, mail_type) end end end --一键领取 function SocialityMailView:GetAllMail( ... ) local list = {} if self.model.mail_tab_index == 2 then for i, v in ipairs(self.model.business_mail_list ) do if v.is_attach ==1 then if v.important == 1 then--如果是重要邮件,一定要先读了才能一键领取 if v.state == 1 then table.insert(list, v.mail_id) end else table.insert(list, v.mail_id) end end end else for i, v in ipairs(self.model.mail_list ) do if v.is_attach ==1 then if v.important == 1 then--如果是重要邮件,一定要先读了才能一键领取 if v.state == 1 then table.insert(list, v.mail_id) end else table.insert(list, v.mail_id) end end end end if #list>0 then local mail_type = self.model:GetMailType(list[1]) if mail_type then self.model:Fire(MailEvent.GET_MAIL_ATTACHMENT, list,mail_type) end else Message.show("没有可领取的附件哦~") end end