zz_Bags/Libs/zzConfig/zzConfig.lua

200 lines
5.3 KiB
Lua
Executable File

local lib = LibStub:NewLibrary("zzConfig", 6)
if not lib then return end
local ldbicon = LibStub:GetLibrary("LibDBIcon-1.0")
local mixins = {'AddConfigMenu', 'AddConfigEntry', 'InitConfig', 'GetDefaultHandler'}
lib['configs'] = lib['configs'] or {}
local function getDB(objname)
if(ldbicon) then
ldbicon:Show(objname)
local iconbtn = ldbicon:GetMinimapButton(objname)
if(iconbtn) then
local db = iconbtn['db']
if(db['hide']) then
ldbicon:Hide(objname)
end
return db
else
-- print("noicon", objname)
end
end
return {}
end
local function minimapGet(pref)
local objname = pref[#pref - 2]
local db = getDB(objname)
return db[pref[#pref]]
end
local function minimapSet(pref,value)
local objname = pref[#pref - 2]
local db = getDB(objname)
db[pref[#pref]] = value
end
local function notify(pref, value, oldvalue)
if(type(pref['handler'].PrefChanged) == 'function') then
pref['handler']:PrefChanged(pref, value, oldvalue)
end
end
local function getPref(pref)
if(type(pref['handler']['GetPref']) == 'function') then
return pref['handler']:GetPref(pref)
end
local db = pref['handler']['db'] or pref['handler']:GetAddOnTable()['db']['profile'][pref['appName']]
return db and db[pref[#pref]]
end
local function setPref(pref, value, ...)
if(type(pref['handler']['SetPref']) == 'function') then
pref['handler']:SetPref(pref, value, ...)
else
local db = pref['handler']['db'] or pref['handler']:GetAddonTable()['db']['profile'][pref[#pref-1]]
local oldvalue = db[pref[#pref]]
db[pref[#pref]] = value
if(value ~= oldvalue) then
notify(pref, value, oldvalue)
end
end
end
local function GDH_GetPref(self, pref)
return self['db'][pref[#pref]]
end
local function GDH_SetPref(self, pref, value)
self['db'][pref[#pref]] = value
if(type(self['func']) == 'function') then
self['func'](self)
end
end
function lib:GetDefaultHandler(func, db)
return {
['db'] = db,
['func'] = func,
SetDB = function(self, db) self.db = db end,
GetPref = GDH_GetPref,
SetPref = GDH_SetPref,
}
end
function lib:AddLDBIconOptions(options, conf)
options['args'][conf] = {
['name']="Minimapicon",
['type']='group',
['inline']=true,
['get'] = minimapGet,
['set'] = minimapSet,
['order'] = 100,
['args']={
['hide'] ={
['type'] = 'toggle',
['name'] = "Hide Minimapicon",
},
['minimapPos'] ={
['type'] = 'range',
['name'] = "Minimapicon Position",
['min'] = 1,
['max'] = 250,
['step']=1,
}
}
}
end
function lib:AddConfigEntry(options, ...)
local input = {...}
if(input) then
local menu = {
['type'] = input[2],
['name'] = input[3],
['desc'] = input[4],
['order'] = input[5]
}
if(input[2] == 'range') then
menu['min'] = input[6]
menu['max'] = input[7]
menu['step'] = input[8]
menu['isPercent'] = input[9]
elseif(input[2] == 'execute') then
menu['func'] = input[6]
elseif(input[2] == 'color') then
menu['get'] = input[6]
menu['set'] = input[7]
menu['hasAlpha'] = true
elseif(input[2] == 'select') then
menu['values'] = input[6]
elseif(input[2] == 'group') then
menu['inline'] = input[7]
menu['handler'] = input[6]
menu['args'] = {
['description'] = {
['name'] = input[4],
['type'] = 'header',
['order'] = 0
},
}
end
options['args'][input[1]] = menu
return menu
end
end
function lib:AddConfigMenu(options, parentName, order, handler, more)
local menu = {
['name'] = parentName,
['type'] = 'group',
['handler'] = handler or self['handler'],
['childGroups'] = 'tab',
['order'] = order or 1,
['args'] = {}
}
if(more) then
for k, v in pairs(more) do
menu[k] = v
end
end
options['args'][parentName] = menu
return options['args'][parentName]
end
lib.AddedToBlizz = lib.AddedToBlizz or {}
local function addToBlizz(pName, cName)
if(not lib['AddedToBlizz'][pName]) then
lib['AddedToBlizz'][pName] = true
LibStub("AceConfigDialog-3.0"):AddToBlizOptions(pName, pName, cName)
end
end
function lib:InitConfig(child, parentName, gp, sp)
child['options'] = {
['name'] = parentName,
['type'] = 'group',
['handler'] = child,
['childGroups'] = 'tab',
['get'] = gp or getPref,
['set'] = sp or setPref,
['args'] = {}
}
local options = child['options']
local par = self:AddConfigMenu(options, parentName)
self:AddLDBIconOptions(par, 'minimap')
LibStub("AceConfig-3.0"):RegisterOptionsTable(parentName, options)
addToBlizz(parentName, child['parentName'])
return options
end
function lib:AddConfig(child, parentName, gp, sp)
local specs = child['specs']
child['options'] = {
['name'] = specs['name'],
['type'] = 'group',
['handler'] = child,
['childGroups']='tab',
['get']=gp or getPref,
['set']=sp or setPref,
['args'] = {}
}
local par = self:AddConfigMenu(child['options'], specs['name'])
self:AddLDBIconOptions(par, 'minimap')
LibStub("AceConfig-3.0"):RegisterOptionsTable(specs['name'], child['options'])
addToBlizz(specs['name'], parentName)
return child['options']
end
function lib:Embed(target)
for _,name in pairs(mixins) do
target[name] = lib[name]
end
end
for target, _ in pairs(lib['configs']) do
lib:Embed(target)
end