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.

307 lines
8.0 KiB

-- ----------------------------------------------------------------------------
-- Localized Lua globals.
-- ----------------------------------------------------------------------------
-- Libraries
local table = _G.table
-- Functions
local pairs = _G.pairs
-- ----------------------------------------------------------------------------
-- AddOn namespace.
-- ----------------------------------------------------------------------------
local AddOnFolderName, private = ...
local LibStub = _G.LibStub
local NPCScan = LibStub("AceAddon-3.0"):GetAddon(AddOnFolderName)
local L = LibStub("AceLocale-3.0"):GetLocale(AddOnFolderName)
local AceConfigRegistry = LibStub("AceConfigRegistry-3.0")
local LibSharedMedia = LibStub("LibSharedMedia-3.0")
-- ----------------------------------------------------------------------------
-- Constants.
-- ----------------------------------------------------------------------------
local SOUND_CHANNELS = {
"Ambience",
"Master",
"Music",
"SFX",
}
local LOCALIZED_SOUND_CHANNELS = {
_G.AMBIENCE_VOLUME,
_G.MASTER,
_G.MUSIC_VOLUME,
_G.SOUND_VOLUME,
}
local SOUND_CHANNEL_INDICES = {}
for index = 1, #SOUND_CHANNELS do
SOUND_CHANNEL_INDICES[SOUND_CHANNELS[index]] = index
end
-- ----------------------------------------------------------------------------
-- Variables.
-- ----------------------------------------------------------------------------
local profile
local AlertNamesOptions = {}
-- ----------------------------------------------------------------------------
-- Helpers.
-- ----------------------------------------------------------------------------
local function UpdateAlertNamesOptions()
local sharedMediaNames = profile.alert.sound.sharedMediaNames
local sortedSoundNames = {}
for soundName in pairs(sharedMediaNames) do
if sharedMediaNames[soundName] ~= false then
sortedSoundNames[#sortedSoundNames + 1] = soundName
end
end
table.sort(sortedSoundNames)
table.wipe(AlertNamesOptions)
for index = 1, #sortedSoundNames do
local soundName = sortedSoundNames[index]
AlertNamesOptions[soundName .. index] = {
order = index,
name = soundName,
descStyle = "inline",
type = "toggle",
width = "full",
get = function()
return true
end,
set = function()
if private.DefaultPreferences.profile.alert.sound.sharedMediaNames[soundName] then
sharedMediaNames[soundName] = false
else
sharedMediaNames[soundName] = nil
end
UpdateAlertNamesOptions()
end,
}
end
AceConfigRegistry:NotifyChange(AddOnFolderName)
end
-- ----------------------------------------------------------------------------
-- Initialization.
-- ----------------------------------------------------------------------------
local AlertOptions
local firstRun = true
local function GetAlertOptions()
profile = private.db.profile
local function IsSoundDisabled()
return not profile.alert.sound.isEnabled
end
if not AlertOptions then
LibSharedMedia:Register("sound", "NPCScan Killed", 567394)
LibSharedMedia:Register("sound", "NPCScan Chimes", 1489461)
LibSharedMedia:Register("sound", "NPCScan Gruntling Horn", 598196)
LibSharedMedia:Register("sound", "NPCScan Ogre War Drums", 567275)
LibSharedMedia:Register("sound", "NPCScan Scourge Horn", 567386)
end
AlertOptions = AlertOptions or {
order = 4,
name = L["Alerts"],
descStyle = "inline",
type = "group",
childGroups = "tree",
args = {
screenFlash = {
order = 2,
name = L["Screen Flash"],
type = "group",
args = {
isEnabled = {
order = 1,
name = _G.ENABLE,
descStyle = "inline",
type = "toggle",
width = "full",
get = function()
return profile.alert.screenFlash.isEnabled
end,
set = function(_, value)
profile.alert.screenFlash.isEnabled = value
end,
},
texture = {
order = 2,
name = _G.TEXTURES_SUBHEADER,
descStyle = "inline",
type = "select",
dialogControl = 'LSM30_Background',
values = _G.AceGUIWidgetLSMlists.background,
disabled = function()
return not profile.alert.screenFlash.isEnabled
end,
get = function()
return profile.alert.screenFlash.texture
end,
set = function(_, value)
profile.alert.screenFlash.texture = value
end,
},
color = {
order = 3,
name = _G.COLOR,
descStyle = "inline",
hasAlpha = true,
type = "color",
disabled = function()
return not profile.alert.screenFlash.isEnabled
end,
get = function()
local color = profile.alert.screenFlash.color
if color then
return color.r, color.g, color.b, color.a else return 0, 0, 0, 1
end
end,
set = function(_, r, g, b, a)
local color = profile.alert.screenFlash.color
if not color then
profile.alert.screenFlash.color = {
r = r,
g = g,
b = b,
a = a
}
else
color.r = r
color.g = g
color.b = b
color.a = a
end
end,
},
preview = {
order = 4,
name = _G.PREVIEW,
descStyle = "inline",
type = "execute",
width = "normal",
disabled = function()
return not profile.alert.screenFlash.isEnabled
end,
func = function()
local alert = profile.alert
NPCScan:PlayFlashAnimation(alert.screenFlash.texture, alert.screenFlash.color)
end,
},
},
},
sound = {
order = 3,
name = _G.SOUND,
descStyle = "inline",
type = "group",
args = {
isEnabled = {
order = 10,
name = _G.ENABLE,
descStyle = "inline",
type = "toggle",
get = function()
return profile.alert.sound.isEnabled
end,
set = function(_, value)
profile.alert.sound.isEnabled = value
end,
},
ignoreMute = {
order = 20,
name = L["Ignore Mute"],
desc = L["Play alert sounds when sound is muted."],
type = "toggle",
width = "double",
disabled = IsSoundDisabled,
get = function()
return profile.alert.sound.ignoreMute
end,
set = function(_, value)
profile.alert.sound.ignoreMute = value
end,
},
channel = {
order = 30,
name = _G.SOUND_CHANNELS,
descStyle = "inline",
type = "select",
values = LOCALIZED_SOUND_CHANNELS,
disabled = IsSoundDisabled,
get = function()
return SOUND_CHANNEL_INDICES[profile.alert.sound.channel]
end,
set = function(_, value)
profile.alert.sound.channel = SOUND_CHANNELS[value]
end,
},
addAlertSound = {
order = 40,
name = _G.ADD,
descStyle = "inline",
type = "select",
dialogControl = "LSM30_Sound",
values = _G.AceGUIWidgetLSMlists.sound,
disabled = IsSoundDisabled,
get = function()
-- Intentionally empty, since there can be multiple sounds.
end,
set = function(_, value)
profile.alert.sound.sharedMediaNames[value] = true
UpdateAlertNamesOptions()
end,
},
sharedMediaNames = {
order = 50,
name = _G.ASSIGNED_COLON,
type = "group",
inline = true,
disabled = IsSoundDisabled,
args = AlertNamesOptions,
},
preview = {
order = 60,
name = _G.PREVIEW,
descStyle = "inline",
type = "execute",
width = "normal",
disabled = IsSoundDisabled,
func = function()
private.PlayAlertSounds(true)
end,
},
},
},
},
}
UpdateAlertNamesOptions()
if firstRun then
firstRun = nil
local output = NPCScan:GetSinkAce3OptionsDataTable()
output.order = 1
AlertOptions.args.output = output
end
return AlertOptions
end
private.GetAlertOptions = GetAlertOptions