parent
77436756ad
commit
d9fbab066c
@ -0,0 +1,257 @@ |
||||
--[[ $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. |
@ -0,0 +1,4 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd"> |
||||
<Script file="CallbackHandler-1.0.lua" /> |
||||
</Ui> |
@ -0,0 +1,312 @@ |
||||
--[[ |
||||
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 |
@ -0,0 +1,4 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> |
||||
<Script file="LibSharedMedia-3.0.lua" /> |
||||
</Ui> |
Loading…
Reference in new issue