038931fcfb
Match the layout convention used by every other multi-addon-shape fork in Exiles/ (Bagnon/, Kui_Nameplates/, ShadowedUnitFrames/, etc.) — the addon's own files live in a subfolder named after the addon, with only the repo-level README files at the root. All moves are pure git renames (history preserved). Toc references are relative to the toc location so nothing inside the addon changes.
260 lines
9.9 KiB
Lua
260 lines
9.9 KiB
Lua
--[[
|
|
Name: LibSharedMedia-3.0
|
|
Revision: $Revision: 62 $
|
|
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", 3030002 -- 3.3.5 / 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_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 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 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
|
|
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["Solid"] = [[Interface\Buttons\WHITE8X8]]
|
|
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 these values.
|
|
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
|
|
-- ignore fonts that aren't flagged as supporting local glyphs on non-western clients
|
|
return false
|
|
end
|
|
if mediatype == lib.MediaType.SOUND and type(data) == "string" then
|
|
local path = data:lower()
|
|
if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) and not path:find(".wav", nil, true) then
|
|
-- Only wav, ogg and mp3 are valid sounds.
|
|
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
|