189 lines
No EOL
4.5 KiB
Lua
189 lines
No EOL
4.5 KiB
Lua
--红点管理器
|
||
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 |