403 lines
13 KiB
Lua
403 lines
13 KiB
Lua
|
local next = next
|
||
|
local tableInsert = table.insert
|
||
|
local TagTextPrefix = "NoticeTag"
|
||
|
local XHtmlHandler = require("XUi/XUiGameNotice/XHtmlHandler")
|
||
|
local mathFloor = math.floor
|
||
|
local mathCeil = math.ceil
|
||
|
local strFind = string.find
|
||
|
|
||
|
local HtmlParagraphs = {}
|
||
|
local BTN_INDEX = {
|
||
|
First = 1,
|
||
|
Second = 2,
|
||
|
}
|
||
|
|
||
|
local XUiGameNotice = XLuaUiManager.Register(XLuaUi, "UiGameNotice")
|
||
|
function XUiGameNotice:OnStart(rootUi, selectIdx, selectId, type)
|
||
|
self.RootUi = rootUi
|
||
|
self.HttpTextures = {}
|
||
|
self.HtmlIndexDic = {}
|
||
|
self.TabBtns = {}
|
||
|
self.Type = type
|
||
|
self.SelectIndex = selectIdx
|
||
|
self.SelectId = selectId
|
||
|
self:InitAutoScript()
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnDisable()
|
||
|
self.CurUrl = nil
|
||
|
if self.WebViewPanel then
|
||
|
CS.UnityEngine.Object.DestroyImmediate(self.WebViewPanel.gameObject)
|
||
|
self.WebViewPanel = nil
|
||
|
end
|
||
|
|
||
|
self:ClearTabBtns()
|
||
|
self:ClearAllChildren()
|
||
|
|
||
|
LuaGC()
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:InitAutoScript()
|
||
|
self.SpecialSoundMap = {}
|
||
|
self.AutoCreateListeners = {}
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:GetAutoKey(uiNode, eventName)
|
||
|
if not uiNode then
|
||
|
return
|
||
|
end
|
||
|
return eventName .. uiNode:GetHashCode()
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice: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("XUiPanelWorldChatMyMsgItem: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 XUiGameNotice:OnEnable()
|
||
|
self:UpdateLeftTabBtns(self.SelectIndex, self.SelectId, self.Type)
|
||
|
self:OnSelectedTog()
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnDestroy()
|
||
|
for index, httpTexture in pairs(self.HttpTextures) do
|
||
|
if httpTexture:Exist() then
|
||
|
CS.UnityEngine.Object.Destroy(httpTexture)
|
||
|
self.HttpTextures[index] = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnGetEvents()
|
||
|
return { XEventId.EVENT_UIDIALOG_VIEW_ENABLE, XEventId.EVENT_NOTICE_TYPE_CHANAGE, XEventId.EVENT_NOTICE_CONTENT_RESP }
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnNotify(evt, ...)
|
||
|
if evt == XEventId.EVENT_UIDIALOG_VIEW_ENABLE then
|
||
|
self.RootUi:Close()
|
||
|
elseif evt == XEventId.EVENT_NOTICE_TYPE_CHANAGE then
|
||
|
local arg = {...}
|
||
|
self:UpdateLeftTabBtns(nil,nil, arg[1])
|
||
|
self:OnSelectedTog()
|
||
|
elseif evt == XEventId.EVENT_NOTICE_CONTENT_RESP then
|
||
|
local args = {...}
|
||
|
self:OnNoticeContentResp(args[1])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:GetCertainBtnModel(index, hasChild, pos, totalNum)
|
||
|
if index == BTN_INDEX.First then
|
||
|
if hasChild then
|
||
|
return self.BtnFirstHasSnd
|
||
|
else
|
||
|
return self.BtnFirst
|
||
|
end
|
||
|
elseif index == BTN_INDEX.Second then
|
||
|
if totalNum == 1 then
|
||
|
return self.BtnSecondAll
|
||
|
end
|
||
|
|
||
|
if pos == 1 then
|
||
|
return self.BtnSecondTop
|
||
|
elseif pos == totalNum then
|
||
|
return self.BtnSecondBottom
|
||
|
else
|
||
|
return self.BtnSecond
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:ClearTabBtns()
|
||
|
if not self.TabBtns then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
for _, v in pairs(self.TabBtns) do
|
||
|
CS.UnityEngine.GameObject.Destroy(v.gameObject)
|
||
|
end
|
||
|
|
||
|
self.TabBtns = {}
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:UpdateLeftTabBtns(selectIdx, selectId, type)
|
||
|
self.NoticeMap = XDataCenter.NoticeManager.GetInGameNoticeMap(type)
|
||
|
local noticeInfos = self.NoticeMap
|
||
|
if not noticeInfos then return end
|
||
|
|
||
|
self.HtmlIndexDic = {}
|
||
|
|
||
|
self:ClearTabBtns()
|
||
|
local btnIndex = 0
|
||
|
local firstRedPointIndex
|
||
|
|
||
|
--一级标题
|
||
|
for groupIndex, data in ipairs(noticeInfos) do
|
||
|
local htmlList = data.Content
|
||
|
local totalNum = #htmlList
|
||
|
|
||
|
local btnModel = self:GetCertainBtnModel(BTN_INDEX.First, totalNum > 1)
|
||
|
local btn = CS.UnityEngine.Object.Instantiate(btnModel)
|
||
|
btn.transform:SetParent(self.PanelNoticeTitleBtnGroup.transform, false)
|
||
|
btn.gameObject:SetActiveEx(true)
|
||
|
btn:SetName(data.Title)
|
||
|
|
||
|
if not data.Tag or data.Tag == 0 then
|
||
|
btn:ShowTag(false)
|
||
|
else
|
||
|
local txtTag = btn.transform:Find("Tag/ImgTag/Text"):GetComponent("Text")
|
||
|
txtTag.text = CS.XTextManager.GetText(TagTextPrefix .. data.Tag)
|
||
|
btn:ShowTag(true)
|
||
|
end
|
||
|
|
||
|
local uiButton = btn:GetComponent("XUiButton")
|
||
|
tableInsert(self.TabBtns, uiButton)
|
||
|
btnIndex = btnIndex + 1
|
||
|
|
||
|
--二级标题
|
||
|
local needRedPoint = false
|
||
|
local firstIndex = btnIndex
|
||
|
local onlyOne = totalNum == 1
|
||
|
for htmlIndex, htmlCfg in ipairs(htmlList) do
|
||
|
needRedPoint = XDataCenter.NoticeManager.CheckInGameNoticeRedPointIndividual(data, htmlIndex)
|
||
|
if needRedPoint and not firstRedPointIndex then
|
||
|
firstRedPointIndex = btnIndex
|
||
|
end
|
||
|
if not onlyOne then
|
||
|
local tmpBtnModel = self:GetCertainBtnModel(BTN_INDEX.Second, nil, htmlIndex, totalNum)
|
||
|
local tmpBtn = CS.UnityEngine.Object.Instantiate(tmpBtnModel)
|
||
|
tmpBtn:SetName(htmlCfg.Title)
|
||
|
tmpBtn.transform:SetParent(self.PanelNoticeTitleBtnGroup.transform, false)
|
||
|
|
||
|
local tmpUiButton = tmpBtn:GetComponent("XUiButton")
|
||
|
tmpUiButton.SubGroupIndex = firstIndex
|
||
|
tableInsert(self.TabBtns, tmpUiButton)
|
||
|
btnIndex = btnIndex + 1
|
||
|
|
||
|
if needRedPoint then
|
||
|
tmpUiButton:ShowReddot(true)
|
||
|
else
|
||
|
tmpUiButton:ShowReddot(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local indexInfo = {
|
||
|
HtmlReadKey = XDataCenter.NoticeManager.GetGameNoticeReadDataKey(data, htmlIndex),
|
||
|
HtmlUrl = htmlCfg.Url,
|
||
|
HtmlUrlSlave = htmlCfg.UrlSlave,
|
||
|
GroupIndex = groupIndex
|
||
|
}
|
||
|
self.HtmlIndexDic[btnIndex] = indexInfo
|
||
|
if selectId and selectId == tonumber(htmlCfg.Order) then
|
||
|
selectIdx = btnIndex
|
||
|
end
|
||
|
end
|
||
|
|
||
|
uiButton:ShowReddot(needRedPoint)
|
||
|
end
|
||
|
|
||
|
local selectIndex = selectIdx or firstRedPointIndex or 1
|
||
|
self.PanelNoticeTitleBtnGroup:Init(self.TabBtns, function(index) self:OnSelectedTog(index) end)
|
||
|
self.PanelNoticeTitleBtnGroup:SelectIndex(selectIndex, false)
|
||
|
self.SelectIndex = selectIndex
|
||
|
self.SelectId = nil
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnSelectedTog(index)
|
||
|
if self.SelectIndex and self.SelectIndex == index then return end
|
||
|
index = index or self.SelectIndex
|
||
|
self.SelectIndex = index
|
||
|
|
||
|
local indexInfo = self.HtmlIndexDic[index]
|
||
|
if not indexInfo or not next(indexInfo) then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
--刷新右边UI
|
||
|
self:UpdateWebView(indexInfo.HtmlUrl)
|
||
|
|
||
|
--取消小红点
|
||
|
XDataCenter.NoticeManager.ChangeInGameNoticeReadStatus(indexInfo.HtmlReadKey, true)
|
||
|
local uiButton = self.TabBtns[index]
|
||
|
uiButton:ShowReddot(false)
|
||
|
|
||
|
--判断一级按钮小红点
|
||
|
local subGroupIndex = uiButton.SubGroupIndex
|
||
|
if subGroupIndex and self.TabBtns[subGroupIndex] then
|
||
|
local needRed = false
|
||
|
for _, btn in pairs(self.TabBtns) do
|
||
|
if btn.SubGroupIndex and btn.SubGroupIndex == subGroupIndex
|
||
|
and btn.ReddotObj.activeSelf then
|
||
|
needRed = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
if not needRed then
|
||
|
self.TabBtns[subGroupIndex]:ShowReddot(false)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:CreateImgObj(texture)
|
||
|
local parent = self.Img.transform.parent.transform
|
||
|
local newImgObj = CS.UnityEngine.Object.Instantiate(self.Img, parent)
|
||
|
newImgObj.gameObject:SetActiveEx(true)
|
||
|
newImgObj.texture = texture
|
||
|
|
||
|
local width = parent.rect.width
|
||
|
local height = mathFloor(width * texture.height / texture.width)
|
||
|
newImgObj.rectTransform.sizeDelta = CS.UnityEngine.Vector2(width, height)
|
||
|
|
||
|
return newImgObj
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:CreateTextObj(params, textData, sourceTextData, fontSize)
|
||
|
local parent = self.Txt.transform.parent.transform
|
||
|
local newTextObj = CS.UnityEngine.Object.Instantiate(self.Txt, parent):GetComponent("XUiHrefText")
|
||
|
newTextObj.gameObject:SetActiveEx(true)
|
||
|
newTextObj.fontSize = fontSize or XHtmlHandler.FontSizeMap["xx-large"]
|
||
|
newTextObj.lineSpacing = 1.5
|
||
|
|
||
|
local width = parent.rect.width
|
||
|
local tg = newTextObj.cachedTextGeneratorForLayout
|
||
|
local set = newTextObj:GetGenerationSettings(CS.UnityEngine.Vector2(width, 0))
|
||
|
local height = mathCeil(tg:GetPreferredHeight(CS.XTool.ReplaceNoBreakingSpace(sourceTextData), set) / newTextObj.pixelsPerUnit) + newTextObj.fontSize * (newTextObj.lineSpacing - 1)
|
||
|
|
||
|
newTextObj.rectTransform.sizeDelta = CS.UnityEngine.Vector2(width, height)
|
||
|
newTextObj.text = textData
|
||
|
|
||
|
local align
|
||
|
local _, _, styleParam = strFind(params, "style=\"(.-)\"")
|
||
|
if styleParam then
|
||
|
_, _, align = strFind(styleParam, "text%-align:(.-);")
|
||
|
if align then
|
||
|
align = XHtmlHandler.RemoveBlank(align)
|
||
|
newTextObj.alignment = XHtmlHandler.AlignMap[align]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not align then
|
||
|
_, _, align = strFind(params, "align=\"(.-)\"")
|
||
|
if align then
|
||
|
align = XHtmlHandler.RemoveBlank(align)
|
||
|
newTextObj.alignment = XHtmlHandler.AlignMap[align]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return newTextObj
|
||
|
end
|
||
|
|
||
|
|
||
|
function XUiGameNotice:ShowHtml(paragraphs)
|
||
|
self:ClearAllChildren()
|
||
|
|
||
|
for _, v in ipairs(paragraphs) do
|
||
|
if v.Type == XHtmlHandler.ParagraphType.Text then
|
||
|
v.Obj = self:CreateTextObj(v.Param, v.Data, v.SourceData, v.FontSize)
|
||
|
self:RegisterListener(v.Obj, "onHrefClick", self.OnBtnHrefClick)
|
||
|
else
|
||
|
v.Obj = self:CreateImgObj(v.Data)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.CurParagraphs = paragraphs
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnBtnHrefClick(str)
|
||
|
if string.find(str, "whiteday") ~= nil or string.find(str, "thelastspark") ~= nil then -- 情人节网页活动和黄金周的
|
||
|
local uid = XLoginManager.GetUserId()
|
||
|
local serverId = CS.XHeroBdcAgent.ServerId
|
||
|
if uid and uid ~= "" then
|
||
|
CS.UnityEngine.Application.OpenURL(str.."?uid="..uid.."&hostid=".. serverId) -- todo 服务器id
|
||
|
return
|
||
|
end
|
||
|
elseif string.find(str, "natsumatsuri") ~= nil then -- 夏日祭活动
|
||
|
local uid = XLoginManager.GetUserId()
|
||
|
if uid and uid ~= "" then
|
||
|
CS.UnityEngine.Application.OpenURL(str.."?code_id="..uid)
|
||
|
return
|
||
|
end
|
||
|
elseif string.find(str, "seeed") ~= nil or string.find(str, "rooot") ~= nil then -- rooot活动的
|
||
|
XDataCenter.ActivityManager.OpenRoootUrl(str)
|
||
|
else
|
||
|
if string.find(str, "eden") ~= nil then -- 萌战网页活动接入需求
|
||
|
local uid = XUserManager.UserId
|
||
|
local serverId = CS.XHeroBdcAgent.ServerId
|
||
|
if uid and serverId then
|
||
|
CS.UnityEngine.Application.OpenURL(str.."?uid="..uid.."&serverId="..serverId)
|
||
|
end
|
||
|
else
|
||
|
CS.UnityEngine.Application.OpenURL(str)
|
||
|
end
|
||
|
end
|
||
|
CS.UnityEngine.Application.OpenURL(str)
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:UpdateWebView(url)
|
||
|
if self.CurUrl == url then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
self.CurUrl = url
|
||
|
|
||
|
if HtmlParagraphs[url] then
|
||
|
self:ShowHtml(HtmlParagraphs[url])
|
||
|
return
|
||
|
end
|
||
|
|
||
|
self.ImgLoading.gameObject:SetActiveEx(true)
|
||
|
|
||
|
local request = CS.XUriPrefixRequest.Get(url)
|
||
|
CS.XTool.WaitCoroutine(request:SendWebRequest(), function()
|
||
|
if request.isNetworkError or request.isHttpError then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local content = request.downloadHandler.text
|
||
|
if string.IsNilOrEmpty(content) then
|
||
|
return
|
||
|
end
|
||
|
request:Dispose()
|
||
|
|
||
|
HtmlParagraphs[url] = XHtmlHandler.Deserilize(content)
|
||
|
if not HtmlParagraphs[url] then
|
||
|
XLog.Error("content deserilized is nil, url:" .. tostring(url))
|
||
|
return
|
||
|
end
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NOTICE_CONTENT_RESP, HtmlParagraphs[url])
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:OnNoticeContentResp(content)
|
||
|
self:ShowHtml(content)
|
||
|
self.ImgLoading.gameObject:SetActiveEx(false)
|
||
|
end
|
||
|
|
||
|
function XUiGameNotice:ClearAllChildren()
|
||
|
if self.CurParagraphs then
|
||
|
for _, v in ipairs(self.CurParagraphs) do
|
||
|
CS.UnityEngine.Object.DestroyImmediate(v.Obj.gameObject)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.CurParagraphs = {}
|
||
|
end
|