zz_Mailbox/Libs/zzConfig/zzConfig.lua

160 lines
4.2 KiB
Lua

local lib, oldminor = LibStub:NewLibrary("zzConfig", 2)
if not lib then return end
oldminor = oldminor or 0
local ldb = LibStub:GetLibrary("LibDataBroker-1.1")
local ldbicon = LibStub:GetLibrary("LibDBIcon-1.0")
local mixins = {'AddConfigMenu','AddConfigEntry','InitConfig'}
lib['configs'] = lib['configs'] or {}
local function getDB(objname)
if(ldbicon) then
ldbicon:Show(objname)
local iconbtn = ldbicon:GetMinimapButton(objname)
local db = iconbtn['db']
if(db['hide']) then
ldbicon:Hide(objname)
end
return db
end
end
local function ldbiconUpdate(objname)
local db = getDB(objname)
end
local function minimapGet(pref)
local objname = pref[#pref - 2]
-- print('gp', objname, pref)
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
ldbiconUpdate(objname)
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
-- print("use handler getpref", pref[#pref])
return pref['handler']:GetPref(pref)
end
-- for i = 1, #pref do
-- print(i, pref[i])
-- end
-- print("use default getpref", pref[#pref], pref['handler']['db']['profile'][pref[#pref]])
return pref['handler']['db']['profile'][pref[#pref-1]][pref[#pref]]
end
local function setPref(pref,value)
if(type(pref['handler']['SetPref']) == 'function') then
pref['handler']:SetPref(pref,value)
else
local oldvalue = pref['handler']['db']['profile'][pref[#pref-1]][pref[#pref]]
pref['handler']['db']['profile'][pref[#pref-1]][pref[#pref]] = value
if(value ~= oldvalue) then
notify(pref, value, oldvalue)
end
end
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[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, handler, order, more)
local menu = {
['name'] = parentName,
['type'] = 'group',
['handler'] = handler or self['handler'],
['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
function lib:InitConfig(addon, parentName, gp, sp)
addon['options'] = {
['type']='group',
['handler']=addon,
['get']=gp or getPref,
['set']=sp or setPref,
['childGroups']='tab',
['args']={}
}
local options = addon['options']
local par = self:AddConfigMenu(options, parentName)
self:AddLDBIconOptions(par, 'minimap')
LibStub("AceConfig-3.0"):RegisterOptionsTable(parentName, options)
LibStub("AceConfigDialog-3.0"):AddToBlizOptions(parentName, parentName, self['parentName'])
return 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