local RedDotManager = {}
local RedDotNode = require("GameCore.RedDot.RedDotNode")
local stringSplit = string.split
local RapidJson = require("rapidjson")
local mapKeyList = {}
local rootNode, trUIRoot
local DEBUG_OPEN = false
function RedDotManager.Init()
trUIRoot = GameObject.Find("---- UI ----").transform
EventManager.Add("LuaEventName_UnRegisterRedDot", RedDotManager, RedDotManager.OnEvent_UnRegisterRedDot)
end
function RedDotManager.RegisterNode(sKey, param, objGo, nType, bManualRefresh, bRebind)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if objGo ~= nil then
local tbParam = {}
if param == nil then
tbParam.sParam = "empty"
elseif type(param) ~= "table" then
tbParam.sParam = param
else
tbParam = param
end
local bindCS = function(obj)
NovaAPI.UnRegisterRedDotNode(obj.gameObject)
local trParent = obj.transform.parent
obj.transform:SetParent(trUIRoot)
obj.gameObject:SetActive(true)
local paramJson = RapidJson.encode(tbParam)
NovaAPI.AddRedDotNode(obj.gameObject, sKey, paramJson)
obj.gameObject:SetActive(false)
obj.transform:SetParent(trParent)
end
if type(objGo) == "table" then
for _, v in ipairs(objGo) do
bindCS(v.gameObject)
end
else
bindCS(objGo.gameObject)
end
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if bRebind then
node:UnRegisterNode()
end
node:RegisterNode(objGo, nType, bManualRefresh)
end
end
function RedDotManager.UnRegisterNode(sKey, param, objGo)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:UnRegisterNode(objGo)
end
end
end
function RedDotManager.OnEvent_UnRegisterRedDot(_, sKey, paramJson, objGo)
local tbParam = decodeJson(paramJson)
local param
if tbParam.sParam == nil then
param = tbParam
elseif tbParam.sParam == "empty" then
param = nil
else
param = tbParam.sParam
end
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:UnRegisterNode(objGo)
end
end
end
function RedDotManager.SetValid(sKey, param, bValid)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if not node:CheckLeafNode() then
return
end
node:SetValid(bValid)
end
end
function RedDotManager.SetCount(sKey, param, nCount)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if not node:CheckLeafNode() then
return
end
node:SetCount(nCount)
end
end
function RedDotManager.GetValid(sKey, param)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
return node:GetValid()
end
return false
end
function RedDotManager.RefreshRedDotShow(sKey, param)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:RefreshRedDotShow()
end
end
end
function RedDotManager.GetNodeKey(sKey, param)
local sNodeKey = ""
local bCheck = true
if nil == sKey then
bCheck = false
traceback(string.format("红点注册传入参数错误,请检查!!!, key = %s, param = %s", sKey, param))
else
if nil == param then
sNodeKey = sKey
elseif type(param) ~= "table" then
sNodeKey = string.gsub(sKey, "", param, 1)
else
sNodeKey = sKey
for _, v in ipairs(param) do
sNodeKey = string.gsub(sNodeKey, "", v, 1)
end
end
sNodeKey = string.gsub(sNodeKey, "", "")
local tbSplit = stringSplit(sNodeKey, ".") or {}
sNodeKey = ""
local index = 1
for _, v in ipairs(tbSplit) do
if nil ~= v and "" ~= v then
if index == 1 then
sNodeKey = v
else
sNodeKey = sNodeKey .. "." .. v
end
index = index + 1
end
end
end
return bCheck, sNodeKey
end
function RedDotManager.GetNode(sNodeKey)
if nil == rootNode then
rootNode = RedDotNode.new(RedDotDefine.Root)
end
local curNode = rootNode
local tbKeyList = RedDotManager.ParseKey(sNodeKey)
for _, key in ipairs(tbKeyList) do
local node = curNode:GetChildNode(key)
if nil == node then
node = curNode:AddChildNode(key)
end
curNode = node
end
return curNode
end
function RedDotManager.CheckNodeExist(sNodeKey)
return nil ~= RedDotManager.GetKeyList(sNodeKey)
end
function RedDotManager.GetKeyList(sNodeKey)
return mapKeyList[sNodeKey]
end
function RedDotManager.ParseKey(sNodeKey)
local tbKeyList = RedDotManager.GetKeyList(sNodeKey)
if nil == tbKeyList then
tbKeyList = stringSplit(sNodeKey, ".") or {}
end
mapKeyList[sNodeKey] = tbKeyList
return tbKeyList
end
function RedDotManager.OpenGMDebug(bOpen)
DEBUG_OPEN = bOpen
end
function RedDotManager.PrintRedDot(sKey, param, bLeaf)
if not DEBUG_OPEN then
return
end
local tbNode = {}
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:PrintRedDot(bLeaf, tbNode)
end
if tbNode ~= nil and #tbNode ~= 0 then
for k, v in ipairs(tbNode) do
local tbKey = {}
table.insert(tbKey, v.sNodeKey)
if bLeaf then
v:GetParentKey(tbKey)
end
local sCurKey = ""
for i = #tbKey, 1, -1 do
if i == #tbKey then
sCurKey = tbKey[i]
else
sCurKey = sCurKey .. "->" .. tbKey[i]
end
end
local bindObjCount = v:GetBindObjCount()
printError(string.format("[RedDot] key = %s, redDotCount = %s, bindObjCount = %s", sCurKey, v.nRedDotCount, bindObjCount))
end
end
end
return RedDotManager