2023-07-14 19:35:33 +00:00
|
|
|
|
--红点管理器
|
|
|
|
|
XRedPointManager = XRedPointManager or {}
|
|
|
|
|
require("XRedPoint/XRedPointConditions")
|
|
|
|
|
|
|
|
|
|
local RedPointEventDic = {}
|
|
|
|
|
local RedPointFiitterEvents = {}
|
|
|
|
|
local eventIdPool = 0
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
---@type XObjectPool
|
|
|
|
|
local RedPointEventPool
|
|
|
|
|
|
|
|
|
|
--region ------------------local function start-------------------
|
|
|
|
|
|
|
|
|
|
--- 移除事件节点
|
|
|
|
|
---@param eventId number 事件Id
|
|
|
|
|
---@param needRelease boolean 是否需要释放
|
|
|
|
|
--------------------------
|
|
|
|
|
local function RemoveRedPointEventInternal(eventId, needRelease)
|
|
|
|
|
if RedPointEventDic == nil or not RedPointEventDic[eventId] then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local pointEvent = RedPointEventDic[eventId]
|
|
|
|
|
RedPointEventDic[eventId] = nil
|
|
|
|
|
|
|
|
|
|
if needRelease and pointEvent then
|
|
|
|
|
--release 会再次释放,置空需要放到之前
|
|
|
|
|
pointEvent:Release()
|
|
|
|
|
end
|
|
|
|
|
if pointEvent then
|
|
|
|
|
RedPointEventPool:Recycle(pointEvent)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 自增事件Id
|
|
|
|
|
---@return number
|
|
|
|
|
--------------------------
|
|
|
|
|
local function GenerateEventId()
|
|
|
|
|
eventIdPool = eventIdPool + 1
|
|
|
|
|
return eventIdPool
|
|
|
|
|
end
|
|
|
|
|
--endregion------------------local function finish------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
function XRedPointManager.Init()
|
|
|
|
|
RedPointEventDic = RedPointEventDic or {}
|
|
|
|
|
RedPointFiitterEvents = RedPointFiitterEvents or {}
|
2024-09-01 20:49:41 +00:00
|
|
|
|
RedPointEventPool = RedPointEventPool or XObjectPool.New(XRedPointEvent.New)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--添加过滤
|
|
|
|
|
function XRedPointManager.AddRedPointFitterEvent(conditionId)
|
|
|
|
|
if not XRedPointManager[conditionId] then
|
|
|
|
|
XLog.Warning("Event type not found :" .. conditionId)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
RedPointFiitterEvents = RedPointFiitterEvents or {}
|
|
|
|
|
RedPointFiitterEvents[conditionId] = conditionId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--移除过滤
|
|
|
|
|
function XRedPointManager.RemoveRedPointFitterEvent(conditionId)
|
|
|
|
|
if not RedPointFiitterEvents or not RedPointFiitterEvents[conditionId] then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
RedPointFiitterEvents[conditionId] = nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--增加一个红点事件
|
|
|
|
|
function XRedPointManager.AddRedPointEvent(node, func, listener, conditionGroup, args, isCheck)
|
|
|
|
|
|
|
|
|
|
if not node then
|
|
|
|
|
XLog.Warning("该绑定节点为空,需要检查UI预设")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local eventId = GenerateEventId()
|
|
|
|
|
RedPointEventDic[eventId] = RedPointEventPool:Create(eventId, node, conditionGroup, listener, func, args)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if isCheck == nil or isCheck == true then
|
|
|
|
|
XRedPointManager.Check(eventId)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return eventId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--删除一个红点事件
|
|
|
|
|
function XRedPointManager.RemoveRedPointEvent(eventId)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
RemoveRedPointEventInternal(eventId, true)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--删除一个红点事件
|
|
|
|
|
function XRedPointManager.RemoveRedPointEventOnly(eventId)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
RemoveRedPointEventInternal(eventId, false)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检测红点
|
|
|
|
|
function XRedPointManager.Check(eventId, args)
|
|
|
|
|
if not eventId or eventId <= 0 then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if RedPointEventDic == nil or not RedPointEventDic[eventId] then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local pointEvent = RedPointEventDic[eventId]
|
|
|
|
|
|
|
|
|
|
if pointEvent then
|
|
|
|
|
pointEvent:Check(args)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检测红点,直接判断不持有节点
|
|
|
|
|
function XRedPointManager.CheckOnce(func, listener, conditionGroup, args)
|
|
|
|
|
local result = -1
|
|
|
|
|
|
|
|
|
|
for _, v in ipairs(conditionGroup) do
|
|
|
|
|
if XRedPointConditions[v] ~= nil then
|
|
|
|
|
if not XRedPointManager.CheckIsFitter(v) then
|
|
|
|
|
|
|
|
|
|
local r = XRedPointConditions[v].Check(args)
|
|
|
|
|
|
|
|
|
|
if type(r) == "number" then
|
|
|
|
|
result = result + r
|
|
|
|
|
elseif r == true and result == -1 then
|
|
|
|
|
result = 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if func then
|
|
|
|
|
func(listener, result, args)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XRedPointManager.CheckOnceByButton(button, conditionGroup, args)
|
|
|
|
|
XRedPointManager.CheckOnce(function(_, count)
|
|
|
|
|
button:ShowReddot(count >= 0)
|
|
|
|
|
end, nil , conditionGroup,args)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检测红点通过节点
|
|
|
|
|
function XRedPointManager.CheckByNode(node, args)
|
|
|
|
|
if RedPointEventDic == nil then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local redPointEvent = nil
|
|
|
|
|
for _, v in pairs(RedPointEventDic) do
|
|
|
|
|
if v:CheckNode() and v.node == node then
|
|
|
|
|
redPointEvent = v
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if redPointEvent then
|
|
|
|
|
redPointEvent:Check(args)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检测红点过滤
|
|
|
|
|
function XRedPointManager.CheckIsFitter(conditionId)
|
|
|
|
|
if not RedPointFiitterEvents then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not RedPointFiitterEvents[conditionId] then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--自动释放
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XRedPointManager.AutoReleaseRedPointEvent()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if not RedPointEventDic then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local removeEvents = {}
|
|
|
|
|
for _, v in pairs(RedPointEventDic) do
|
|
|
|
|
if not v:CheckNode() then
|
|
|
|
|
table.insert(removeEvents, v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, v in ipairs(removeEvents) do
|
|
|
|
|
XRedPointManager.RemoveRedPointEvent(v.id)
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检测红点
|
|
|
|
|
function XRedPointManager.CheckConditions(conditions, args)
|
|
|
|
|
for _, v in ipairs(conditions) do
|
|
|
|
|
if XRedPointConditions[v] ~= nil then
|
|
|
|
|
if not XRedPointManager.CheckIsFitter(v) then
|
|
|
|
|
local r = XRedPointConditions[v].Check(args)
|
|
|
|
|
if type(r) == "number" then
|
|
|
|
|
if r > 0 then return true end
|
|
|
|
|
elseif r then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|