You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
7.5 KiB
322 lines
7.5 KiB
-------------------------------------------------------------------------------
|
|
-- Module Declaration
|
|
--
|
|
|
|
local plugin = BigWigs:NewPlugin("Sounds")
|
|
if not plugin then return end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Locals
|
|
--
|
|
|
|
local L = BigWigsAPI:GetLocale("BigWigs: Plugins")
|
|
local BL = BigWigsAPI:GetLocale("BigWigs")
|
|
local media = LibStub("LibSharedMedia-3.0")
|
|
local SOUND = media.MediaType and media.MediaType.SOUND or "sound"
|
|
local soundList = nil
|
|
local db
|
|
local sounds = {
|
|
Long = "BigWigs: Long",
|
|
Info = "BigWigs: Info",
|
|
Alert = "BigWigs: Alert",
|
|
Alarm = "BigWigs: Alarm",
|
|
Warning = "BigWigs: Raid Warning",
|
|
--onyou = BL.spell_on_you,
|
|
underyou = BL.spell_under_you,
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Options
|
|
--
|
|
|
|
plugin.defaultDB = {
|
|
media = {
|
|
Long = sounds.Long,
|
|
Info = sounds.Info,
|
|
Alert = sounds.Alert,
|
|
Alarm = sounds.Alarm,
|
|
Warning = sounds.Warning,
|
|
--onyou = BL.spell_on_you,
|
|
underyou = BL.spell_under_you,
|
|
},
|
|
Long = {},
|
|
Info = {},
|
|
Alert = {},
|
|
Alarm = {},
|
|
Warning = {},
|
|
underyou = {},
|
|
}
|
|
|
|
plugin.pluginOptions = {
|
|
type = "group",
|
|
name = "|TInterface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Sounds:20|t ".. L.Sounds,
|
|
get = function(info)
|
|
for i, v in next, soundList do
|
|
if v == db.media[info[#info]] then
|
|
return i
|
|
end
|
|
end
|
|
end,
|
|
set = function(info, value)
|
|
local sound = info[#info]
|
|
db.media[sound] = soundList[value]
|
|
PlaySoundFile(media:Fetch(SOUND, soundList[value]), "Master")
|
|
end,
|
|
order = 4,
|
|
args = {
|
|
heading = {
|
|
type = "description",
|
|
name = L.soundsDesc,
|
|
order = 1,
|
|
width = "full",
|
|
fontSize = "medium",
|
|
},
|
|
-- Begin sound dropdowns
|
|
--onyou = {
|
|
-- type = "select",
|
|
-- name = L.onyou,
|
|
-- order = 2,
|
|
-- values = function() return soundList end,
|
|
-- width = "full",
|
|
-- itemControl = "DDI-Sound",
|
|
--},
|
|
underyou = {
|
|
type = "select",
|
|
name = L.underyou,
|
|
order = 3,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
newline2 = {
|
|
type = "description",
|
|
name = "\n\n",
|
|
order = 3.5,
|
|
},
|
|
oldSounds = {
|
|
type = "header",
|
|
name = L.oldSounds,
|
|
order = 4,
|
|
},
|
|
Alarm = {
|
|
type = "select",
|
|
name = L.Alarm,
|
|
order = 5,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
Alert = {
|
|
type = "select",
|
|
name = L.Alert,
|
|
order = 6,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
Info = {
|
|
type = "select",
|
|
name = L.Info,
|
|
order = 7,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
Long = {
|
|
type = "select",
|
|
name = L.Long,
|
|
order = 8,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
Warning = {
|
|
type = "select",
|
|
name = L.Warning,
|
|
order = 9,
|
|
values = function() return soundList end,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
},
|
|
-- End sound dropdowns
|
|
reset = {
|
|
type = "execute",
|
|
name = L.reset,
|
|
desc = L.resetSoundDesc,
|
|
func = function()
|
|
for k in next, plugin.db.profile.media do
|
|
plugin.db.profile.media[k] = sounds[k]
|
|
end
|
|
end,
|
|
order = 10,
|
|
},
|
|
resetAll = {
|
|
type = "execute",
|
|
name = L.resetAll,
|
|
desc = L.resetAllCustomSound,
|
|
func = function() plugin.db:ResetProfile() end,
|
|
order = 11,
|
|
},
|
|
}
|
|
}
|
|
|
|
local soundOptions = {
|
|
type = "group",
|
|
name = L.Sounds,
|
|
handler = plugin,
|
|
inline = true,
|
|
args = {
|
|
customSoundDesc = {
|
|
name = L.customSoundDesc,
|
|
type = "description",
|
|
order = 1,
|
|
width = "full",
|
|
},
|
|
},
|
|
}
|
|
plugin.soundOptions = soundOptions
|
|
|
|
do
|
|
local function addKey(t, key)
|
|
if t.type and t.type == "select" then
|
|
t.arg = key
|
|
elseif t.args then
|
|
for k, v in next, t.args do
|
|
t.args[k] = addKey(v, key)
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
local C = BigWigs.C
|
|
local keyTable = {}
|
|
function plugin:SetSoundOptions(name, key, flags)
|
|
table.wipe(keyTable)
|
|
keyTable[1] = name
|
|
keyTable[2] = key
|
|
local t = addKey(soundOptions, keyTable)
|
|
if t.args.countdown then
|
|
t.args.countdown.disabled = not flags or bit.band(flags, C.COUNTDOWN) == 0
|
|
end
|
|
return t
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Initialization
|
|
--
|
|
|
|
local function updateProfile()
|
|
db = plugin.db.profile
|
|
for k, v in next, db do
|
|
local defaultType = type(plugin.defaultDB[k])
|
|
if defaultType == "nil" then
|
|
db[k] = nil
|
|
elseif type(v) ~= defaultType then
|
|
db[k] = plugin.defaultDB[k]
|
|
end
|
|
end
|
|
for k, v in next, db.media do
|
|
local defaultType = type(plugin.defaultDB.media[k])
|
|
if defaultType == "nil" then
|
|
db.media[k] = nil
|
|
elseif type(v) ~= defaultType then
|
|
db.media[k] = plugin.defaultDB.media[k]
|
|
end
|
|
end
|
|
end
|
|
|
|
function plugin:OnRegister()
|
|
updateProfile()
|
|
|
|
soundList = media:List(SOUND)
|
|
|
|
for k in next, sounds do
|
|
local n = L[k] or k
|
|
soundOptions.args[k] = {
|
|
name = n,
|
|
get = function(info)
|
|
local name, key = unpack(info.arg)
|
|
local optionName = info[#info]
|
|
for i, v in next, soundList do
|
|
-- If no custom sound exists for this option, fall back to global sound option
|
|
if v == (db[optionName][name] and db[optionName][name][key] or db.media[optionName]) then
|
|
return i
|
|
end
|
|
end
|
|
end,
|
|
set = function(info, value)
|
|
local name, key = unpack(info.arg)
|
|
local optionName = info[#info]
|
|
if not db[optionName][name] then db[optionName][name] = {} end
|
|
db[optionName][name][key] = soundList[value]
|
|
PlaySoundFile(media:Fetch(SOUND, soundList[value]), "Master")
|
|
-- We don't cleanup/reset the DB as someone may have a custom global sound but wish to use the default sound on a specific option
|
|
end,
|
|
hidden = function(info)
|
|
local name, key = unpack(info.arg)
|
|
local module = BigWigs:GetBossModule(name:sub(16), true)
|
|
if not module or not module.soundOptions then -- no module entry? show all sounds
|
|
return false
|
|
end
|
|
local optionSounds = module.soundOptions[key]
|
|
if not optionSounds then
|
|
return true
|
|
end
|
|
local optionName = info[#info]:lower()
|
|
if type(optionSounds) == "table" then
|
|
for _, sound in next, optionSounds do
|
|
if sound:lower() == optionName then
|
|
return false
|
|
end
|
|
end
|
|
else
|
|
return optionName ~= optionSounds:lower()
|
|
end
|
|
return true
|
|
end,
|
|
type = "select",
|
|
values = soundList,
|
|
order = 2,
|
|
width = "full",
|
|
itemControl = "DDI-Sound",
|
|
}
|
|
end
|
|
end
|
|
|
|
function plugin:OnPluginEnable()
|
|
self:RegisterMessage("BigWigs_Sound")
|
|
self:RegisterMessage("BigWigs_ProfileUpdate", updateProfile)
|
|
updateProfile()
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Event Handlers
|
|
--
|
|
|
|
do
|
|
local tmp = { -- XXX temp
|
|
["long"] = "Long",
|
|
["info"] = "Info",
|
|
["alert"] = "Alert",
|
|
["alarm"] = "Alarm",
|
|
["warning"] = "Warning",
|
|
}
|
|
local PlaySoundFile = PlaySoundFile
|
|
function plugin:BigWigs_Sound(event, module, key, soundName)
|
|
soundName = tmp[soundName] or soundName
|
|
local sDb = db[soundName]
|
|
if not module or not key or not sDb or not sDb[module.name] or not sDb[module.name][key] then
|
|
local path = db.media[soundName] and media:Fetch(SOUND, db.media[soundName], true) or media:Fetch(SOUND, soundName, true)
|
|
if path then
|
|
PlaySoundFile(path, "Master")
|
|
end
|
|
else
|
|
local newSound = sDb[module.name][key]
|
|
local path = db.media[newSound] and media:Fetch(SOUND, db.media[newSound], true) or media:Fetch(SOUND, newSound, true)
|
|
if path then
|
|
PlaySoundFile(path, "Master")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|