--[[ ############################################################################## _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_ # ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__ # __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____ # ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____ # ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____ # _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ # __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ # _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_# ___\///////////___________\///___________\/////////_____\///////////_# ############################################################################## S U P E R - V I L L A I N - U I By: Munglunch # ############################################################################## ########################################################## LOCALIZED LUA FUNCTIONS ########################################################## ]]-- --[[ GLOBALS ]]-- local _G = _G; local unpack = _G.unpack; local select = _G.select; local pairs = _G.pairs; local type = _G.type; local tinsert = _G.tinsert; local string = _G.string; local math = _G.math; local table = _G.table; --[[ STRING METHODS ]]-- local format,find = string.format, string.find; --[[ MATH METHODS ]]-- local floor = math.floor; --[[ TABLE METHODS ]]-- local twipe, tcopy = table.wipe, table.copy; --[[ ########################################################## GET ADDON DATA ########################################################## ]]-- local SVUIAddOnName, PLUGIN = ...; local SuperVillain, L = unpack(SVUI); local CONFIGS = SuperVillain.Configs local NewHook = hooksecurefunc; local SVUIAddonEventHandler = CreateFrame("Frame", nil) local version = GetAddOnMetadata(..., "Version"); PLUGIN = SuperVillain:Prototype(SVUIAddOnName, version) _G["StyleVillain"] = PLUGIN; --[[ ########################################################## CORE DATA ########################################################## ]]-- PLUGIN.DockedParent = {} PLUGIN.AddOnQueue = {}; PLUGIN.AddOnEvents = {}; PLUGIN.CustomQueue = {}; PLUGIN.EventListeners = {}; PLUGIN.OnLoadAddons = {}; PLUGIN.StyledAddons = {}; PLUGIN.OptionsCache = { order = 4, type = "group", name = "Addon Styling", get = function(a)return SuperVillain.db.SVStyle.addons[a[#a]] end, set = function(a,b)SuperVillain.db.SVStyle.addons[a[#a]] = b;SuperVillain:StaticPopup_Show("RL_CLIENT")end, disabled = function()return not SuperVillain.db.SVStyle.addons.enable end, guiInline = true, args = { ace3 = { type = "toggle", order = 1, name = "Ace3" }, } } --[[ ########################################################## CORE FUNCTIONS ########################################################## ]]-- local charming = {"Spiffy", "Pimped Out", "Fancy", "Awesome", "Bad Ass", "Sparkly", "Gorgeous", "Handsome", "Shiny"} local errorMessage = '%s: |cffff0000There was an error in the|r |cff0affff%s|r |cffff0000skin|r. |cffFF0000[[|r%s|cffFF0000]]|r' local styleMessage = '|cff00FF77%s|r Is Now %s!' local function SendAddonMessage(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 function PLUGIN:AddonMessage(msg) local outbound = ("|cffFF2F00%s:|r"):format("Style-O-Matic") SendAddonMessage(msg, outbound) end function PLUGIN:LoadAlert(MainText, Function) self.Alert.Text:SetText(MainText) self.Alert.Accept:SetScript('OnClick', Function) self.Alert:Show() end function PLUGIN:Style(style, fn, ...) -- self.Debugging = false local pass, error = pcall(fn, ...) if(pass and (not style:find("Blizzard")) and not self.StyledAddons[style]) then self.StyledAddons[style] = true local verb = charming[math.random(1,#charming)] self:AddonMessage(styleMessage:format(style, verb)) else SuperVillain:Debugger(errorMessage:format(version, style, error)) end end function PLUGIN:IsAddonReady(addon, ...) for i = 1, select('#', ...) do local a = select(i, ...) if not a then break end if not IsAddOnLoaded(a) then return false end end local config = SuperVillain.db.SVStyle or SuperVillain.Configs.SVStyle return config.addons[addon] end function PLUGIN:SaveAddonStyle(addon, fn, force, passive, ...) self:DefineEventFunction("PLAYER_ENTERING_WORLD", addon) if(passive) then self:DefineEventFunction("ADDON_LOADED", addon) end for i=1, select("#",...) do local event = select(i,...) if(event) then self:DefineEventFunction(event, addon) end end if(SuperVillain.Configs.SVStyle.addons[addon] == nil) then SuperVillain.Configs.SVStyle.addons[addon] = true end if force then fn() else self.AddOnQueue[addon] = fn end end function PLUGIN:SaveBlizzardStyle(addon, fn, force) if force then if(not IsAddOnLoaded(addon)) then LoadAddOn(addon) end fn() else self.OnLoadAddons[addon] = fn end end function PLUGIN:SaveCustomStyle(fn) tinsert(PLUGIN.CustomQueue, fn) end function PLUGIN:DefineEventFunction(addonEvent, addon) if(not addon) then return end if(not self.EventListeners[addonEvent]) then self.EventListeners[addonEvent] = {} end self.EventListeners[addonEvent][addon] = true if(not self[addonEvent]) then self[addonEvent] = function(self, event, ...) for name,fn in pairs(self.AddOnQueue)do if self:IsAddonReady(name) and self.EventListeners[event] and self.EventListeners[event][name] then self:Style(name, fn, event, ...) end end end SVUIAddonEventHandler:RegisterEvent(addonEvent); end end function PLUGIN:SafeEventRemoval(addon, event) if not self.EventListeners[event] then return end if not self.EventListeners[event][addon] then return end self.EventListeners[event][addon] = nil; local defined = false; for name,_ in pairs(self.EventListeners[event]) do if name then defined = true; break end end if not defined then SVUIAddonEventHandler:UnregisterEvent(event) end end function PLUGIN:RefreshAddonStyles() for addon,fn in pairs(self.AddOnQueue) do if(self:IsAddonReady(addon)) then self:Style(addon, fn) end end end function PLUGIN:ToggleStyle(addon, value) SuperVillain.db.SVStyle.addons[addon] = value end function PLUGIN:StyleInit(event, ...) for addon,fn in pairs(self.AddOnQueue)do self:AppendAddonOption(addon) if(SuperVillain.db.SVStyle.addons[addon] == nil) then SuperVillain.db.SVStyle.addons[addon] = true end end for addon,fn in pairs(self.OnLoadAddons) do if(SuperVillain.db.SVStyle.blizzard[addon] == nil) then SuperVillain.db.SVStyle.blizzard[addon] = true end if(IsAddOnLoaded(addon) and (SuperVillain.db.SVStyle.blizzard[addon] or SuperVillain.db.SVStyle.addons[addon])) then self:Style(addon, fn, event, ...) self.OnLoadAddons[addon] = nil end end for _,fn in pairs(self.CustomQueue)do fn(event) end twipe(self.CustomQueue) collectgarbage("collect") end function PLUGIN:StyleOnDemand(event, addon) for name, fn in pairs(self.OnLoadAddons) do if(addon:find(name)) then self:Style(name, fn, event, addon) end end end --[[ ########################################################## OPTIONS CREATION ########################################################## ]]-- function PLUGIN:AppendAddonOption(addon) PLUGIN.OptionsCache.args[addon] = { type = "toggle", name = addon, desc = L["Addon Styling"], get=function(a)return PLUGIN:IsAddonReady(a[#a])end, set=function(a,b)SuperVillain.db.SVStyle.addons[a[#a]] = b;SuperVillain:StaticPopup_Show("RL_CLIENT")end, disabled = function() if addon then return not IsAddOnLoaded(addon) else return false end end } end local RegisterAddonDocklets = function() local MAIN = _G["SuperDockletMain"]; local EXTRA = _G["SuperDockletExtra"]; local main = SuperVillain.db.SVDock.docklets.DockletMain; local alternate = SuperVillain.db.SVDock.docklets.enableExtra and SuperVillain.db.SVDock.docklets.DockletExtra or ""; local tipLeft, tipRight = "", ""; if main == nil or main == "None" then return end if find(main, "Skada") or find(alternate, "Skada") then if SuperVillain:IsDockletReady("Skada") then PLUGIN:Docklet_Skada() if find(alternate, "Skada") and EXTRA.FrameName ~= "SkadaHolder2" then tipRight = "and Skada"; SuperVillain:RegisterExtraDocklet("SkadaHolder2") --PLUGIN.DockedParent["Skada"] = EXTRA end if find(main, "Skada") and MAIN.FrameName ~= "SkadaHolder" then tipLeft = "Skada"; SuperVillain:RegisterMainDocklet("SkadaHolder") --PLUGIN.DockedParent["Skada"] = MAIN end end end if main == "Omen" or alternate == "Omen" then if SuperVillain:IsDockletReady("Omen") then if alternate == "Omen" and EXTRA.FrameName ~= "OmenAnchor" then tipRight = "and Omen"; SuperVillain:RegisterExtraDocklet("OmenAnchor") PLUGIN:Docklet_Omen(EXTRA) PLUGIN.DockedParent["Omen"] = EXTRA elseif MAIN.FrameName ~= "OmenAnchor" then tipLeft = "Omen"; SuperVillain:RegisterMainDocklet("OmenAnchor") PLUGIN:Docklet_Omen(MAIN) PLUGIN.DockedParent["Omen"] = MAIN end end end if main == "Recount" or alternate == "Recount" then if SuperVillain:IsDockletReady("Recount") then if alternate == "Recount" and EXTRA.FrameName ~= "Recount_MainWindow" then tipRight = "and Recount"; SuperVillain:RegisterExtraDocklet("Recount_MainWindow") PLUGIN:Docklet_Recount(EXTRA) PLUGIN.DockedParent["Recount"] = EXTRA elseif MAIN.FrameName ~= "Recount_MainWindow" then tipLeft = "Recount"; SuperVillain:RegisterMainDocklet("Recount_MainWindow") PLUGIN:Docklet_Recount(MAIN) PLUGIN.DockedParent["Recount"] = MAIN end end end if main == "TinyDPS" or alternate == "TinyDPS" then if SuperVillain:IsDockletReady("TinyDPS") then if alternate == "TinyDPS" and EXTRA.FrameName ~= "tdpsFrame" then tipRight = "and TinyDPS"; SuperVillain:RegisterExtraDocklet("tdpsFrame") PLUGIN:Docklet_TinyDPS(EXTRA) PLUGIN.DockedParent["TinyDPS"] = EXTRA elseif MAIN.FrameName ~= "tdpsFrame" then tipLeft = "TinyDPS"; SuperVillain:RegisterMainDocklet("tdpsFrame") PLUGIN:Docklet_TinyDPS(MAIN) PLUGIN.DockedParent["TinyDPS"] = MAIN end end end if main == "alDamageMeter" or alternate == "alDamageMeter" then if SuperVillain:IsDockletReady("alDamageMeter") then if alternate == "alDamageMeter" and EXTRA.FrameName ~= "alDamagerMeterFrame" then tipRight = "and alDamageMeter"; SuperVillain:RegisterExtraDocklet("alDamagerMeterFrame") PLUGIN:Docklet_alDamageMeter(EXTRA) PLUGIN.DockedParent["alDamageMeter"] = EXTRA elseif MAIN.FrameName ~= "alDamagerMeterFrame" then tipLeft = "alDamageMeter"; SuperVillain:RegisterMainDocklet("alDamagerMeterFrame") PLUGIN:Docklet_alDamageMeter(MAIN) PLUGIN.DockedParent["alDamageMeter"] = MAIN end end end if(_G["SVUI_AddonDocklet"]) then _G["SVUI_AddonDocklet"].TText = ("%s%s"):format(tipLeft, tipRight) end end --[[ ########################################################## BUILD FUNCTION ########################################################## ]]-- local Registry_OnEvent = function(self, event, ...) if(event == "PLAYER_ENTERING_WORLD") then PLUGIN:StyleInit(event, ...) elseif(event == "ADDON_LOADED") then PLUGIN:StyleOnDemand(event, ...) end if(PLUGIN[event]) then PLUGIN[event](PLUGIN, event, ...) end end local function LoadOptions() SuperVillain.Options.args.plugins.args.pluginOptions.args.SVStyle={ type = "group", name = L["Style O Matic"], childGroups = "tree", args = { intro = { order = 1, type = "description", name = L["ART_DESC"] }, blizzardEnable = { order = 2, type = "toggle", name = "Standard UI Styling", get = function(a)return SuperVillain.db.SVStyle.blizzard.enable end, set = function(a,b)SuperVillain.db.SVStyle.blizzard.enable = b;SuperVillain:StaticPopup_Show("RL_CLIENT")end }, addonEnable = { order = 3, type = "toggle", name = "Addon Styling", get = function(a)return SuperVillain.db.SVStyle.addons.enable end, set = function(a,b)SuperVillain.db.SVStyle.addons.enable = b;SuperVillain:StaticPopup_Show("RL_CLIENT")end }, blizzard = { order = 300, type = "group", name = "Individual Mods", get = function(a)return SuperVillain.db.SVStyle.blizzard[a[#a]]end, set = function(a,b)SuperVillain.db.SVStyle.blizzard[a[#a]] = b;SuperVillain:StaticPopup_Show("RL_CLIENT")end, disabled = function()return not SuperVillain.db.SVStyle.blizzard.enable end, guiInline = true, args = { bmah = { type = "toggle", name = L["Black Market AH"], desc = L["TOGGLEART_DESC"] }, transmogrify = { type = "toggle", name = L["Transmogrify Frame"], desc = L["TOGGLEART_DESC"] }, encounterjournal = { type = "toggle", name = L["Encounter Journal"], desc = L["TOGGLEART_DESC"] }, reforge = { type = "toggle", name = L["Reforge Frame"], desc = L["TOGGLEART_DESC"] }, calendar = { type = "toggle", name = L["Calendar Frame"], desc = L["TOGGLEART_DESC"] }, achievement = { type = "toggle", name = L["Achievement Frame"], desc = L["TOGGLEART_DESC"] }, lfguild = { type = "toggle", name = L["LF Guild Frame"], desc = L["TOGGLEART_DESC"] }, inspect = { type = "toggle", name = L["Inspect Frame"], desc = L["TOGGLEART_DESC"] }, binding = { type = "toggle", name = L["KeyBinding Frame"], desc = L["TOGGLEART_DESC"] }, gbank = { type = "toggle", name = L["Guild Bank"], desc = L["TOGGLEART_DESC"] }, archaeology = { type = "toggle", name = L["Archaeology Frame"], desc = L["TOGGLEART_DESC"] }, guildcontrol = { type = "toggle", name = L["Guild Control Frame"], desc = L["TOGGLEART_DESC"] }, guild = { type = "toggle", name = L["Guild Frame"], desc = L["TOGGLEART_DESC"] }, tradeskill = { type = "toggle", name = L["TradeSkill Frame"], desc = L["TOGGLEART_DESC"] }, raid = { type = "toggle", name = L["Raid Frame"], desc = L["TOGGLEART_DESC"] }, talent = { type = "toggle", name = L["Talent Frame"], desc = L["TOGGLEART_DESC"] }, auctionhouse = { type = "toggle", name = L["Auction Frame"], desc = L["TOGGLEART_DESC"] }, timemanager = { type = "toggle", name = L["Time Manager"], desc = L["TOGGLEART_DESC"] }, barber = { type = "toggle", name = L["Barbershop Frame"], desc = L["TOGGLEART_DESC"] }, macro = { type = "toggle", name = L["Macro Frame"], desc = L["TOGGLEART_DESC"] }, debug = { type = "toggle", name = L["Debug Tools"], desc = L["TOGGLEART_DESC"] }, trainer = { type = "toggle", name = L["Trainer Frame"], desc = L["TOGGLEART_DESC"] }, socket = { type = "toggle", name = L["Socket Frame"], desc = L["TOGGLEART_DESC"] }, alertframes = { type = "toggle", name = L["Alert Frames"], desc = L["TOGGLEART_DESC"] }, loot = { type = "toggle", name = L["Loot Frames"], desc = L["TOGGLEART_DESC"] }, bgscore = { type = "toggle", name = L["BG Score"], desc = L["TOGGLEART_DESC"] }, merchant = { type = "toggle", name = L["Merchant Frame"], desc = L["TOGGLEART_DESC"] }, mail = { type = "toggle", name = L["Mail Frame"], desc = L["TOGGLEART_DESC"] }, help = { type = "toggle", name = L["Help Frame"], desc = L["TOGGLEART_DESC"] }, trade = { type = "toggle", name = L["Trade Frame"], desc = L["TOGGLEART_DESC"] }, gossip = { type = "toggle", name = L["Gossip Frame"], desc = L["TOGGLEART_DESC"] }, greeting = { type = "toggle", name = L["Greeting Frame"], desc = L["TOGGLEART_DESC"] }, worldmap = { type = "toggle", name = L["World Map"], desc = L["TOGGLEART_DESC"] }, taxi = { type = "toggle", name = L["Taxi Frame"], desc = L["TOGGLEART_DESC"] }, lfg = { type = "toggle", name = L["LFG Frame"], desc = L["TOGGLEART_DESC"] }, mounts = { type = "toggle", name = L["Mounts & Pets"], desc = L["TOGGLEART_DESC"] }, quest = { type = "toggle", name = L["Quest Frames"], desc = L["TOGGLEART_DESC"] }, petition = { type = "toggle", name = L["Petition Frame"], desc = L["TOGGLEART_DESC"] }, dressingroom = { type = "toggle", name = L["Dressing Room"], desc = L["TOGGLEART_DESC"] }, pvp = { type = "toggle", name = L["PvP Frames"], desc = L["TOGGLEART_DESC"] }, nonraid = { type = "toggle", name = L["Non-Raid Frame"], desc = L["TOGGLEART_DESC"] }, friends = { type = "toggle", name = L["Friends"], desc = L["TOGGLEART_DESC"] }, spellbook = { type = "toggle", name = L["Spellbook"], desc = L["TOGGLEART_DESC"] }, character = { type = "toggle", name = L["Character Frame"], desc = L["TOGGLEART_DESC"] }, misc = { type = "toggle", name = L["Misc Frames"], desc = L["TOGGLEART_DESC"] }, tabard = { type = "toggle", name = L["Tabard Frame"], desc = L["TOGGLEART_DESC"] }, guildregistrar = { type = "toggle", name = L["Guild Registrar"], desc = L["TOGGLEART_DESC"] }, bags = { type = "toggle", name = L["Bags"], desc = L["TOGGLEART_DESC"] }, stable = { type = "toggle", name = L["Stable"], desc = L["TOGGLEART_DESC"] }, bgmap = { type = "toggle", name = L["BG Map"], desc = L["TOGGLEART_DESC"] }, petbattleui = { type = "toggle", name = L["Pet Battle"], desc = L["TOGGLEART_DESC"] }, losscontrol = { type = "toggle", name = L["Loss Control"], desc = L["TOGGLEART_DESC"] }, voidstorage = { type = "toggle", name = L["Void Storage"], desc = L["TOGGLEART_DESC"] }, itemUpgrade = { type = "toggle", name = L["Item Upgrade"], desc = L["TOGGLEART_DESC"] } } }, addons = PLUGIN.OptionsCache } } end local function LoadStyleOMatic() PLUGIN.db = SuperVillain.db.SVStyle local alert = CreateFrame('Frame', nil, UIParent); alert:SetFixedPanelTemplate('Transparent'); alert:SetSize(250, 70); alert:SetPoint('CENTER', UIParent, 'CENTER'); alert:SetFrameStrata('DIALOG'); alert.Text = alert:CreateFontString(nil, "OVERLAY"); alert.Text:SetFont(SuperVillain.Media.font.default, 12); alert.Text:SetPoint('TOP', alert, 'TOP', 0, -10); alert.Accept = CreateFrame('Button', nil, alert); alert.Accept:SetSize(70, 25); alert.Accept:SetPoint('RIGHT', alert, 'BOTTOM', -10, 20); alert.Accept.Text = alert.Accept:CreateFontString(nil, "OVERLAY"); alert.Accept.Text:SetFont(SuperVillain.Media.font.default, 10); alert.Accept.Text:SetPoint('CENTER'); alert.Accept.Text:SetText(YES); alert.Close = CreateFrame('Button', nil, alert); alert.Close:SetSize(70, 25); alert.Close:SetPoint('LEFT', alert, 'BOTTOM', 10, 20); alert.Close:SetScript('OnClick', function(self) self:GetParent():Hide() end); alert.Close.Text = alert.Close:CreateFontString(nil, "OVERLAY"); alert.Close.Text:SetFont(SuperVillain.Media.font.default, 10); alert.Close.Text:SetPoint('CENTER'); alert.Close.Text:SetText(NO); alert.Accept:SetButtonTemplate(); alert.Close:SetButtonTemplate(); alert:Hide(); PLUGIN.Alert = alert; NewHook(SuperVillain, "ReloadDocklets", RegisterAddonDocklets); SuperVillain:ReloadDocklets(); SuperVillain.DynamicOptions["SVStyle"] = {key = "addons", data = PLUGIN.OptionsCache}; SVUIAddonEventHandler:RegisterEvent("ADDON_LOADED", "StyleOnDemand"); SVUIAddonEventHandler:RegisterEvent("PLAYER_ENTERING_WORLD", "StyleInit"); end CONFIGS["SVStyle"] = { ["blizzard"] = { ["enable"] = true, ["bags"] = true, ["bmah"] = true, ["reforge"] = true, ["calendar"] = true, ["achievement"] = true, ["lfguild"] = true, ["inspect"] = true, ["binding"] = true, ["gbank"] = true, ["archaeology"] = true, ["guildcontrol"] = true, ["gossip"] = true, ["guild"] = true, ["tradeskill"] = true, ["raid"] = false, ["talent"] = true, ["auctionhouse"] = true, ["barber"] = true, ["macro"] = true, ["debug"] = true, ["trainer"] = true, ["socket"] = true, ["loot"] = true, ["alertframes"] = true, ["bgscore"] = true, ["merchant"] = true, ["mail"] = true, ["help"] = true, ["trade"] = true, ["gossip"] = true, ["greeting"] = true, ["worldmap"] = true, ["taxi"] = true, ["quest"] = true, ["petition"] = true, ["dressingroom"] = true, ["pvp"] = true, ["lfg"] = true, ["nonraid"] = true, ["friends"] = true, ["spellbook"] = true, ["character"] = true, ["misc"] = true, ["tabard"] = true, ["guildregistrar"] = true, ["timemanager"] = true, ["encounterjournal"] = true, ["voidstorage"] = true, ["transmogrify"] = true, ["stable"] = true, ["bgmap"] = true, ["mounts"] = true, ["petbattleui"] = true, ["losscontrol"] = true, ["itemUpgrade"] = true, }, ["addons"] = { ["enable"] = true, ["Skada"] = true, ["Recount"] = true, ["AuctionLite"] = true, ["AtlasLoot"] = true, ["SexyCooldown"] = true, ["Lightheaded"] = true, ["Outfitter"] = true, ["WeakAuras"] = true, ["Quartz"] = true, ["TomTom"] = true, ["TinyDPS"] = true, ["Clique"] = true, ["CoolLine"] = true, ["ACP"] = true, ["DXE"] = true, ["DBM-Core"] = true, ["VEM"] = true, ["MogIt"] = true, ["alDamageMeter"] = true, ["Omen"] = true, ["TradeSkillDW"] = true, } } SuperVillain.Registry:NewScript(LoadStyleOMatic) SuperVillain.Registry:NewPlugin(PLUGIN, "SVStyle", LoadOptions) SVUIAddonEventHandler:SetScript("OnEvent", Registry_OnEvent)