Hope it works ;)

This commit is contained in:
rilgamon 2021-03-21 17:04:47 +01:00
parent e200aa9859
commit 5a66dcdc30
4 changed files with 208 additions and 69 deletions

View File

@ -1,31 +1,75 @@
local lib, oldminor = LibStub:NewLibrary("zzAddOn", 2)
local lib = LibStub:NewLibrary("zzAddOn", 4)
if not lib then return end
oldminor = oldminor or 0
local config = LibStub:GetLibrary("zzConfig")
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 mixins = {'NewAddOn', 'GetAddOn', 'AddChild', 'HasChild', 'IsChild', 'HasParent', 'GetParent', 'GetOptions', 'RegisterEvent','UnregisterEvent','IsClassic', 'GetSpecs', 'Fire'}
local events = lib['events']
function lib:Fire(...)
lib['callbacks']:Fire(...)
end
function lib:GetAddOn(childName)
return lib['addons'][childName]
end
function lib:GetOptions()
return self['options']
end
function lib:GetParent()
return self['parent']
end
function lib:HasParent()
return self['parent'] and true or false
end
function lib:IsChild()
return self:HasParent()
end
function lib:HasChild()
return self['children'] and #self['children'] > 0
end
function lib:GetSpecs(childName)
if(self['specs']) then
return self['specs'][childName]
return lib['addons'][childName]['specs']
end
local function joinTables(tab1, tab2, prefix)
prefix = prefix or ''
for k, v in pairs(tab2) do
if(tab1[k] and type(v) == 'table') then
joinTables(tab1[k], v, format("%s ", prefix))
else
tab1[k] = v
end
end
end
function lib:RegisterEvent(event)
function lib:AddChild(child)
local childName = child['specs']['name']
child['parent'] = self
self['children'] = self['children'] or {}
self['children'][#self['children'] + 1] = child
if(child['specs']['defaults']) then
joinTables(self['specs']['defaults'], child['specs']['defaults'])
end
end
function lib:RegisterEvent(event, globalfunc)
if(type(event) == 'table') then
for ev, func in pairs(event) do
for k, v in pairs(event) do
-- print("[zza] Registertab CB", type(ev),ev)
local ev = k
local func = v
if(type(v) == 'string') then
ev = v
func = globalfunc
end
if(type(ev) == 'string' and type(func) == 'function' and not self['events'][ev]) then
self['events'][ev] = func
end
self:RegisterEvent(ev)
self:RegisterEvent(ev, func)
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)
lib.RegisterCallback(self, event, globalfunc)
else
print("ign reg", type(event), event)
end
@ -36,29 +80,32 @@ function lib:UnregisterEvent(event)
self:UnregisterEvent(ev)
end
else
lib['UnregisterCallback'](self['events'], event)
lib['UnregisterCallback'](self, event)
end
-- print('unreg', event)
end
function lib:IsClassic()
return WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
end
function lib:NewAddOn(specs, addonName, addonTable)
function lib:NewAddOn(addonName, addonTable)
local specs = self['specs']
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
self.GetAddOnTable = function() return addonTable end
lib['addons'][childName] = self
lib:Embed(self)
if(childName ~= addonName) then
local parent = lib['addons'][addonName]
parent:AddChild(self)
end
if(self['events']) then
for ev, func in pairs(self['events']) do
if(type(func) == 'function') then
-- print("[zza] Register", ev)
addonTable:RegisterEvent(ev)
self:RegisterEvent(ev, func)
end
end
end
return lib['addons'][childName]
return self
end
end
function lib:Embed(target)
@ -70,31 +117,69 @@ for target, _ in pairs(lib['addons']) do
lib:Embed(target)
end
lib['events']:RegisterEvent('ADDON_LOADED')
local function addLDB(...)
-- print('addLDB', ...)
return LibStub:GetLibrary("zzLDB"):AddLDB(...)
end
local function addConfig(addonName, child, specs)
local at = child:GetAddOnTable()
if(addonName == child['specs']['name']) then
-- print("init options", addonName)
config:InitConfig(child, addonName)
child['options']['args']['profile'] = LibStub("AceDBOptions-3.0"):GetOptionsTable(at['db'])
else
-- print('add child options', specs['name'], addonName)
config:AddConfig(child, addonName)
end
if(type(specs['cfgReset']) == 'function') then
specs['cfgReset'](child)
at['db'].RegisterCallback(specs, "OnProfileReset", 'cfgReset')
end
end
local function SetupSpecs(addonName, child)
local specs = child['specs']
if(specs and specs['sv'] and not child['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'])
local at = child:GetAddOnTable()
at['db'] = LibStub("AceDB-3.0"):New(dbname, type(specs['defaults']) == 'table' and specs['defaults'] or {}, 'Default')
-- print('setup parent ldb')
if(specs['ldb']) then
local ldbobj = addLDB(specs['name'], specs['ldb'], at['db'])
-- print(' result parent ldb', specs['name'])
end
if(specs['cfg']) then
-- print(' spec parent addcfg', addonName, specs['name'])
addConfig(addonName, child, specs)
end
if(child:HasChild()) then
for i = 1, #child['children'] do
local child = child['children'][i]
local childSpecs = child['specs']
-- print("Add child", childSpecs['name'])
if(childSpecs['ldb']) then
-- print(" Add ldb", childSpecs['name'])
local ldbobj = addLDB(childSpecs['name'], childSpecs['ldb'], at['db'])
end
if(childSpecs['cfg']) then
-- print(' spec child addcfg', addonName, childSpecs['name'])
addConfig(addonName, child, childSpecs)
end
end
end
end
end
lib['events']:SetScript("OnEvent", function(self, event, ...)
-- print("[zza]", self, event, ...)
local addonName = ...
local addon = lib['addons'][addonName]
if(addon) then
local child = lib['addons'][addonName]
if(child) 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
SetupSpecs(addonName, child)
end
end
-- print("[zza] Fire", event, ...)
lib['callbacks']:Fire(event, ...)
lib['callbacks']:Fire(event, self, event, ...)
end)

View File

@ -2,21 +2,23 @@ local lib = LibStub:NewLibrary("zzConfig", 3)
if not lib then return end
local ldb = LibStub:GetLibrary("LibDataBroker-1.1")
local ldbicon = LibStub:GetLibrary("LibDBIcon-1.0")
local mixins = {'AddConfigMenu','AddConfigEntry','InitConfig', 'GetDefaultHandler'}
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)
local db = iconbtn['db']
if(db['hide']) then
ldbicon:Hide(objname)
if(iconbtn) then
local db = iconbtn['db']
if(db['hide']) then
ldbicon:Hide(objname)
end
return db
else
print("noicon", objname)
end
return db
end
end
local function ldbiconUpdate(objname)
local db = getDB(objname)
return {}
end
local function minimapGet(pref)
local objname = pref[#pref - 2]
@ -27,7 +29,6 @@ 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
@ -38,14 +39,16 @@ local function getPref(pref)
if(type(pref['handler']['GetPref']) == 'function') then
return pref['handler']:GetPref(pref)
end
return pref['handler']['db']['profile'][pref[#pref-1]] and pref['handler']['db']['profile'][pref[#pref-1]][pref[#pref]] or nil
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)
local function setPref(pref, value, ...)
if(type(pref['handler']['SetPref']) == 'function') then
pref['handler']:SetPref(pref,value)
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
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
@ -134,6 +137,7 @@ function lib:AddConfigMenu(options, parentName, order, handler, more)
['name'] = parentName,
['type'] = 'group',
['handler'] = handler or self['handler'],
['childGroups'] =' tab',
['order'] = order or 1,
['args'] = {}
}
@ -145,22 +149,41 @@ function lib:AddConfigMenu(options, parentName, order, handler, more)
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']={}
function lib:InitConfig(child, parentName, gp, sp)
local pp = child['specs']['name'] == parentName
child['options'] = {
['name'] = parentName,
['type'] = 'group',
['handler'] = child,
['childGroups'] = 'tab',
['get'] = gp or getPref,
['set'] = sp or setPref,
['args'] = {}
}
local options = addon['options']
local options = child['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'])
LibStub("AceConfigDialog-3.0"):AddToBlizOptions(parentName, 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'])
LibStub("AceConfigDialog-3.0"):AddToBlizOptions(specs['name'], specs['name'], parentName)
return child['options']
end
function lib:Embed(target)
for _,name in pairs(mixins) do
target[name] = lib[name]

View File

@ -141,10 +141,12 @@ end
]]
function lib:IsTwink(name)
local at = self:GetAddOnTable()
local db = at['db']
local realm = GetRealmName()
local _
if(self['db']['sv']['profileKeys']) then
for k,v in pairs(self['db']['sv']['profileKeys']) do
if(db['sv']['profileKeys']) then
for k,v in pairs(db['sv']['profileKeys']) do
local n,m = strsplit(" - ",k,2)
_,m = strsplit(" ",m,2)
if(n) then

View File

@ -1,9 +1,9 @@
local lib, oldminor = LibStub:NewLibrary("zzLDB", 3)
local lib, oldminor = LibStub:NewLibrary("zzLDB", 4)
if not lib then return end
local ldb = LibStub:GetLibrary("LibDataBroker-1.1")
local ldbicon = LibStub:GetLibrary("LibDBIcon-1.0")
oldminor = oldminor or 0
local mixins = {'AddLDB', 'GetLDB'}
local mixins = {'AddLDB', 'GetLDB', 'DefaultOnClick', 'DefaultOnText'}
local defaults = {
['hide'] = false,
}
@ -11,6 +11,32 @@ lib['ldbs'] = lib['ldbs'] or {}
local function proto_OnClick(self, button)
print("onclick required", self, button)
end
function lib:DefaultOnClick(dummy, button, addon, childName)
if(IsShiftKeyDown() and button == "LeftButton") then
local sb = addon['db']['global']['ldbicons']
sb[childName]['hide'] = not sb[childName]['hide']
if(ldbicon) then
if(sb[childName]['hide']) then
ldbicon:Hide(childName)
else
ldbicon:Show(childName)
end
end
else
if(InterfaceOptionsFrame:IsVisible() and not InCombatLockdown()) then
InterfaceOptionsFrame:Hide()
else
InterfaceOptionsFrame_OpenToCategory(childName)
InterfaceOptionsFrame_OpenToCategory(childName) -- Twice because of a bug in InterfaceOptionsFrame_OpenToCategory
end
end
end
function lib:DefaultOnText(objname, message)
local ldbobj = lib:GetLDB(objname)
if(ldbobj['text'] ~= message) then
ldbobj['text'] = message
end
end
function lib:GetLDB(objname)
return ldb:GetDataObjectByName(objname)
end
@ -28,7 +54,10 @@ function lib:AddLDB(objname, obj, db)
db['global']['ldbicons'] = db['global']['ldbicons'] or {}
local sb = db['global']['ldbicons']
sb[objname] = sb[objname] or CopyTable(defaults)
local oldstatus = sb[objname]['hide']
sb[objname]['hide'] = false
ldbicon:Register(objname, ldbobj, sb[objname])
sb[objname]['hide'] = oldstatus
end
return ldbobj
end