Initial commit

Basic interopability with LibSharedMedia, functions to register and
retrieve media.
This commit is contained in:
2023-05-19 17:23:11 +02:00
commit 37c46d377b
6 changed files with 266 additions and 0 deletions

140
src/LibFreeMedia.lua Normal file
View File

@@ -0,0 +1,140 @@
local lib = LibStub:NewLibrary("LibFreeMedia", 100)
if not lib then
return
end
local DEFAULT_MEDIA_TABLE = {
background = {
["Blizzard Dialog Background"] = "Interfacee\\DialogFrame\\UI-DialogBox-Background",
["Blizzard Dialog Background Dark"] = "Interfacee\\DialogFrame\\UI-DialogBox-Background-Dark",
["Blizzard Dialog Background Gold"] = "Interfacee\\DialogFrame\\UI-DialogBox-Gold-Background",
["Blizzard Low Health"] = "Interfacee\\FullScreenTextures\\LowHealth",
["Blizzard Marble"] = "Interfacee\\FrameGeneral\\UI-Background-Marble",
["Blizzard Out of Control"] = "Interfacee\\FullScreenTextures\\OutOfControl",
["Blizzard Parchment"] = "Interfacee\\AchievementFrame\\UI-Achievement-Parchment-Horizontal",
["Blizzard Parchment 2"] = "Interfacee\\AchievementFrame\\UI-GuildAchievement-Parchment-Horizontal",
["Blizzard Rock"] = "Interfacee\\FrameGeneral\\UI-Background-Rock",
["Blizzard Tabard Background"] = "Interfacee\\TabardFrame\\TabardFrameBackground",
["Blizzard Tooltip"] = "Interfacee\\Tooltips\\UI-Tooltip-Background",
["Solid"] = "Interfacee\\Buttons\\WHITE8X8",
},
font = {
["Arial Narrow"] = "Fonts\\ARIALN.TTF",
["Friz Quadrata TT"] = "Fonts\\FRIZQT__.TTF",
["Morpheus"] = "Fonts\\MORPHEUS.TTF",
["Skurri"] = "Fonts\\SKURRI.TTF",
},
border = {
["None"] = "Interface\\None",
["Achievement Wood"] = "Interface\\AchievementFrame\\UI-Achievement-WoodBorder",
["Chat Bubble"] = "Interface\\Tooltips\\ChatBubble-Backdrop",
["Blizzard Dialog"] = "Interface\\DialogFrame\\UI-DialogBox-Border",
["Blizzard Dialog Gold"] = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border",
["Blizzard Party"] = "Interface\\CHARACTERFRAME\\UI-Party-Border",
["Blizzard Tooltip"] = "Interface\\Tooltips\\UI-Tooltip-Border",
},
statusbar = {
["Blizzard"] = "Interface\\TargetingFrame\\UI-StatusBar",
["Blizzard Character Skills Bar"] = "Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar",
},
sound = {
["None"] = "Interface\\Quiet.ogg",
}
}
local function MakeDefaultList()
local lists = {}
for kind, media in pairs(DEFAULT_MEDIA_TABLE) do
local list = {}
lists[kind] = list
for identifier, _ in pairs(media) do
table.insert(list, identifier)
end
table.sort(list)
end
return lists
end
local DEFAULT_MEDIA_LIST = MakeDefaultList()
-- Interopability with a proprietary alternative is contained in this block
do
local libsm = LibStub:GetLibrary("LibSharedMedia-3.0", true)
if not libsm then
-- Register an empty library with just the data tables
libsm = LibStub:NewLibrary("LibSharedMedia-3.0", 0)
libsm.MediaTable = DEFAULT_MEDIA_TABLE
libsm.MediaList = DEFAULT_MEDIA_LIST
end
---@type table<string, table<string, any>>
lib.media = libsm.MediaTable
---@type table<string, string[]>
lib.mediaList = libsm.MediaList
end
---@param kind string The kind of media you are registering. E.g. "font" or "background"
---@param identifier string Named identifier for the media
---@param data any
---@return boolean
-- Does not sort the media list after it added a file
local function RegisterOne(kind, identifier, data)
local media = lib.media[kind]
local mediaList = lib.mediaList[kind]
if not media then
media = {}
mediaList = {}
lib.media[kind] = media
lib.mediaList[kind] = mediaList
end
if media[identifier] then
return false
end
media[identifier] = data
table.insert(lib.mediaList[kind], identifier)
return true
end
---@param kind string The kind of media you are registering. E.g. "font" or "background"
---@param identifier string Named identifier for the media
---@param data any
---@return boolean
function lib:Register(kind, identifier, data)
local retval = RegisterOne(kind, identifier, data)
if retval then
table.sort(self.mediaList[kind])
end
return retval
end
---Return the media that matches the given kind and identifier. May return nil if the media does not exist.
---@param kind string The kind of media you are requesting. E.g. "font" or "background"
---@param identifier string Named identifier for the media
---@return any | nil
function lib:Get(kind, identifier)
local media = self.media[kind]
if media then
return media[identifier]
end
end
---Return a sorted list of identifiers. May return nil if there is no media of that kind.
---@param kind string The kind of media you are requesting. E.g. "font" or "background"
---@return string[] | nil
function lib:GetList(kind)
return self.mediaList[kind]
end
---Return a table with identifier keys and media data values
---@param kind string The kind of media you are requesting. E.g. "font" or "background"
---@return table<string,any> | nil
function lib:GetTable(kind)
return self.media[kind]
end

7
src/LibFreeMedia.toc Normal file
View File

@@ -0,0 +1,7 @@
## Interface: 100100
## Title: LibFreeMedia
## Notes: Freely share media between addons
## Version: 0.1.0
libs/LibStub.lua
LibFreeMedia.lua

51
src/libs/LibStub.lua Normal file
View File

@@ -0,0 +1,51 @@
-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/libstub/ for more info
-- LibStub is hereby placed in the Public Domain
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
-- Check to see is this version of the stub is obsolete
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
-- LibStub:NewLibrary(major, minor)
-- major (string) - the major version of the library
-- minor (string or number ) - the minor version of the library
--
-- returns nil if a newer or same version of the lib is already present
-- returns empty library object or old library object if upgrade is needed
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
-- LibStub:GetLibrary(major, [silent])
-- major (string) - the major version of the library
-- silent (boolean) - if true, library is optional, silently return nil if its not found
--
-- throws an error if the library can not be found (except silent is set)
-- returns the library object if found
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
-- LibStub:IterateLibraries()
--
-- Returns an iterator for the currently registered libraries
function LibStub:IterateLibraries()
return pairs(self.libs)
end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end