100 lines
3.4 KiB
Lua
100 lines
3.4 KiB
Lua
local lib, oldminor = LibStub:NewLibrary("zzAddOn", 2)
|
|
if not lib then return end
|
|
oldminor = oldminor or 0
|
|
lib['callbacks'] = lib['callbacks'] or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
|
|
lib['addons'] = lib['addons'] or {}
|
|
lib['events'] = lib['events'] or CreateFrame("FRAME")
|
|
local mixins = {'RegisterEvent','UnregisterEvent','IsClassic', 'GetSpecs'}
|
|
local events = lib['events']
|
|
function lib:GetSpecs(childName)
|
|
if(self['specs']) then
|
|
return self['specs'][childName]
|
|
end
|
|
end
|
|
function lib:RegisterEvent(event)
|
|
if(type(event) == 'table') then
|
|
for ev, func in pairs(event) do
|
|
-- print("[zza] Registertab CB", type(ev),ev)
|
|
if(type(ev) == 'string' and type(func) == 'function' and not self['events'][ev]) then
|
|
self['events'][ev] = func
|
|
end
|
|
self:RegisterEvent(ev)
|
|
end
|
|
elseif(type(event) == 'string') then
|
|
-- print("[zza] Register CB", type(event),event)
|
|
if(not lib['events']:IsEventRegistered(event)) then
|
|
lib['events']:RegisterEvent(event)
|
|
end
|
|
lib['RegisterCallback'](self['events'], event)
|
|
else
|
|
print("ign reg", type(event), event)
|
|
end
|
|
end
|
|
function lib:UnregisterEvent(event)
|
|
if(type(event) == 'table') then
|
|
for key, ev in pairs(event) do
|
|
self:UnregisterEvent(ev)
|
|
end
|
|
else
|
|
lib['UnregisterCallback'](self['events'], event)
|
|
end
|
|
end
|
|
function lib:IsClassic()
|
|
return WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
|
|
end
|
|
function lib:NewAddOn(specs, addonName, addonTable)
|
|
local childName = specs['name']
|
|
addonTable['parentName'] = addonName
|
|
addonTable['specs'] = addonTable['specs'] or {}
|
|
addonTable['specs'][childName] = specs
|
|
if(type(childName) == 'string') then
|
|
lib['addons'][childName] = addonTable
|
|
lib:Embed(addonTable)
|
|
if(addonTable['events']) then
|
|
for ev, func in pairs(addonTable['events']) do
|
|
if(type(func) == 'function') then
|
|
-- print("[zza] Register", ev)
|
|
addonTable:RegisterEvent(ev)
|
|
end
|
|
end
|
|
end
|
|
return lib['addons'][childName]
|
|
end
|
|
end
|
|
function lib:Embed(target)
|
|
for _,name in pairs(mixins) do
|
|
target[name] = lib[name]
|
|
end
|
|
end
|
|
for target, _ in pairs(lib['addons']) do
|
|
lib:Embed(target)
|
|
end
|
|
lib['events']:RegisterEvent('ADDON_LOADED')
|
|
lib['events']:SetScript("OnEvent", function(self, event, ...)
|
|
-- print("[zza]", self, event, ...)
|
|
local addonName = ...
|
|
local addon = lib['addons'][addonName]
|
|
if(addon) then
|
|
if(event == 'ADDON_LOADED') then
|
|
local specs = addon:GetSpecs(addonName)
|
|
if(specs and specs['sv'] and not addon['db']) then
|
|
-- print('dbname',type(specs['sv']),type(specs['sv']) == 'boolean' and addonName or specs['sv'])
|
|
local dbname = format('%sDB', type(specs['sv']) == 'boolean' and addonName or specs['sv'])
|
|
addon['db'] = LibStub("AceDB-3.0"):New(dbname, type(specs['defaults']) == 'table' and specs['defaults'] or {}, 'Default')
|
|
if(specs['ldb']) then
|
|
local ldbobj = LibStub:GetLibrary("zzLDB"):AddLDB(specs['name'], specs['ldb'], addon['db'])
|
|
end
|
|
if(specs['cfg']) then
|
|
local config = LibStub:GetLibrary("zzConfig")
|
|
addon['options'] = config:InitConfig(addon, addonName)
|
|
addon['options']['args']['profile'] = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon['db'])
|
|
if(type(specs['cfgReset']) == 'function') then
|
|
addon['db'].RegisterCallback(specs, "OnProfileReset", 'cfgReset')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- print("[zza] Fire", event, ...)
|
|
lib['callbacks']:Fire(event, ...)
|
|
end) |