You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.1 KiB
79 lines
2.1 KiB
local tinsert = table.insert;
|
|
local processors = {};
|
|
|
|
local function CreateProcessor(name, cycle)
|
|
local p = CreateFrame("frame", name, nil);
|
|
tinsert(processors, p);
|
|
|
|
p:Hide();
|
|
p.queue = {};
|
|
|
|
if not cycle or type(cycle) ~= "number" then
|
|
cycle = 0.25; --1 update every 0.2 seconds
|
|
end
|
|
p.cycle = cycle;
|
|
|
|
function p:Add(newWidget, queryFunc)
|
|
self.t = 0;
|
|
local inQueue;
|
|
for i = 1, #self.queue do
|
|
if self.queue[i][1] == newWidget then
|
|
self.queue[i] = {newWidget, queryFunc, numQuery = 0};
|
|
inQueue = true;
|
|
break
|
|
end
|
|
end
|
|
if not inQueue then
|
|
tinsert(self.queue, {newWidget, queryFunc, numQuery = 0});
|
|
end
|
|
self:Show();
|
|
end
|
|
|
|
function p:Process()
|
|
local isComplete = true;
|
|
for i = 1, #self.queue do
|
|
local widget = self.queue[i][1];
|
|
if widget then
|
|
local queryFunc = self.queue[i][2];
|
|
local arg1 = self.queue[i][3];
|
|
local numQuery = self.queue[i].numQuery;
|
|
if (not queryFunc) or ( queryFunc(widget, arg1) ) or (not numQuery) or numQuery > 4 then
|
|
self.queue[i] = {};
|
|
else
|
|
self.queue[i].numQuery = numQuery + 1;
|
|
isComplete = false;
|
|
end
|
|
end
|
|
end
|
|
return isComplete;
|
|
end
|
|
|
|
function p:Stop()
|
|
self:Hide();
|
|
self.t = 0;
|
|
wipe(self.queue);
|
|
end
|
|
|
|
p:SetScript("OnUpdate", function(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.t >= self.cycle then
|
|
self.t = 0;
|
|
local isComplete = self:Process();
|
|
if isComplete then
|
|
self:Stop();
|
|
end
|
|
end
|
|
end)
|
|
|
|
return p
|
|
end
|
|
|
|
local function StopAllProcessors()
|
|
for i = 1, #processors do
|
|
processors[i]:Stop();
|
|
end
|
|
end
|
|
|
|
|
|
NarciAPI.CreateProcessor = CreateProcessor;
|
|
NarciAPI.StopAllProcessors = StopAllProcessors;
|