From ce6a006d6f287c4d11dbcfc5503d11e0dbecf37b Mon Sep 17 00:00:00 2001 From: Munglunch Date: Fri, 12 Sep 2014 14:41:24 -0500 Subject: [PATCH] core updates --- Interface/AddOns/SVUI/SVUI.lua | 982 ++++++++ Interface/AddOns/SVUI/SVUI.xml | 9 +- Interface/AddOns/SVUI/installer/presets/auras.lua | 283 +++ Interface/AddOns/SVUI/installer/presets/bars.lua | 133 ++ .../AddOns/SVUI/installer/presets/layouts.lua | 394 ++++ Interface/AddOns/SVUI/installer/presets/media.lua | 119 + Interface/AddOns/SVUI/installer/presets/units.lua | 385 ++++ Interface/AddOns/SVUI/installer/setup.lua | 2393 ++++++++++++++++++++ Interface/AddOns/SVUI/packages/actionbar/SVBar.lua | 4 +- Interface/AddOns/SVUI/packages/bag/SVBag.lua | 4 +- Interface/AddOns/SVUI/packages/dock/SVDock.lua | 2 +- Interface/AddOns/SVUI/packages/gear/SVGear.lua | 4 +- .../AddOns/SVUI/packages/henchmen/SVHenchmen.lua | 4 +- Interface/AddOns/SVUI/packages/map/SVMap.lua | 6 +- Interface/AddOns/SVUI/packages/unit/SVUnit.lua | 5 +- Interface/AddOns/SVUI/packages/unit/frames.lua | 157 +- Interface/AddOns/SVUI/scripts/misc.lua | 38 +- Interface/AddOns/SVUI/scripts/questwatch.lua | 2 +- Interface/AddOns/SVUI/scripts/spellbind.lua | 305 +-- Interface/AddOns/SVUI/system/global.lua | 481 ---- Interface/AddOns/SVUI/system/installer.lua | 1275 ----------- Interface/AddOns/SVUI/system/load.lua | 10 +- Interface/AddOns/SVUI/system/presets.lua | 1146 ---------- Interface/AddOns/SVUI/system/registry.lua | 569 ----- Interface/AddOns/SVUI/system/timers.lua | 68 +- .../SVUI_AnsweringService.lua | 21 +- Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua | 39 +- Interface/AddOns/SVUI_Laborer/modes/farming.lua | 4 +- .../AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua | 14 +- .../AddOns/SVUI_StyleOMatic/addons/character.lua | 2 +- Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua | 2 +- Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua | 2 +- .../SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua | 4 +- .../SVUI_StyleOMatic/addons/thirdparty/Clique.lua | 153 +- .../SVUI_TrackingDevice/SVUI_TrackingDevice.lua | 9 - .../SVUI_TrackingDevice/artwork/DOODAD-BORDER.blp | Bin 6676 -> 23060 bytes 36 files changed, 5140 insertions(+), 3888 deletions(-) create mode 100644 Interface/AddOns/SVUI/SVUI.lua create mode 100644 Interface/AddOns/SVUI/installer/presets/auras.lua create mode 100644 Interface/AddOns/SVUI/installer/presets/bars.lua create mode 100644 Interface/AddOns/SVUI/installer/presets/layouts.lua create mode 100644 Interface/AddOns/SVUI/installer/presets/media.lua create mode 100644 Interface/AddOns/SVUI/installer/presets/units.lua create mode 100644 Interface/AddOns/SVUI/installer/setup.lua delete mode 100644 Interface/AddOns/SVUI/system/global.lua delete mode 100644 Interface/AddOns/SVUI/system/installer.lua delete mode 100644 Interface/AddOns/SVUI/system/presets.lua delete mode 100644 Interface/AddOns/SVUI/system/registry.lua diff --git a/Interface/AddOns/SVUI/SVUI.lua b/Interface/AddOns/SVUI/SVUI.lua new file mode 100644 index 0000000..609ce84 --- /dev/null +++ b/Interface/AddOns/SVUI/SVUI.lua @@ -0,0 +1,982 @@ +--[[ +############################################################################## +_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_ # + ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__ # + __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____ # + ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____ # + ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____ # + _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ # + __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ # + _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_# + ___\///////////___________\///___________\/////////_____\///////////_# +############################################################################## +S U P E R - V I L L A I N - U I By: Munglunch # +############################################################################## ]]-- +--[[ GLOBALS ]]-- +local _G = _G; +local unpack = _G.unpack; +local select = _G.select; +local pairs = _G.pairs; +local type = _G.type; +local rawset = _G.rawset; +local rawget = _G.rawget; +local tinsert = _G.tinsert; +local tremove = _G.tremove; +local tostring = _G.tostring; +local error = _G.error; +local getmetatable = _G.getmetatable; +local setmetatable = _G.setmetatable; +local string = _G.string; +local math = _G.math; +local table = _G.table; +--[[ STRING METHODS ]]-- +local upper = string.upper; +local format, find, match, gsub = string.format, string.find, string.match, string.gsub; +--[[ MATH METHODS ]]-- +local floor = math.floor +--[[ TABLE METHODS ]]-- +local twipe, tsort, tconcat = table.wipe, table.sort, table.concat; + +--[[ LOCALS ]]-- + +local SVUINameSpace, SVUICore = ...; +local SVUIVersion = GetAddOnMetadata(..., "Version"); +local clientVersion, internalVersion, releaseDate, uiVersion = GetBuildInfo(); +local callbacks = {}; +local numCallbacks = 0; +local playerClass = select(2,UnitClass("player")); +local dumb = function() return end + +local messagePattern = "|cffFF2F00%s:|r" +local debugPattern = "|cffFF2F00%s|r [|cff992FFF%s|r]|cffFF2F00:|r" +local PLUGIN_LISTING = ""; +local ModuleQueue, ScriptQueue = {},{}; + +local INFO_BY = "%s |cff0099FFby %s|r"; +local INFO_VERSION = "%s%s |cff33FF00Version: %s|r"; +local INFO_NAME = "Plugins"; +local INFO_HEADER = "Supervillain UI (version %.3f): Plugins"; + +if GetLocale() == "ruRU" then + INFO_BY = "%s |cff0099FFот %s|r"; + INFO_VERSION = "%s%s |cff33FF00Версия: %s|r"; + INFO_NAME = "Плагины"; + INFO_HEADER = "Supervillain UI (устарела %.3f): Плагины"; +end + +--[[ CONSTANTS ]]-- + +BINDING_HEADER_SVUI = "Supervillain UI"; +SLASH_RELOADUI1 = "/rl" +SLASH_RELOADUI2 = "/reloadui" +SlashCmdList.RELOADUI = ReloadUI + +--[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]-- + +function enforce(condition, ...) + if not condition then + if next({...}) then + local fn = function (...) return(string.format(...)) end + local s,r = pcall(fn, ...) + if s then + error("Error!: " .. r, 2) + end + end + error("Error!", 2) + end +end +local assert = enforce; + +--[[ META METHODS ]]-- + +local rootstring = function(self) return self.___addonName end + +--[[ ENSURE META METHODS ]]-- + +local function SaveMetaMethods(obj) + local mt = {} + local old = getmetatable(obj) + if old then + for k, v in pairs(old) do mt[k] = v end + end + mt.__tostring = rootstring + setmetatable(obj, mt) +end + +--[[ LOCALIZATION HELPERS ]]-- + +local failsafe = function() assert(false) end + +local metaread = { + __index = function(self, key) + rawset(self, key, key) + return key + end +} + +local activeLocale + +local defaultwrite = setmetatable({}, { + __newindex = function(self, key, value) + if not rawget(activeLocale, key) then + rawset(activeLocale, key, value == true and key or value) + end + end, + __index = failsafe +}) + +local metawrite = setmetatable({}, { + __newindex = function(self, key, value) + rawset(activeLocale, key, value == true and key or value) + end, + __index = failsafe +}) + +local Localization = setmetatable({}, metaread); + +--[[ CLASS COLOR LOCALS ]]-- + +local function formatValueString(text) + if "string" == type(text) then + text = gsub(text,"\n","\\n") + if match(gsub(text,"[^'\"]",""),'^"+$') then + return "'"..text.."'"; + else + return '"'..gsub(text,'"','\\"')..'"'; + end + else + return tostring(text); + end +end + +local function formatKeyString(text) + if "string"==type(text) and match(text,"^[_%a][_%a%d]*$") then + return text; + else + return "["..formatValueString(text).."]"; + end +end + +local function RegisterCallback(self, m, h) + assert(type(m) == "string" or type(m) == "function", "Bad argument #1 to :RegisterCallback (string or function expected)") + if type(m) == "string" then + assert(type(h) == "table", "Bad argument #2 to :RegisterCallback (table expected)") + assert(type(h[m]) == "function", "Bad argument #1 to :RegisterCallback (m \"" .. m .. "\" not found)") + m = h[m] + end + callbacks[m] = h or true + numCallbacks = numCallbacks + 1 +end + +local function UnregisterCallback(self, m, h) + assert(type(m) == "string" or type(m) == "function", "Bad argument #1 to :UnregisterCallback (string or function expected)") + if type(m) == "string" then + assert(type(h) == "table", "Bad argument #2 to :UnregisterCallback (table expected)") + assert(type(h[m]) == "function", "Bad argument #1 to :UnregisterCallback (m \"" .. m .. "\" not found)") + m = h[m] + end + callbacks[m] = nil + numCallbacks = numCallbacks + 1 +end + +local function DispatchCallbacks() + if (numCallbacks < 1) then return end + for m, h in pairs(callbacks) do + local ok, err = pcall(m, h ~= true and h or nil) + if not ok then + print("ERROR:", err) + end + end +end + +--[[ BUILD CLASS COLOR GLOBAL ]]-- + +SVUI_CLASS_COLORS = {}; +do + local classes = {}; + local supercolors = { + ["HUNTER"] = { r = 0.454, g = 0.698, b = 0 }, + ["WARLOCK"] = { r = 0.286, g = 0, b = 0.788 }, + ["PRIEST"] = { r = 0.976, g = 1, b = 0.839 }, + ["PALADIN"] = { r = 0.956, g = 0.207, b = 0.733 }, + ["MAGE"] = { r = 0, g = 0.796, b = 1 }, + ["ROGUE"] = { r = 1, g = 0.894, b = 0.117 }, + ["DRUID"] = { r = 1, g = 0.513, b = 0 }, + ["SHAMAN"] = { r = 0, g = 0.38, b = 1 }, + ["WARRIOR"] = { r = 0.698, g = 0.36, b = 0.152 }, + ["DEATHKNIGHT"] = { r = 0.847, g = 0.117, b = 0.074 }, + ["MONK"] = { r = 0.015, g = 0.886, b = 0.38 }, + }; + for class in pairs(RAID_CLASS_COLORS) do + tinsert(classes, class) + end + tsort(classes) + setmetatable(SVUI_CLASS_COLORS,{ + __index = function(t, k) + if k == "RegisterCallback" then return RegisterCallback end + if k == "UnregisterCallback" then return UnregisterCallback end + if k == "DispatchCallbacks" then return DispatchCallbacks end + end + }); + for i, class in ipairs(classes) do + local color = supercolors[class] + local r, g, b = color.r, color.g, color.b + local hex = ("ff%02x%02x%02x"):format(r * 255, g * 255, b * 255) + if not SVUI_CLASS_COLORS[class] or not SVUI_CLASS_COLORS[class].r or not SVUI_CLASS_COLORS[class].g or not SVUI_CLASS_COLORS[class].b then + SVUI_CLASS_COLORS[class] = { + r = r, + g = g, + b = b, + colorStr = hex, + } + end + end + classes = nil +end + +--[[ APPENDED LUA METHODS ]]-- + +function math.parsefloat(value,decimal) + if decimal and decimal > 0 then + local calc1 = 10 ^ decimal; + local calc2 = (value * calc1) + 0.5; + return floor(calc2) / calc1 + end + return floor(value + 0.5) +end + +function table.dump(targetTable) + local dumpTable = {}; + local dumpCheck = {}; + for key,value in ipairs(targetTable) do + tinsert(dumpTable, formatValueString(value)); + dumpCheck[key] = true; + end + for key,value in pairs(targetTable) do + if not dumpCheck[key] then + tinsert(dumpTable, "\n "..formatKeyString(key).." = "..formatValueString(value)); + end + end + local output = tconcat(dumpTable, ", "); + return "{ "..output.." }"; +end + +function table.copy(targetTable,deepCopy,mergeTable) + mergeTable = mergeTable or {}; + if targetTable==nil then return nil end + if mergeTable[targetTable] then return mergeTable[targetTable] end + local replacementTable = {} + for key,value in pairs(targetTable)do + if deepCopy and type(value) == "table" then + replacementTable[key] = table.copy(value, deepCopy, mergeTable) + else + replacementTable[key] = value + end + end + setmetatable(replacementTable, table.copy(getmetatable(targetTable), deepCopy, mergeTable)) + mergeTable[targetTable] = replacementTable; + return replacementTable +end + +function string.trim(this) + return this:find('^%s*$') and '' or this:match('^%s*(.*%S)') +end + +function string.color(this, color) + return ("|cff%s%s|r"):format(color, this) +end + +function string.link(this, prefix, text, color) + text = tostring(text) + local colorstring = tostring(this):color(color or "ffffff") + return ("|H%s:%s|h%s|h"):format(prefix, text, colorstring) +end + +function string.explode(str, delim) + local res = { } + local pattern = string.format("([^%s]+)%s()", delim, delim) + while (true) do + line, pos = str:match(pattern, pos) + if line == nil then break end + table.insert(res, line) + end + return res +end + +--[[ CORE ENGINE CONSTRUCT ]]-- + +local Core_StaticPopup_Show = function(self, arg) + if arg == "ADDON_ACTION_FORBIDDEN" then + StaticPopup_Hide(arg) + end +end + +local Core_ResetAllUI = function(self, confirmed) + if InCombatLockdown()then + SendAddonMessage(ERR_NOT_IN_COMBAT) + return + end + if(not confirmed) then + self:StaticPopup_Show('RESET_UI_CHECK') + return + end + self:ResetInstallation() +end + +local Core_ResetUI = function(self, confirmed) + if InCombatLockdown()then + SendAddonMessage(ERR_NOT_IN_COMBAT) + return + end + if(not confirmed) then + self:StaticPopup_Show('RESETMOVERS_CHECK') + return + end + self:ResetMovables() +end + +local Core_ToggleConfig = function(self) + if InCombatLockdown() then + SendAddonMessage(ERR_NOT_IN_COMBAT) + self.UIParent:RegisterEvent('PLAYER_REGEN_ENABLED') + return + end + if not IsAddOnLoaded("SVUI_ConfigOMatic") then + local _,_,_,_,_,state = GetAddOnInfo("SVUI_ConfigOMatic") + if state ~= "MISSING" and state ~= "DISABLED" then + LoadAddOn("SVUI_ConfigOMatic") + local config_version = GetAddOnMetadata("SVUI_ConfigOMatic", "Version") + if(tonumber(config_version) < 4) then + self:StaticPopup_Show("CLIENT_UPDATE_REQUEST") + end + else + self:AddonMessage("|cffff0000Error -- Addon 'SVUI_ConfigOMatic' not found or is disabled.|r") + return + end + end + local aceConfig = LibStub("AceConfigDialog-3.0") + local switch = not aceConfig.OpenFrames["SVUI"] and "Open" or "Close" + aceConfig[switch](aceConfig, "SVUI") + GameTooltip:Hide() +end + +--/script SVUI[1]:TaintHandler("SVUI", "Script", "Function") +local Core_TaintHandler = function(self, taint, sourceName, sourceFunc) + if GetCVarBool('scriptErrors') ~= 1 then return end + local errorString = ("Error Captured: %s->%s->{%s}"):format(taint, sourceName or "Unknown", sourceFunc or "Unknown") + self:AddonMessage(errorString) + self:StaticPopup_Show("TAINT_RL") +end + +local function _sendmessage(msg, prefix) + if(type(msg) == "table") then + msg = tostring(msg) + end + + if(not msg) then return end + + if(prefix) then + local outbound = ("%s %s"):format(prefix, msg); + print(outbound) + else + print(msg) + end +end + +local Core_Debugger = function(self, msg) + if(not self.DebuggingMode) then return end + local outbound = (debugPattern):format("SVUI", "DEBUG") + _sendmessage(msg, outbound) +end + +local Core_AddonMessage = function(self, msg) + local outbound = (messagePattern):format("SVUI") + _sendmessage(msg, outbound) +end + +local Core_SetLocaleStrings = function(self, locale, isDefault) + local gameLocale = GetLocale() + if gameLocale == "enGB" then gameLocale = "enUS" end + + activeLocale = Localization + + if isDefault then + return defaultwrite + elseif(locale == GAME_LOCALE or locale == gameLocale) then + return metawrite + end +end + +local Core_Prototype = function(self, name) + local version = GetAddOnMetadata(name, "Version") + local schema = GetAddOnMetadata(name, "X-SVUI-Schema") + + self.Configs[schema] = {["enable"] = false} + + local obj = { + ___addonName = name, + ___version = version, + ___schema = schema + } + + local mt = {} + local old = getmetatable(obj) + if old then + for k, v in pairs(old) do mt[k] = v end + end + mt.__tostring = rootstring + setmetatable(obj, mt) + return obj +end + +--[[ REGISTRY CONSTRUCT ]]-- + +local changeDBVar = function(self, value, key, sub1, sub2, sub3) + local core = self.___core + local schema = self.___schema + local config = core.db[schema] + + if((sub1 and sub2 and sub3) and (config[sub1] and config[sub1][sub2] and config[sub1][sub2][sub3])) then + core.db[schema][sub1][sub2][sub3][key] = value + elseif((sub1 and sub2) and (config[sub1] and config[sub1][sub2])) then + core.db[schema][sub1][sub2][key] = value + elseif(sub1 and config[sub1]) then + core.db[schema][sub1][key] = value + else + core.db[schema][key] = value + end + + self.db = core.db[schema] + + if(self.UpdateLocals) then + self:UpdateLocals() + end +end + +local innerOnEvent = function(self, event, ...) + local obj = self.module + if self[event] and type(self[event]) == "function" then + self[event](obj, event, ...) + end +end + +local registerEvent = function(self, eventname, eventfunc) + if not self.___eventframe then + self.___eventframe = CreateFrame("Frame", nil) + self.___eventframe.module = self + self.___eventframe:SetScript("OnEvent", innerOnEvent) + end + + if(not self.___eventframe[eventname]) then + local fn = eventfunc + if type(eventfunc) == "string" then + fn = self[eventfunc] + elseif(not fn and self[eventname]) then + fn = self[eventname] + end + self.___eventframe[eventname] = fn + end + + self.___eventframe:RegisterEvent(eventname) +end + +local unregisterEvent = function(self, event, ...) + if(self.___eventframe) then + self.___eventframe:UnregisterEvent(event) + end +end + +local innerOnUpdate = function(self, elapsed) + if self.elapsed and self.elapsed > (self.throttle) then + local obj = self.module + local core = obj.___core + local callbacks = self.callbacks + + for name, fn in pairs(callbacks) do + local _, error = pcall(fn, obj) + if(error and core.Debugging) then + print(error) + end + end + + self.elapsed = 0 + else + self.elapsed = (self.elapsed or 0) + elapsed + end +end + +local registerUpdate = function(self, updatefunc, throttle) + if not self.___updateframe then + self.___updateframe = CreateFrame("Frame", nil); + self.___updateframe.module = self; + self.___updateframe.callbacks = {}; + self.___updateframe.elapsed = 0; + self.___updateframe.throttle = throttle or 0.2; + end + + if(updatefunc and type(updatefunc) == "string" and self[updatefunc]) then + self.___updateframe.callbacks[updatefunc] = self[updatefunc] + end + + self.___updateframe:SetScript("OnUpdate", innerOnUpdate) +end + +local unregisterUpdate = function(self, updatefunc) + if(updatefunc and type(updatefunc) == "string" and self.___updateframe.callbacks[updatefunc]) then + self.___updateframe.callbacks[updatefunc] = nil + if(#self.___updateframe.callbacks == 0) then + self.___updateframe:SetScript("OnUpdate", nil) + end + else + self.___updateframe:SetScript("OnUpdate", nil) + end +end + +local add_OptionsIndex = function(self, index, data) + local addonName = self.___addonName + local schema = self.___schema + local core = self.___core + local header = GetAddOnMetadata(addonName, "X-SVUI-Header") + + core.Options.args.plugins.args.pluginOptions.args[schema].args[index] = data +end + +local function SetPluginString(addonName) + local pluginString = PLUGIN_LISTING or "" + local author = GetAddOnMetadata(addonName, "Author") or "Unknown" + local Pname = GetAddOnMetadata(addonName, "Title") or addonName + local version = GetAddOnMetadata(addonName, "Version") or "???" + pluginString = INFO_BY:format(pluginString, author) + pluginString = ("%s%s"):format(pluginString, Pname) + pluginString = INFO_VERSION:format(pluginString, "|cff00FF00", version) + pluginString = ("%s|r\n"):format(pluginString) + + PLUGIN_LISTING = pluginString +end + +local function SetInternalModule(obj, core, schema) + local addonmeta = {} + local oldmeta = getmetatable(obj) + if oldmeta then + for k, v in pairs(oldmeta) do addonmeta[k] = v end + end + addonmeta.__tostring = rootstring + setmetatable( obj, addonmeta ) + + local addonName = ("SVUI [%s]"):format(schema) + + obj.___addonName = addonName + obj.___schema = schema + obj.___core = core + + obj.initialized = false + obj.CombatLocked = false + obj.ChangeDBVar = changeDBVar + obj.RegisterEvent = registerEvent + obj.UnregisterEvent = unregisterEvent + obj.RegisterUpdate = registerUpdate + obj.UnregisterUpdate = unregisterUpdate + + return obj +end + +local function SetExternalModule(obj, core, schema, addonName, header, lod) + local addonmeta = {} + local oldmeta = getmetatable(obj) + if oldmeta then + for k, v in pairs(oldmeta) do addonmeta[k] = v end + end + addonmeta.__tostring = rootstring + setmetatable( obj, addonmeta ) + + obj.___addonName = addonName + obj.___schema = schema + obj.___header = header + obj.___core = core + obj.___lod = lod + + obj.initialized = false + obj.CombatLocked = false + obj.ChangeDBVar = changeDBVar + obj.RegisterEvent = registerEvent + obj.UnregisterEvent = unregisterEvent + obj.RegisterUpdate = registerUpdate + obj.UnregisterUpdate = unregisterUpdate + obj.AddOption = add_OptionsIndex + + if(lod) then + -- print("PLUGIN: " .. addonName) + core.Options.args.plugins.args.pluginOptions.args[schema] = { + type = "group", + name = header, + childGroups = "tree", + args = { + enable = { + order = 1, + type = "execute", + width = "full", + name = function() + local nameString = "Disable" + if(not IsAddOnLoaded(addonName)) then + nameString = "Enable" + end + return nameString + end, + func = function() + if(not IsAddOnLoaded(addonName)) then + local loaded, reason = LoadAddOn(addonName) + core:UpdateDatabase() + obj:ChangeDBVar(true, "enable") + else + obj:ChangeDBVar(false, "enable") + core:StaticPopup_Show("RL_CLIENT") + end + end, + } + } + } + else + core.Options.args.plugins.args.pluginOptions.args[schema] = { + type = "group", + name = header, + childGroups = "tree", + args = { + enable = { + order = 1, + type = "toggle", + name = "Enable", + get = function() return obj.db.enable end, + set = function(key, value) obj:ChangeDBVar(value, "enable") end, + } + } + } + end + + return obj +end + +local Registry_NewCallback = function(self, fn) + if(fn and type(fn) == "function") then + self.Callbacks[#self.Callbacks+1] = fn + end +end + +local Registry_NewScript = function(self, fn) + if(fn and type(fn) == "function") then + ScriptQueue[#ScriptQueue+1] = fn + end +end + +local Registry_NewPackage = function(self, obj, schema) + local core = self.___core + if(core[schema]) then return end + + ModuleQueue[#ModuleQueue+1] = schema + self.Modules[#self.Modules+1] = schema + + core[schema] = SetInternalModule(obj, core, schema) + + if(core.AddonLaunched) then + if(core[schema].Load) then + core[schema]:Load() + end + end +end + +local Registry_NewPlugin = function(self, obj) + local core = self.___core + local coreName = core.___addonName + local addonName = obj.___addonName + + if(addonName and addonName ~= coreName) then + local schema = GetAddOnMetadata(addonName, "X-SVUI-Schema"); + local header = GetAddOnMetadata(addonName, "X-SVUI-Header"); + local lod = IsAddOnLoadOnDemand(addonName) + if(not schema) then return end + + ModuleQueue[#ModuleQueue+1] = schema + self.Modules[#self.Modules+1] = schema + + SetPluginString(addonName) + + core[schema] = SetExternalModule(obj, core, schema, addonName, header, lod) + + if(core.AddonLaunched and core[schema].Load) then + core[schema]:Load() + --print(schema) + end + end +end + +local Registry_NewAddon = function(self, addonName, schema, header) + local core = self.___core + self.Addons[addonName] = schema; + + core.Options.args.plugins.args.pluginOptions.args[schema] = { + type = "group", + name = header, + childGroups = "tree", + args = { + enable = { + order = 1, + type = "execute", + width = "full", + name = function() + local nameString = "Disable" + if(not IsAddOnLoaded(addonName)) then + nameString = "Enable" + end + return nameString + end, + func = function() + if(not IsAddOnLoaded(addonName)) then + local loaded, reason = LoadAddOn(addonName) + core:UpdateDatabase() + core.db[schema].enable = true + self:LoadPackages() + else + core.db[schema].enable = false + core:StaticPopup_Show("RL_CLIENT") + end + end, + } + } + } +end + +local Registry_FetchAddons = function(self) + local addonCount = GetNumAddOns() + local core = self.___core + + for i = 1, addonCount do + local addonName, _, _, _, _, reason = GetAddOnInfo(i) + local lod = IsAddOnLoadOnDemand(i) + local header = GetAddOnMetadata(i, "X-SVUI-Header") + local schema = GetAddOnMetadata(i, "X-SVUI-Schema") + + if(lod and schema) then + self:NewAddon(addonName, schema, header) + end + end +end + +local Registry_RunCallbacks = function(self) + local callbacks = self.Callbacks + for i=1, #callbacks do + local fn = callbacks[i] + if(fn and type(fn) == "function") then + fn() + end + end +end + +local Registry_Update = function(self, name, dataOnly) + local core = self.___core + local obj = core[name] + if obj then + if core.db[name] then + obj.db = core.db[name] + end + if obj.ReLoad and not dataOnly then + obj:ReLoad() + end + end +end + +local Registry_UpdateAll = function(self) + local modules = self.Modules + local core = self.___core + for _,name in pairs(modules) do + local obj = core[name] + + if core.db[name] then + obj.db = core.db[name] + end + + if obj and obj.ReLoad then + obj:ReLoad() + end + end +end + +local Registry_LoadOnDemand = function(self) + local core = self.___core + local addons = self.Addons + for name,schema in pairs(addons) do + local config = core.db[schema] + if(config and (config.enable or config.enable ~= false)) then + if(not IsAddOnLoaded(name)) then + local loaded, reason = LoadAddOn(name) + end + EnableAddOn(name) + end + end +end + +local Registry_Load = function(self) + if not ModuleQueue then return end + local core = self.___core + + for i=1,#ModuleQueue do + local name = ModuleQueue[i] + local obj = core[name] + if obj and not obj.initialized then + if core.db[name] then + obj.db = core.db[name] + end + + if obj.Load then + local halt = false + if(obj.db.incompatible) then + for addon,_ in pairs(obj.db.incompatible) do + if IsAddOnLoaded(addon) then halt = true end + end + end + if(not halt) then + obj:Load() + obj.Load = nil + --print(name) + end + end + obj.initialized = true; + end + end + + twipe(ModuleQueue) + + if not ScriptQueue then return end + for i=1, #ScriptQueue do + local fn = ScriptQueue[i] + if(fn and type(fn) == "function") then + fn() + end + end + + ScriptQueue = nil +end +--[[ +##################################################################################### + /$$$$$$ /$$ /$$ /$$ /$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$$ + /$$__ $$| $$ | $$| $$ | $$|_ $$_/ /$$__ $$ /$$__ $$| $$__ $$| $$_____/ +| $$ \__/| $$ | $$| $$ | $$ | $$ | $$ \__/| $$ \ $$| $$ \ $$| $$ +| $$$$$$ | $$ / $$/| $$ | $$ | $$ | $$ | $$ | $$| $$$$$$$/| $$$$$ + \____ $$ \ $$ $$/ | $$ | $$ | $$ | $$ | $$ | $$| $$__ $$| $$__/ + /$$ \ $$ \ $$$/ | $$ | $$ | $$ | $$ $$| $$ | $$| $$ \ $$| $$ +| $$$$$$/ \ $/ | $$$$$$/ /$$$$$$ | $$$$$$/| $$$$$$/| $$ | $$| $$$$$$$$ + \______/ \_/ \______/ |______/ \______/ \______/ |__/ |__/|________/ +##################################################################################### +]]-- +local SVUI = { + ___addonName = SVUINameSpace, + ___version = GetAddOnMetadata(SVUINameSpace, "Version"), + ___interface = tonumber(uiVersion), + + db = {}, + Global = { Accountant = {}, profiles = {}, profileKeys = {} }, + Configs = {}, + Media = {}, + DisplayAudit = {}, + DynamicOptions = {}, + Dispellable = {}, + Snap = {}, + class = playerClass, + fubar = dumb, + ClassRole = "", + UnitRole = "NONE", + ConfigurationMode = false, + DebuggingMode = false, + SetLocaleStrings = Core_SetLocaleStrings, + Prototype = Core_Prototype, + AddonMessage = Core_AddonMessage, + Debugger = Core_Debugger, + StaticPopup_Show = Core_StaticPopup_Show, + ResetAllUI = Core_ResetAllUI, + ResetUI = Core_ResetUI, + ToggleConfig = Core_ToggleConfig, + TaintHandler = Core_TaintHandler, + Options = { + type = "group", + name = "|cff339fffConfig-O-Matic|r", + args = { + plugins = { + order = -2, + type = "group", + name = "Plugins", + childGroups = "tab", + args = { + pluginheader = { + order = 1, + type = "header", + name = "Supervillain Plugins", + }, + pluginOptions = { + order = 2, + type = "group", + name = "", + args = { + pluginlist = { + order = 1, + type = "group", + name = "Summary", + args = { + active = { + order = 1, + type = "description", + name = function() return PLUGIN_LISTING end + } + } + }, + } + } + } + } + } + } +} + +SaveMetaMethods(SVUI) + +--[[ UTILITY FRAMES ]]-- + +SVUI.UIParent = CreateFrame("Frame", "SVUIParent", UIParent); +SVUI.UIParent:SetFrameLevel(UIParent:GetFrameLevel()); +SVUI.UIParent:SetPoint("CENTER", UIParent, "CENTER"); +SVUI.UIParent:SetSize(UIParent:GetSize()); +SVUI.Snap[1] = SVUI.UIParent; + +SVUI.Cloaked = CreateFrame("Frame", nil, UIParent); +SVUI.Cloaked:Hide(); + +local Registry = { + ___core = SVUI, + Modules = {}, + Addons = {}, + Callbacks = {}, + INFO_VERSION = INFO_VERSION, + INFO_NEW = INFO_NEW, + INFO_NAME = INFO_NAME, + INFO_HEADER = INFO_HEADER, + NewCallback = Registry_NewCallback, + NewScript = Registry_NewScript, + NewPackage = Registry_NewPackage, + NewPlugin = Registry_NewPlugin, + NewAddon = Registry_NewAddon, + FindAddons = Registry_FetchAddons, + LoadRegisteredAddons = Registry_LoadOnDemand, + RunCallbacks = Registry_RunCallbacks, + Update = Registry_Update, + UpdateAll = Registry_UpdateAll, + LoadPackages = Registry_Load, +} + +SaveMetaMethods(Registry) + +--[[ COMMON FUNCTIONS ]]-- + +SVUICore[1] = SVUI +SVUICore[2] = Localization +SVUICore[3] = Registry + +--[[ SET MASTER GLOBAL ]]-- + +_G[SVUINameSpace] = SVUICore; \ No newline at end of file diff --git a/Interface/AddOns/SVUI/SVUI.xml b/Interface/AddOns/SVUI/SVUI.xml index b5ad17a..29d264d 100644 --- a/Interface/AddOns/SVUI/SVUI.xml +++ b/Interface/AddOns/SVUI/SVUI.xml @@ -1,5 +1,7 @@  +