PGRData/Script/matrix/xmanager/XRedPointManager.lua

189 lines
No EOL
4.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--红点管理器
XRedPointManager = XRedPointManager or {}
require("XRedPoint/XRedPointConditions")
local RedPointEventDic = {}
local RedPointFiitterEvents = {}
local eventIdPool = 0
function XRedPointManager.Init()
RedPointEventDic = RedPointEventDic or {}
RedPointFiitterEvents = RedPointFiitterEvents or {}
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.GenarateEventId()
eventIdPool = eventIdPool + 1
return eventIdPool
end
--增加一个红点事件
function XRedPointManager.AddRedPointEvent(node, func, listener, conditionGroup, args, isCheck)
if not node then
XLog.Warning("该绑定节点为空需要检查UI预设")
return
end
local eventId = XRedPointManager.GenarateEventId()
--创建一个事件组
local condition = XRedPointConditionGroup.New(conditionGroup)
--创建监听者
local pointListener = XRedPointListener.New()
pointListener.listener = listener
pointListener.func = func
--创建红点事件
local pointEvent = XRedPointEvent.New(eventId, node, condition, pointListener, args)
RedPointEventDic[eventId] = pointEvent
if isCheck == nil or isCheck == true then
XRedPointManager.Check(eventId)
end
return eventId
end
--删除一个红点事件
function XRedPointManager.RemoveRedPointEvent(eventId)
if RedPointEventDic == nil or not RedPointEventDic[eventId] then
return
end
local pointEvent = RedPointEventDic[eventId]
if pointEvent then
pointEvent:Release()
end
RedPointEventDic[eventId] = nil
end
--删除一个红点事件
function XRedPointManager.RemoveRedPointEventOnly(eventId)
if RedPointEventDic == nil or not RedPointEventDic[eventId] then
return
end
RedPointEventDic[eventId] = nil
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
--自动释放
function XRedPointManager.AutoReleseRedPointEvent()
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
end