diff --git a/Libs/zzAddOn/zzAddOn.lua b/Libs/zzAddOn/zzAddOn.lua index c684eda..9b97239 100644 --- a/Libs/zzAddOn/zzAddOn.lua +++ b/Libs/zzAddOn/zzAddOn.lua @@ -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) \ No newline at end of file diff --git a/Libs/zzConfig/zzConfig.lua b/Libs/zzConfig/zzConfig.lua index 59093a7..6137cf0 100644 --- a/Libs/zzConfig/zzConfig.lua +++ b/Libs/zzConfig/zzConfig.lua @@ -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] diff --git a/Libs/zzHelper/zzHelper.lua b/Libs/zzHelper/zzHelper.lua index 9e5093b..7d172e4 100644 --- a/Libs/zzHelper/zzHelper.lua +++ b/Libs/zzHelper/zzHelper.lua @@ -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 diff --git a/Libs/zzLDB/zzLDB.lua b/Libs/zzLDB/zzLDB.lua index 99e84d5..af84790 100644 --- a/Libs/zzLDB/zzLDB.lua +++ b/Libs/zzLDB/zzLDB.lua @@ -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