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