151 lines
3.7 KiB
Lua
151 lines
3.7 KiB
Lua
local core = LibStub("AceAddon-3.0"):NewAddon("AllTheLittleThings", "AceEvent-3.0", "AceHook-3.0", "AceTimer-3.0")
|
|
local db
|
|
atlt = core
|
|
|
|
local defaults = {
|
|
profile = {
|
|
enabled = { },
|
|
modules = { },
|
|
},
|
|
}
|
|
local options_setter = function(info, v) local t=core.db.profile for k=1,#info-1 do t=t[info[k]] end t[info[#info]]=v end
|
|
local options_getter = function(info) local t=core.db.profile for k=1,#info-1 do t=t[info[k]] end return t[info[#info]] end
|
|
local options = {
|
|
name = "AllTheLittleThings",
|
|
type = 'group',
|
|
set = options_setter,
|
|
get = options_getter,
|
|
args = {
|
|
enabled = {
|
|
name = "Toggle Modules",
|
|
type = 'group',
|
|
order = 10,
|
|
args = { },
|
|
set = function(info, v) options_setter(info, v) core:SetModule(info[#info], v) end,
|
|
},
|
|
modules = {
|
|
name = "Module Options",
|
|
type = 'group',
|
|
order = 20,
|
|
args = { },
|
|
},
|
|
},
|
|
}
|
|
local databaseCallback = {} -- functions to call when database is ready
|
|
local slashCallback = {}
|
|
local slashList = {}
|
|
|
|
local prototype = {}
|
|
local mixins = {
|
|
"RegisterOptions",
|
|
"RegisterSlashCommand",
|
|
"Print",
|
|
}
|
|
core:SetDefaultModulePrototype(prototype)
|
|
|
|
function core:OnInitialize()
|
|
-- Get basic information about modules
|
|
for name, mod in self:IterateModules() do
|
|
defaults.profile.enabled[name] = true
|
|
options.args.enabled.args[name] = {
|
|
name = name,
|
|
type = 'toggle',
|
|
}
|
|
end
|
|
|
|
-- Not embedding AceConsole-3.0 so that we can have our own :Print()
|
|
LibStub("AceConsole-3.0").RegisterChatCommand(self, "atlt", "MainSlashHandle")
|
|
self.db = LibStub("AceDB-3.0"):New("AllTheLittleThingsDB", defaults, "Default")
|
|
db = self.db.profile
|
|
|
|
-- Now that we have our SavedVars, we can toggle modules
|
|
for name, mod in self:IterateModules() do
|
|
mod:SetEnabledState(db.enabled[name])
|
|
end
|
|
|
|
-- Generate our options and add them to Blizzard Interface
|
|
LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("AllTheLittleThings", options)
|
|
local ACD = LibStub("AceConfigDialog-3.0")
|
|
ACD:AddToBlizOptions("AllTheLittleThings", "AllTheLittleThings")
|
|
end
|
|
|
|
function core:OnEnable()
|
|
self.db:RegisterDefaults(defaults)
|
|
for mod,fn in pairs(databaseCallback) do
|
|
xpcall(function()
|
|
fn(db.modules[mod])
|
|
end, geterrorhandler())
|
|
end
|
|
end
|
|
|
|
function core:OnDisable()
|
|
end
|
|
|
|
function core:SetModule(name, status)
|
|
local mod = self:GetModule(name)
|
|
if mod then
|
|
if status then
|
|
mod:Enable()
|
|
else
|
|
mod:Disable()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- two registry functions called with self=mod
|
|
function core:RegisterOptions(modOptions, modDefaults, callback)
|
|
local name = self:GetName()
|
|
defaults.profile.modules[name] = modDefaults
|
|
options.args.modules.args[name] = {
|
|
name = name,
|
|
type = 'group',
|
|
args = modOptions
|
|
}
|
|
|
|
databaseCallback[name] = callback
|
|
end
|
|
|
|
function core:RegisterSlashCommand(callback, ...)
|
|
local keyword
|
|
for i=1,select('#', ...) do
|
|
local slash = select(i, ...)
|
|
if slashCallback[slash] then
|
|
error(("Slash command paramter already registered: '%s'"):format(slash))
|
|
end
|
|
slashCallback[slash] = function(...)
|
|
self[callback](self, ...)
|
|
end
|
|
|
|
if not keyword or slash:len() < keyword:len() then
|
|
keyword = slash
|
|
end
|
|
end
|
|
|
|
slashList[("|cff33ff99%s|r:|cffcc7833%s()|r"):format(self:GetName(), callback)] = keyword
|
|
end
|
|
|
|
function core:MainSlashHandle(msg)
|
|
local _, e, command = msg:find("(%S+)")
|
|
|
|
if command and slashCallback[command] then
|
|
msg = msg:sub(e+1)
|
|
slashCallback[command](msg)
|
|
else
|
|
-- print all commands
|
|
print("|cff33ff99AllTheLittleThings|r available commands:")
|
|
for cmd,call in pairs(slashList) do
|
|
print((" %s - %s"):format(cmd, call))
|
|
end
|
|
end
|
|
end
|
|
|
|
function core:Print(...)
|
|
LibStub("AceConsole-3.0").Print('atlt', ...)
|
|
end
|
|
|
|
|
|
-- fill out our prototype now that our addon's indicies are populated
|
|
for _,method in ipairs(mixins) do
|
|
prototype[method] = core[method]
|
|
end
|
|
|