diff --git a/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua new file mode 100644 index 0000000..b489e9b --- /dev/null +++ b/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua @@ -0,0 +1,237 @@ +--[[ $Id: CallbackHandler-1.0.lua 18 2014-10-16 02:52:20Z mikk $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 6 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local tconcat = table.concat +local assert, error, loadstring = assert, error, loadstring +local setmetatable, rawset, rawget = setmetatable, rawset, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + +-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded +-- List them here for Mikk's FindGlobals script +-- GLOBALS: geterrorhandler + +local xpcall = xpcall + +local function errorhandler(err) + return geterrorhandler()(err) +end + +local function CreateDispatcher(argCount) + local code = [[ + local next, xpcall, eh = ... + + local method, ARGS + local function call() method(ARGS) end + + local function dispatch(handlers, ...) + local index + index, method = next(handlers) + if not method then return end + local OLD_ARGS = ARGS + ARGS = ... + repeat + xpcall(call, eh) + index, method = next(handlers, index) + until not method + ARGS = OLD_ARGS + end + + return dispatch + ]] + + local ARGS, OLD_ARGS = {}, {} + for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end + code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", ")) + return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler) +end + +local Dispatchers = setmetatable({}, {__index=function(self, argCount) + local dispatcher = CreateDispatcher(argCount) + rawset(self, argCount, dispatcher) + return dispatcher +end}) + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName) + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for eventname,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for self,func in pairs(callbacks) do + events[eventname][self] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, eventname) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" or self=thread + if type(self)~="table" and type(self)~="string" and type(self)~="thread" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. diff --git a/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc b/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc new file mode 100644 index 0000000..dce3abe --- /dev/null +++ b/SVUI_!Core/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc @@ -0,0 +1,14 @@ +## Interface: 60000 +## LoadOnDemand: 1 +## Title: Lib: CallbackHandler-1.0 +## Notes: Callback handling Library, normally embedded inside other libraries +## Author: Ace3 Development Team +## X-Website: http://www.wowace.com/projects/callbackhandler/ +## X-Category: Library +## X-License: BSD-2.0 +## X-Curse-Packaged-Version: 1.0.6.60000 +## X-Curse-Project-Name: CallbackHandler-1.0 +## X-Curse-Project-ID: callbackhandler +## X-Curse-Repository-ID: wow/callbackhandler/mainline + +CallbackHandler-1.0.lua diff --git a/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua new file mode 100644 index 0000000..f98cecd --- /dev/null +++ b/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua @@ -0,0 +1,292 @@ +--[[ +Name: LibSharedMedia-3.0 +Revision: $Revision: 91 $ +Author: Elkano (elkano@gmx.de) +Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com) +Website: http://www.wowace.com/projects/libsharedmedia-3-0/ +Description: Shared handling of media data (fonts, sounds, textures, ...) between addons. +Dependencies: LibStub, CallbackHandler-1.0 +License: LGPL v2.1 +]] + +local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes +local lib = LibStub:NewLibrary(MAJOR, MINOR) + +if not lib then return end + +local _G = getfenv(0) + +local pairs = _G.pairs +local type = _G.type + +local band = _G.bit.band + +local table_insert = _G.table.insert +local table_sort = _G.table.sort + +local locale = GetLocale() +local locale_is_western +local LOCALE_MASK = 0 +lib.LOCALE_BIT_koKR = 1 +lib.LOCALE_BIT_ruRU = 2 +lib.LOCALE_BIT_zhCN = 4 +lib.LOCALE_BIT_zhTW = 8 +lib.LOCALE_BIT_western = 128 + +local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") + +lib.callbacks = lib.callbacks or CallbackHandler:New(lib) + +lib.DefaultMedia = lib.DefaultMedia or {} +lib.MediaList = lib.MediaList or {} +lib.MediaTable = lib.MediaTable or {} +lib.MediaType = lib.MediaType or {} +lib.OverrideMedia = lib.OverrideMedia or {} + +local defaultMedia = lib.DefaultMedia +local mediaList = lib.MediaList +local mediaTable = lib.MediaTable +local overrideMedia = lib.OverrideMedia + + +-- create mediatype constants +lib.MediaType.BACKGROUND = "background" -- background textures +lib.MediaType.BORDER = "border" -- border textures +lib.MediaType.FONT = "font" -- fonts +lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures +lib.MediaType.SOUND = "sound" -- sound files + +-- populate lib with default Blizzard data +-- BACKGROUND +if not lib.MediaTable.background then lib.MediaTable.background = {} end +lib.MediaTable.background["None"] = [[]] +lib.MediaTable.background["Blizzard Collections Background"] = [[Interface\Collections\CollectionsBackgroundTile]] +lib.MediaTable.background["Blizzard Dialog Background"] = [[Interface\DialogFrame\UI-DialogBox-Background]] +lib.MediaTable.background["Blizzard Dialog Background Dark"] = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]] +lib.MediaTable.background["Blizzard Dialog Background Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]] +lib.MediaTable.background["Blizzard Garrison Background"] = [[Interface\Garrison\GarrisonUIBackground]] +lib.MediaTable.background["Blizzard Garrison Background 2"] = [[Interface\Garrison\GarrisonUIBackground2]] +lib.MediaTable.background["Blizzard Garrison Background 3"] = [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]] +lib.MediaTable.background["Blizzard Low Health"] = [[Interface\FullScreenTextures\LowHealth]] +lib.MediaTable.background["Blizzard Marble"] = [[Interface\FrameGeneral\UI-Background-Marble]] +lib.MediaTable.background["Blizzard Out of Control"] = [[Interface\FullScreenTextures\OutOfControl]] +lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Rock"] = [[Interface\FrameGeneral\UI-Background-Rock]] +lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]] +lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]] +lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]] +lib.DefaultMedia.background = "None" + +-- BORDER +if not lib.MediaTable.border then lib.MediaTable.border = {} end +lib.MediaTable.border["None"] = [[]] +lib.MediaTable.border["Blizzard Achievement Wood"] = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]] +lib.MediaTable.border["Blizzard Chat Bubble"] = [[Interface\Tooltips\ChatBubble-Backdrop]] +lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]] +lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]] +lib.MediaTable.border["Blizzard Party"] = [[Interface\CHARACTERFRAME\UI-Party-Border]] +lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]] +lib.DefaultMedia.border = "None" + +-- FONT +if not lib.MediaTable.font then lib.MediaTable.font = {} end +local SML_MT_font = lib.MediaTable.font +--[[ +All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4 +Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/) +latin means check for: de, en, es, fr, it, pt + +file name latin koKR ruRU zhCN zhTW +2002.ttf 2002 X X X - - +2002B.ttf 2002 Bold X X X - - +ARHei.ttf AR CrystalzcuheiGBK Demibold X - X X X +ARIALN.TTF Arial Narrow X - X - - +ARKai_C.ttf AR ZhongkaiGBK Medium (Combat) X - X X X +ARKai_T.ttf AR ZhongkaiGBK Medium X - X X X +bHEI00M.ttf AR Heiti2 Medium B5 - - - - X +bHEI01B.ttf AR Heiti2 Bold B5 - - - - X +bKAI00M.ttf AR Kaiti Medium B5 - - - - X +bLEI00D.ttf AR Leisu Demi B5 - - - - X +FRIZQT__.TTF Friz Quadrata TT X - - - - +FRIZQT___CYR.TTF FrizQuadrataCTT x - X - - +K_Damage.TTF YDIWingsM - X X - - +K_Pagetext.TTF MoK X X X - - +MORPHEUS.TTF Morpheus X - - - - +MORPHEUS_CYR.TTF Morpheus X - X - - +NIM_____.ttf Nimrod MT X - X - - +SKURRI.TTF Skurri X - - - - +SKURRI_CYR.TTF Skurri X - X - - + +WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö +Due to this, we cannot use it as a replacement for FRIZQT__.TTF +]] + +if locale == "koKR" then + LOCALE_MASK = lib.LOCALE_BIT_koKR +-- + SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]] + SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]] + SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]] + SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]] +-- + lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed +-- +elseif locale == "zhCN" then + LOCALE_MASK = lib.LOCALE_BIT_zhCN +-- + SML_MT_font["伤害数字"] = [[Fonts\ARKai_C.ttf]] + SML_MT_font["默认"] = [[Fonts\ARKai_T.ttf]] + SML_MT_font["聊天"] = [[Fonts\ARHei.ttf]] +-- + lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed +-- +elseif locale == "zhTW" then + LOCALE_MASK = lib.LOCALE_BIT_zhTW +-- + SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]] + SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]] + SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]] + SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]] +-- + lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed + +elseif locale == "ruRU" then + LOCALE_MASK = lib.LOCALE_BIT_ruRU +-- + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT___CYR.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] +-- + lib.DefaultMedia.font = "Friz Quadrata TT" +-- +else + LOCALE_MASK = lib.LOCALE_BIT_western + locale_is_western = true +-- + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] +-- + lib.DefaultMedia.font = "Friz Quadrata TT" +-- +end + +-- STATUSBAR +if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end +lib.MediaTable.statusbar["Blizzard"] = [[Interface\TargetingFrame\UI-StatusBar]] +lib.MediaTable.statusbar["Blizzard Character Skills Bar"] = [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]] +lib.MediaTable.statusbar["Blizzard Raid Bar"] = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]] +lib.DefaultMedia.statusbar = "Blizzard" + +-- SOUND +if not lib.MediaTable.sound then lib.MediaTable.sound = {} end +lib.MediaTable.sound["None"] = [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input. +lib.DefaultMedia.sound = "None" + +local function rebuildMediaList(mediatype) + local mtable = mediaTable[mediatype] + if not mtable then return end + if not mediaList[mediatype] then mediaList[mediatype] = {} end + local mlist = mediaList[mediatype] + -- list can only get larger, so simply overwrite it + local i = 0 + for k in pairs(mtable) do + i = i + 1 + mlist[i] = k + end + table_sort(mlist) +end + +function lib:Register(mediatype, key, data, langmask) + if type(mediatype) ~= "string" then + error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype)) + end + if type(key) ~= "string" then + error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key)) + end + mediatype = mediatype:lower() + if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end + if mediatype == lib.MediaType.SOUND and type(data) == "string" then + local path = data:lower() + -- Only ogg and mp3 are valid sounds. + if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then + return false + end + end + if not mediaTable[mediatype] then mediaTable[mediatype] = {} end + local mtable = mediaTable[mediatype] + if mtable[key] then return false end + + mtable[key] = data + rebuildMediaList(mediatype) + self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key) + return true +end + +function lib:Fetch(mediatype, key, noDefault) + local mtt = mediaTable[mediatype] + local overridekey = overrideMedia[mediatype] + local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil + return result ~= "" and result or nil +end + +function lib:IsValid(mediatype, key) + return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false +end + +function lib:HashTable(mediatype) + return mediaTable[mediatype] +end + +function lib:List(mediatype) + if not mediaTable[mediatype] then + return nil + end + if not mediaList[mediatype] then + rebuildMediaList(mediatype) + end + return mediaList[mediatype] +end + +function lib:GetGlobal(mediatype) + return overrideMedia[mediatype] +end + +function lib:SetGlobal(mediatype, key) + if not mediaTable[mediatype] then + return false + end + overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil + self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype]) + return true +end + +function lib:GetDefault(mediatype) + return defaultMedia[mediatype] +end + +function lib:SetDefault(mediatype, key) + if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then + defaultMedia[mediatype] = key + return true + else + return false + end +end diff --git a/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc b/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc new file mode 100644 index 0000000..666cf15 --- /dev/null +++ b/SVUI_!Core/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc @@ -0,0 +1,18 @@ +## Interface: 60100 +## LoadOnDemand: 1 +## X-Curse-Packaged-Version: 6.1.0 - r92 +## X-Curse-Project-Name: LibSharedMedia-3.0 +## X-Curse-Project-ID: libsharedmedia-3-0 +## X-Curse-Repository-ID: wow/libsharedmedia-3-0/mainline + +## Title: Lib: SharedMedia-3.0 +## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons. +## Author: Elkano +## Version: 3.0-91 +## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/ +## X-Category: Library + +## X-Revision: 91 +## X-Date: 2015-02-27T01:36:14Z + +LibSharedMedia-3.0\LibSharedMedia-3.0.lua diff --git a/SVUI_!Core/libs/_SVUI_Lib/External.lua b/SVUI_!Core/libs/_SVUI_Lib/External.lua index b8889ac..6a51154 100644 --- a/SVUI_!Core/libs/_SVUI_Lib/External.lua +++ b/SVUI_!Core/libs/_SVUI_Lib/External.lua @@ -6,96 +6,52 @@ It's main purpose is to keep all methods and logic needed to properly keep core add-ins functioning outside of the core object. It is also modifyiing LibStub to give me dominating control over which libraries are -allowed to be created and loaded regardless of versioning or timing. +allowed to be created and loaded regardless of versioning or timing. The reasoning for this is due to the potential for other addon to get loaded earlier -and embed newer versions of lib dependencies which can be devastating. +and embed newer versions of lib dependencies which can be devastating. --]] -local _G = getfenv(0) -local select = _G.select; -local assert = _G.assert; -local type = _G.type; -local error = _G.error; -local pairs = _G.pairs; -local next = _G.next; -local ipairs = _G.ipairs; -local loadstring = _G.loadstring; -local setmetatable = _G.setmetatable; -local rawset = _G.rawset; -local rawget = _G.rawget; -local tostring = _G.tostring; -local tonumber = _G.tonumber; -local tostring = _G.tostring; -local xpcall = _G.xpcall; -local table = _G.table; -local tconcat = table.concat; -local tremove = table.remove; -local tinsert = table.insert; -local strmatch = _G.strmatch; -local table_sort = table.sort; -local bit = _G.bit; -local band = bit.band; -local math = _G.math; -local min,max,abs = math.min,math.max,math.abs; -local LibStub = _G.LibStub; -local UIParent = _G.UIParent; -local GetScreenWidth = _G.GetScreenWidth; +local _G = getfenv(0) +local select = _G.select; +local assert = _G.assert; +local type = _G.type; +local error = _G.error; +local pairs = _G.pairs; +local next = _G.next; +local ipairs = _G.ipairs; +local loadstring = _G.loadstring; +local setmetatable = _G.setmetatable; +local rawset = _G.rawset; +local rawget = _G.rawget; +local tostring = _G.tostring; +local tonumber = _G.tonumber; +local tostring = _G.tostring; +local xpcall = _G.xpcall; +local table = _G.table; +local tconcat = table.concat; +local tremove = table.remove; +local tinsert = table.insert; +local strmatch = _G.strmatch; +local table_sort = table.sort; +local bit = _G.bit; +local band = bit.band; +local math = _G.math; +local min,max,abs = math.min,math.max,math.abs; +local LibStub = _G.LibStub; +local UIParent = _G.UIParent; +local GetScreenWidth = _G.GetScreenWidth; local GetScreenHeight = _G.GetScreenHeight; -local IsAltKeyDown = _G.IsAltKeyDown; +local IsAltKeyDown = _G.IsAltKeyDown; --[[ -The following are private and compressed versions of dependancy libraries +The following are private and compressed versions of dependancy libraries --]] local MAX_MINOR = 999999999; -local geterrorhandler = _G.geterrorhandler; -local CB_MAJOR = "CallbackHandler-1.0"; -local CB = LibStub:NewLibrary(CB_MAJOR, MAX_MINOR, true) -local _CODE = [[ -local next, xpcall, eh = ... -local method, ARGS -local function call() method(ARGS) end -local function dispatch(handlers, ...) - local index - index, method = next(handlers) - if not method then return end - local OLD_ARGS = ARGS - ARGS = ... - repeat - xpcall(call, eh) - index, method = next(handlers, index) - until not method - ARGS = OLD_ARGS -end -return dispatch -]]; - -local _META={__index=function(a,b)a[b]={}return a[b]end} -local function _err(a) return geterrorhandler()(a) end -local function _set(a)local b=_CODE;local c,d={},{}for e=1,a do c[e],d[e]="arg"..e,"old_arg"..e end;b=b:gsub("OLD_ARGS",tconcat(d,", ")):gsub("ARGS",tconcat(c,", "))return assert(loadstring(b,"safecall Dispatcher["..a.."]"))(next,xpcall,_err)end -local Dispatchers=setmetatable({},{__index=function(a,b)local c=_set(b)rawset(a,b,c)return c end}) -function CB:New(a,b,c,d)b=b or"RegisterCallback"c=c or"UnregisterCallback"if d==nil then d="UnregisterAllCallbacks"end;local e=setmetatable({},_META)local registry={recurse=0,events=e}function registry:Fire(f,...)if not rawget(e,f)or not next(e[f])then return end;local g=registry.recurse;registry.recurse=g+1;Dispatchers[select('#',...)+1](e[f],f,...)registry.recurse=g;if registry.insertQueue and g==0 then for f,h in pairs(registry.insertQueue)do local i=not rawget(e,f)or not next(e[f])for j,k in pairs(h)do e[f][j]=k;if i and registry.OnUsed then registry.OnUsed(registry,a,f)i=nil end end end;registry.insertQueue=nil end end;a[b]=function(j,f,l,...)if type(f)~="string"then return end;l=l or f;local i=not rawget(e,f)or not next(e[f])if type(l)~="string"and type(l)~="function"then return end;local m;if type(l)=="string"then if type(j)~="table"or j==a or type(j[l])~="function"then return end;if select("#",...)>=1 then local n=select(1,...)m=function(...)j[l](j,n,...)end else m=function(...)j[l](j,...)end end else if type(j)~="table"and type(j)~="string"and type(j)~="thread"then return end;if select("#",...)>=1 then local n=select(1,...)m=function(...)l(n,...)end else m=l end end;if e[f][j]or registry.recurse<1 then e[f][j]=m;if registry.OnUsed and i then registry.OnUsed(registry,a,f)end else registry.insertQueue=registry.insertQueue or setmetatable({},_META)registry.insertQueue[f][j]=m end end;a[c]=function(j,f)if not j or j==a or type(f)~="string"then return end;if rawget(e,f)and e[f][j]then e[f][j]=nil;if registry.OnUnused and not next(e[f])then registry.OnUnused(registry,a,f)end end;if registry.insertQueue and rawget(registry.insertQueue,f)and registry.insertQueue[f][j]then registry.insertQueue[f][j]=nil end end;if d then a[d]=function(...)if select("#",...)<1 or select("#",...)==1 and...==a then return end;for o=1,select("#",...)do local j=select(o,...)if registry.insertQueue then for f,h in pairs(registry.insertQueue)do if h[j]then h[j]=nil end end end;for f,h in pairs(e)do if h[j]then h[j]=nil;if registry.OnUnused and not next(h)then registry.OnUnused(registry,a,f)end end end end end end;return registry end - -local LSM_MAJOR = "LibSharedMedia-3.0"; -local LSM = LibStub:NewLibrary(LSM_MAJOR, MAX_MINOR, true) -if(LSM) then - local locale=GetLocale()local b;local c=0; - LSM.LOCALE_BIT_koKR=1;LSM.LOCALE_BIT_ruRU=2;LSM.LOCALE_BIT_zhCN=4;LSM.LOCALE_BIT_zhTW=8;LSM.LOCALE_BIT_western=128;LSM.callbacks=LSM.callbacks or CB:New(LSM)LSM.DefaultMedia=LSM.DefaultMedia or{}LSM.MediaList=LSM.MediaList or{}LSM.MediaTable=LSM.MediaTable or{}LSM.MediaType=LSM.MediaType or{}LSM.OverrideMedia=LSM.OverrideMedia or{}LSM.MediaType.BACKGROUND="background"LSM.MediaType.BORDER="border"LSM.MediaType.FONT="font"LSM.MediaType.STATUSBAR="statusbar"LSM.MediaType.SOUND="sound"if not LSM.MediaTable.background then LSM.MediaTable.background={}end;LSM.MediaTable.background["Blizzard Dialog Background"]=[[Interface\DialogFrame\UI-DialogBox-Background]]LSM.MediaTable.background["Blizzard Dialog Background Dark"]=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]]LSM.MediaTable.background["Blizzard Dialog Background Gold"]=[[Interface\DialogFrame\UI-DialogBox-Gold-Background]]LSM.MediaTable.background["Blizzard Low Health"]=[[Interface\FullScreenTextures\LowHealth]]LSM.MediaTable.background["Blizzard Marble"]=[[Interface\FrameGeneral\UI-Background-Rock]]LSM.MediaTable.background["Blizzard Out of Control"]=[[Interface\FullScreenTextures\OutOfControl]]LSM.MediaTable.background["Blizzard Parchment"]=[[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]LSM.MediaTable.background["Blizzard Parchment 2"]=[[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]LSM.MediaTable.background["Blizzard Rock"]=[[Interface\FrameGeneral\UI-Background-Rock]]LSM.MediaTable.background["Blizzard Tabard Background"]=[[Interface\TabardFrame\TabardFrameBackground]]LSM.MediaTable.background["Blizzard Tooltip"]=[[Interface\Tooltips\UI-Tooltip-Background]]LSM.MediaTable.background["Solid"]=[[Interface\Buttons\WHITE8X8]]if not LSM.MediaTable.border then LSM.MediaTable.border={}end;LSM.MediaTable.border["None"]=[[Interface\None]]LSM.MediaTable.border["Blizzard Achievement Wood"]=[[Interface\AchievementFrame\UI-Achievement-WoodBorder]]LSM.MediaTable.border["Blizzard Chat Bubble"]=[[Interface\Tooltips\ChatBubble-Backdrop]]LSM.MediaTable.border["Blizzard Dialog"]=[[Interface\DialogFrame\UI-DialogBox-Border]]LSM.MediaTable.border["Blizzard Dialog Gold"]=[[Interface\DialogFrame\UI-DialogBox-Gold-Border]]LSM.MediaTable.border["Blizzard Party"]=[[Interface\CHARACTERFRAME\UI-Party-Border]]LSM.MediaTable.border["Blizzard Tooltip"]=[[Interface\Tooltips\UI-Tooltip-Border]]if not LSM.MediaTable.font then LSM.MediaTable.font={}end;local d=LSM.MediaTable.font;if locale=="koKR"then c=LSM.LOCALE_BIT_koKR;d["굵은 글꼴"]=[[Fonts\2002B.TTF]]d["기본 글꼴"]=[[Fonts\2002.TTF]]d["데미지 글꼴"]=[[Fonts\K_Damage.TTF]]d["퀘스트 글꼴"]=[[Fonts\K_Pagetext.TTF]]LSM.DefaultMedia["font"]="기본 글꼴"elseif locale=="zhCN"then c=LSM.LOCALE_BIT_zhCN;d["伤害数字"]=[[Fonts\ARKai_DB.ttf]]d["默认"]=[[Fonts\ARKai_T.ttf]]d["聊天"]=[[Fonts\ARHei.ttf]]LSM.DefaultMedia["font"]="默认"elseif locale=="zhTW"then c=LSM.LOCALE_BIT_zhTW;d["提示訊息"]=[[Fonts\bHEI00M.ttf]]d["聊天"]=[[Fonts\bHEI01B.ttf]]d["傷害數字"]=[[Fonts\bKAI00M.ttf]]d["預設"]=[[Fonts\bLEI00D.ttf]]LSM.DefaultMedia["font"]="預設"elseif locale=="ruRU"then c=LSM.LOCALE_BIT_ruRU;d["Arial Narrow"]=[[Fonts\ARIALN.TTF]]d["Nimrod MT"]=[[Fonts\NIM_____.ttf]]LSM.DefaultMedia.font="Arial Narrow"else c=LSM.LOCALE_BIT_western;b=true;d["Arial Narrow"]=[[Fonts\ARIALN.TTF]]d["Friz Quadrata TT"]=[[Fonts\FRIZQT__.TTF]]d["Morpheus"]=[[Fonts\MORPHEUS.TTF]]d["Skurri"]=[[Fonts\SKURRI.TTF]]LSM.DefaultMedia.font="Arial Narrow"end;if not LSM.MediaTable.statusbar then LSM.MediaTable.statusbar={}end;LSM.MediaTable.statusbar["Blizzard"]=[[Interface\TargetingFrame\UI-StatusBar]]LSM.MediaTable.statusbar["Blizzard Character Skills Bar"]=[[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]LSM.DefaultMedia.statusbar="Blizzard"if not LSM.MediaTable.sound then LSM.MediaTable.sound={}end;LSM.MediaTable.sound["None"]=[[Interface\Quiet.ogg]]LSM.DefaultMedia.sound="None"local e=LSM.DefaultMedia;local f=LSM.MediaList;local g=LSM.MediaTable;local h=LSM.OverrideMedia;local function i(j)local k=g[j]if not k then return end;if not f[j]then f[j]={}end;local l=f[j]local m=0;for n in pairs(k)do m=m+1;l[m]=n end;table_sort(l)end; - function LSM:Register(j,o,p,q)if type(j)~="string"then error(LSM_MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(j))end;if type(o)~="string"then error(LSM_MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(o))end;j=j:lower()if j==LSM.MediaType.FONT and q and band(q,c)==0 or not(q or b)then return false end;if not g[j]then g[j]={}end;local k=g[j]if k[o]then return false end;k[o]=p;i(j)self.callbacks:Fire("LibSharedMedia_Registered",j,o)return true end; - function LSM:Fetch(j,o,r)local s=g[j]local t=h[j]local u=s and t and s[t]or s[o]or not r and e[j]and s[e[j]]or nil;return u end; - function LSM:IsValid(j,o)return g[j]and not o or g[j][o]and true or false end; - function LSM:HashTable(j)return g[j]end; - function LSM:List(j)if not g[j]then return nil end;if not f[j]then i(j)end;return f[j]end; - function LSM:GetGlobal(j)return h[j]end; - function LSM:SetGlobal(j,o)if not g[j]then return false end;h[j]=o and g[j][o]and o or nil;self.callbacks:Fire("LibSharedMedia_SetGlobal",j,h[j])return true end; - function LSM:GetDefault(j)return e[j]end; - function LSM:SetDefault(j,o)if g[j]and g[j][o]and not e[j]then e[j]=o;return true else return false end end -end - local WINDOW_MAJOR = "LibWindow-1.1"; local WINDOW = LibStub:NewLibrary(WINDOW_MAJOR, MAX_MINOR, true); if(WINDOW) then WINDOW.utilFrame = WINDOW.utilFrame or CreateFrame("Frame") WINDOW.delayedSavePosition = WINDOW.delayedSavePosition or {} - WINDOW.windowData = WINDOW.windowData or {} + WINDOW.windowData = WINDOW.windowData or {} WINDOW.embeds = WINDOW.embeds or {} local mixins = {} local function a(b,c)local names=WINDOW.windowData[b].names;if names then if names[c]then return names[c]end;if names.prefix then return names.prefix..c end end;return c end; @@ -118,4 +74,4 @@ if(WINDOW) then function WINDOW.EnableMouseWheelScaling(b)b:SetScript("OnMouseWheel",z)end;WINDOW.utilFrame:SetScript("OnEvent",function(g,A,B,C)if A=="MODIFIER_STATE_CHANGED"then if B=="LALT"or B=="RALT"then for b,h in pairs(WINDOW.altEnabledFrames)do if not WINDOW.windowData[b].isDragging then b:EnableMouse(C==1)end end end end end)mixins["EnableMouseOnAlt"]=true; function WINDOW.EnableMouseOnAlt(b)assert(WINDOW.windowData[b])WINDOW.windowData[b].altEnable=true;b:EnableMouse(not not IsAltKeyDown())if not WINDOW.altEnabledFrames then WINDOW.altEnabledFrames={}WINDOW.utilFrame:RegisterEvent("MODIFIER_STATE_CHANGED")end;WINDOW.altEnabledFrames[b]=true end; function WINDOW:Embed(D)if not D or not D[0]or not D.GetObjectType then error("Usage: WINDOW:Embed(frame)",1)end;D.lw11origSetScale=D.SetScale;for c,h in pairs(mixins)do D[c]=self[c]end;WINDOW.embeds[D]=true;return D end;for D,h in pairs(WINDOW.embeds)do WINDOW:Embed(D)end -end \ No newline at end of file +end diff --git a/SVUI_!Core/libs/_load.xml b/SVUI_!Core/libs/_load.xml index e962499..016de6f 100644 --- a/SVUI_!Core/libs/_load.xml +++ b/SVUI_!Core/libs/_load.xml @@ -1,5 +1,7 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/"> <Script file="_Librarian\Librarian.lua"/> + <Script file="CallbackHandler-1.0\CallbackHandler-1.0.lua"/> + <Script file="LibSharedMedia-3.0\LibSharedMedia-3.0.lua"/> <Include file="_SVUI_Lib\_SVUI_Lib.xml"/> <Include file="AceVillain\AceVillain.xml"/> -</Ui> \ No newline at end of file +</Ui> diff --git a/SVUI_Skins/components/blizzard/quest.lua b/SVUI_Skins/components/blizzard/quest.lua index d8788b9..91e728f 100644 --- a/SVUI_Skins/components/blizzard/quest.lua +++ b/SVUI_Skins/components/blizzard/quest.lua @@ -18,8 +18,8 @@ local MOD = SV.Skins; local Schema = MOD.Schema; local MAX_NUM_ITEMS = _G.MAX_NUM_ITEMS ---[[ -########################################################## +--[[ +########################################################## HELPERS ########################################################## ]]-- @@ -40,7 +40,7 @@ local function QuestScrollHelper(b, c, d, e) b.spellTex:SetPoint("TOPLEFT", 2, -2) else b.spellTex:SetPoint("TOPLEFT") - end + end b.spellTex:ModSize(c or 506, d or 615) b.spellTex:SetTexCoord(0, 1, 0.02, 1) end @@ -77,7 +77,6 @@ local Hook_QuestInfoItem_OnClick = function(self) _G.QuestInfoItemHighlight:ClearAllPoints() _G.QuestInfoItemHighlight:SetAllPoints(self) _G.QuestInfoItemHighlight:Show() - print('_G.QuestInfoItemHighlight:') end local Hook_QuestNPCModel = function(self, _, _, _, x, y) @@ -89,7 +88,7 @@ local _hook_DetailScrollShow = function(self) if not self.Panel then self:SetStyle("Frame", "Default") QuestScrollHelper(self, 509, 630, false) - end + end self.spellTex:ModHeight(self:GetHeight() + 217) end @@ -107,8 +106,8 @@ local _hook_QuestLogPopupDetailFrameShow = function(self) QuestLogPopupDetailFrameScrollFrame.spellTex2:InsetPoints() end end ---[[ -########################################################## +--[[ +########################################################## QUEST MODRS ########################################################## ]]-- @@ -131,7 +130,7 @@ local function QuestFrameStyle() choiceBG:SetTexture(0.35, 1, 0, 0.35) --QuestInfoItemHighlight:ModSize(142, 40) - + local width = QuestLogPopupDetailFrameScrollFrame:GetWidth() QuestLogPopupDetailFrame.ShowMapButton:SetWidth(width) QuestLogPopupDetailFrame.ShowMapButton:SetStyle("Button") @@ -206,7 +205,7 @@ local function QuestFrameStyle() SV.API:Set("CloseButton", QuestFrameCloseButton, QuestFrame.Panel) - for j = 1, 6 do + for j = 1, 6 do local i = _G["QuestProgressItem"..j] local texture = _G["QuestProgressItem"..j.."IconTexture"] i:RemoveTextures() @@ -253,11 +252,11 @@ local function QuestChoiceFrameStyle() QuestChoiceFrame.Option1.OptionButton:SetStyle("Button") --QuestChoiceFrame.Option2:SetStyle("Frame", "Inset") QuestChoiceFrame.Option2.OptionButton:SetStyle("Button") -end ---[[ -########################################################## +end +--[[ +########################################################## MOD LOADING ########################################################## ]]-- MOD:SaveCustomStyle(QuestFrameStyle) -MOD:SaveBlizzardStyle('Blizzard_QuestChoice', QuestChoiceFrameStyle) \ No newline at end of file +MOD:SaveBlizzardStyle('Blizzard_QuestChoice', QuestChoiceFrameStyle)