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.

189 lines
5.3 KiB

local addon, ns = ...;
local L = ns.L;
local pairs,type=pairs,type;
ns.modules = {};
local queue,queue_ticker = {};
local function queue_ticker_func()
local mod
if #queue>0 then
mod = ns.modules[tremove(queue,1)];
mod.onevent(mod.eventFrame,"PLAYER_LOGIN");
elseif queue_ticker then
queue_ticker:Cancel();
queue_ticker = nil;
end
end
function ns.modulePLQueueInit()
queue_ticker = C_Timer.NewTicker(0.001,queue_ticker_func);
ns.modulePLQueueInit = nil;
end
function ns.updateMinimapButton(modName)
local mod = ns.modules[modName];
local cfg = ns.profile[modName];
-- check config
if type(cfg.minimap)~="table" then
cfg.minimap = {hide=true};
end
if ns.LDBI:IsRegistered(mod.ldbName) then
-- perform refresh on minimap button if already exists
ns.LDBI:Refresh(mod.ldbName);
elseif not cfg.minimap.hide then
-- register minimap button if not exists
ns.LDBI:Register(mod.ldbName,mod.obj,cfg.minimap);
end
end
-- [force] - used by child modules to enable core module (like gps and followers)
local function moduleInit(name, force)
if not ns.modules[name] then return end
if ns.profile[name] and (ns.profile[name].enabled==true or force) then
local mod = ns.modules[name];
mod.isEnabled = true;
-- module init
if mod.init then
mod.init();
mod.init = nil;
end
if not mod.isHiddenModule then
-- new clickOptions system
local onclick;
if (type(mod.clickOptions)=="table") then
local active = ns.ClickOpts.update(name);
if active then
function onclick(self,button)
ns.ClickOpts.func(self,button,name);
end
end
elseif (type(mod.onclick)=="function") then
onclick = mod.onclick;
end
-- LDB init
if (not mod.onenter) and mod.ontooltip then
mod.ontooltipshow = mod.ontooltip;
end
if not mod.iconName then
mod.iconName = name;
end
local icon = ns.I(mod.iconName .. (mod.icon_suffix or ""));
local iColor = ns.profile.GeneralOptions.iconcolor;
local ldbOblectTable = {
-- button data
type = "data source",
label = L[name],
text = L[name],
icon = icon.iconfile, -- default or custom icon
staticIcon = icon.staticIcon or icon.iconfile, -- default icon only
iconCoords = icon.coords or {0, 1, 0, 1},
-- button event functions
OnEnter = mod.onenter or nil,
OnLeave = mod.onleave or nil,
OnClick = onclick,
OnTooltipShow = mod.ontooltipshow or nil,
-- let user know who registered the broker
-- displayable by broker dispay addons...
-- DataBrokerGroups using it in option panel.
parent = addon
};
mod.ldbName = (ns.profile.GeneralOptions.usePrefix and "BE.." or "")..name;
mod.obj = ns.LDB:NewDataObject(mod.ldbName,ldbOblectTable);
if not mod.obj then -- another addon has used the same name for registration
mod.ldbName = "BE.."..mod.ldbName;
mod.obj = ns.LDB:NewDataObject(mod.ldbName,ldbOblectTable);
end
ns.updateIcons(name);
-- is possible that
if mod.obj then
-- register minimap button
ns.updateMinimapButton(name);
end
end
-- event handling
if (mod.onevent and mod.events) or (mod.onupdate) then
if not mod.noEventFrame then
mod.eventFrame=CreateFrame("Frame");
else
-- table as dummy to execute following BE_UPDATE_CFG, VARIABLES_LOADED and PLAYER_LOGIN only
mod.eventFrame={};
end
mod.eventFrame.modName = name;
if type(mod.onevent)=="function" and type(mod.events)=="table" then
mod.eventFrame:SetScript("OnEvent",mod.onevent);
mod.onevent(mod.eventFrame,"BE_UPDATE_CFG");
if mod.clickOptions then
mod.onevent(mod.eventFrame,"BE_UPDATE_CFG","ClickOpt");
end
for _, e in pairs(mod.events) do
if e=="VARIABLES_LOADED" then
mod.onevent(mod.eventFrame,e,addon);
elseif (e=="PLAYER_LOGIN" and ns.eventPlayerEnteredWorld) then
mod.onevent(mod.eventFrame,e);
end
if e=="PLAYER_LOGIN" then
tinsert(queue,name);
else
mod.eventFrame:RegisterEvent(e);
end
end
end
end
-- timeout function
if type(mod.ontimeout)=="function" and type(mod.timeout)=="number" and mod.timeout>0 then
C_Timer.After(mod.timeout,mod.ontimeout);
end
-- onupdate function
-- frame script OnUpdate ticking too fast... C_Timer is better
if type(mod.onupdate)=="function" and type(mod.onupdate_interval)=="number" and mod.onupdate_interval>0 then
mod.onupdate_ticker = C_Timer.NewTicker(mod.onupdate_interval,mod.onupdate);
end
-- chat command registration
if (mod.chatcommands) then
for k,v in pairs(mod.chatcommands) do
if (type(k)=="string") then
-- Example: ns.AddChatCommand("<string>",{desc="<string>",func=function()end});
ns.AddChatCommand(k,v);
end
end
end
end
end
-- in core.lua on event ADDON_LOADED or option panel
function ns.moduleInit(name,force)
if (name) then
-- enable module by name
ns.Options_RegisterModule(name);
ns.Options_RegisterDefaults();
moduleInit(name,force);
else
-- enable all registered modules
for name, data in pairs(ns.modules) do
ns.Options_RegisterModule(name);
end
ns.Options_RegisterDefaults();
for name, data in pairs(ns.modules) do
moduleInit(name);
end
end
end