Files
andrew6180 97f9b69d8d fix #79
2025-10-11 06:43:20 -07:00

1461 lines
45 KiB
Lua

local E, _, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local _, L = unpack(select(2, ...))
local UF = E:GetModule("UnitFrames")
local type, pairs, tonumber, tostring = type, pairs, tonumber, tostring
local gsub, match, format = string.gsub, string.match, string.format
local GetSpellInfo = GetSpellInfo
local quickSearchText, selectedSpell, selectedFilter = ""
local function filterMatch(s,v)
local m1, m2, m3, m4 = "^"..v.."$", "^"..v..",", ","..v.."$", ","..v..","
return (match(s, m1) and m1) or (match(s, m2) and m2) or (match(s, m3) and m3) or (match(s, m4) and v..",")
end
local function removePriority(value)
if not value then return end
local x,y,z = E.db.unitframe.units,E.db.nameplates.units
for n, t in pairs(x) do
if t and t.buffs and t.buffs.priority and t.buffs.priority ~= "" then
z = filterMatch(t.buffs.priority, E:EscapeString(value))
if z then E.db.unitframe.units[n].buffs.priority = gsub(t.buffs.priority, z, "") end
end
if t and t.debuffs and t.debuffs.priority and t.debuffs.priority ~= "" then
z = filterMatch(t.debuffs.priority, E:EscapeString(value))
if z then E.db.unitframe.units[n].debuffs.priority = gsub(t.debuffs.priority, z, "") end
end
if t and t.aurabar and t.aurabar.priority and t.aurabar.priority ~= "" then
z = filterMatch(t.aurabar.priority, E:EscapeString(value))
if z then E.db.unitframe.units[n].aurabar.priority = gsub(t.aurabar.priority, z, "") end
end
end
for n, t in pairs(y) do
if t and t.buffs and t.buffs.priority and t.buffs.priority ~= "" then
z = filterMatch(t.buffs.priority, E:EscapeString(value))
if z then E.db.nameplates.units[n].buffs.priority = gsub(t.buffs.priority, z, "") end
end
if t and t.debuffs and t.debuffs.priority and t.debuffs.priority ~= "" then
z = filterMatch(t.debuffs.priority, E:EscapeString(value))
if z then E.db.nameplates.units[n].debuffs.priority = gsub(t.debuffs.priority, z, "") end
end
end
end
local FilterResetState = {}
local function UpdateFilterGroup()
--Prevent errors when choosing a new filter, by doing a reset of the groups
E.Options.args.filters.args.filterGroup = nil
E.Options.args.filters.args.spellGroup = nil
E.Options.args.filters.args.resetGroup = nil
E.Options.args.filters.childGroups = nil
if selectedFilter == "Debuff Highlight" then
E.Options.args.filters.args.filterGroup = {
order = 10,
type = "group",
name = selectedFilter,
guiInline = true,
args = {
addSpell = {
order = 1,
type = "input",
name = L["Add Spell ID or Name"],
desc = L["Add a spell to the filter. Use spell ID if you don't want to match all auras which share the same name."],
get = function(info) return "" end,
set = function(info, value)
if tonumber(value) then value = tonumber(value) end
E.global.unitframe.DebuffHighlightColors[value] = {enable = true, style = "GLOW", color = {r = 0.8, g = 0, b = 0, a = 0.85}}
UpdateFilterGroup()
UF:Update_AllFrames()
end
},
removeSpell = {
order = 2,
type = "execute",
name = L["Remove Spell"],
desc = L["Remove a spell from the filter. Use the spell ID if you see the ID as part of the spell name in the filter."],
func = function()
local value = selectedSpell:match(" %((%d+)%)$") or selectedSpell
if tonumber(value) then value = tonumber(value) end
E.global.unitframe.DebuffHighlightColors[value] = nil
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end,
disabled = function() return not (selectedSpell and selectedSpell ~= "") end
},
quickSearch = {
order = 3,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
guiInline = true,
get = function(info) return selectedSpell end,
set = function(info, value) selectedSpell = value UpdateFilterGroup() end,
values = function()
local filters = {}
local list = E.global.unitframe.DebuffHighlightColors
if not list then return end
local searchText = quickSearchText:lower()
for filter in pairs(list) do
if tonumber(filter) then
local spellName = GetSpellInfo(filter)
if spellName then
filter = format("%s (%s)", spellName, filter)
else
filter = tostring(filter)
end
end
if filter:lower():find(searchText) then filters[filter] = filter end
end
if not next(filters) then filters[""] = L["NONE"] end
return filters
end
}
}
}
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function(info)
E.global.unitframe.DebuffHighlightColors = E:CopyTable({}, G.unitframe.DebuffHighlightColors)
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
local spellID = selectedSpell and match(selectedSpell, "(%d+)")
if spellID then spellID = tonumber(spellID) end
if not selectedSpell or E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)] == nil then
E.Options.args.filters.args.spellGroup = nil
return
end
E.Options.args.filters.args.spellGroup = {
order = 15,
type = "group",
name = selectedSpell,
guiInline = true,
args = {
enabled = {
order = 0,
type = "toggle",
name = L["Enable"],
get = function(info)
return E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].enable
end,
set = function(info, value)
E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].enable = value
UF:Update_AllFrames()
end
},
style = {
order = 3,
type = "select",
name = L["Style"],
values = {
["GLOW"] = L["Glow"],
["FILL"] = L["Fill"]
},
get = function(info)
return E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].style
end,
set = function(info, value)
E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].style = value
UF:Update_AllFrames()
end
},
color = {
order = 1,
type = "color",
name = L["COLOR"],
hasAlpha = true,
get = function(info)
local t = E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].color
return t.r, t.g, t.b, t.a
end,
set = function(info, r, g, b, a)
local t = E.global.unitframe.DebuffHighlightColors[(spellID or selectedSpell)].color
t.r, t.g, t.b, t.a = r, g, b, a
UF:Update_AllFrames()
end
}
}
}
elseif selectedFilter == "AuraBar Colors" then
E.Options.args.filters.args.filterGroup = {
order = 10,
type = "group",
name = selectedFilter,
guiInline = true,
args = {
addSpell = {
order = 1,
type = "input",
name = L["Add Spell ID or Name"],
desc = L["Add a spell to the filter. Use spell ID if you don't want to match all auras which share the same name."],
get = function(info) return "" end,
set = function(info, value)
if tonumber(value) then value = tonumber(value) end
if not E.global.unitframe.AuraBarColors[value] then
E.global.unitframe.AuraBarColors[value] = false
end
UpdateFilterGroup()
UF:CreateAndUpdateUF("player")
UF:CreateAndUpdateUF("target")
UF:CreateAndUpdateUF("focus")
end
},
removeSpell = {
order = 2,
type = "execute",
name = L["Remove Spell"],
desc = L["Remove a spell from the filter. Use the spell ID if you see the ID as part of the spell name in the filter."],
func = function()
local value = selectedSpell:match(" %((%d+)%)$") or selectedSpell
if tonumber(value) then value = tonumber(value) end
if G.unitframe.AuraBarColors[value] then
E.global.unitframe.AuraBarColors[value] = false
E:Print(L["You may not remove a spell from a default filter that is not customly added. Setting spell to false instead."])
else
E.global.unitframe.AuraBarColors[value] = nil
end
selectedSpell = nil
UpdateFilterGroup()
UF:CreateAndUpdateUF("player")
UF:CreateAndUpdateUF("target")
UF:CreateAndUpdateUF("focus")
end,
disabled = function() return not (selectedSpell and selectedSpell ~= "") end
},
quickSearch = {
order = 3,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
guiInline = true,
get = function(info) return selectedSpell end,
set = function(info, value)
selectedSpell = value
UpdateFilterGroup()
end,
values = function()
local filters = {}
local list = E.global.unitframe.AuraBarColors
if not list then return end
local searchText = quickSearchText:lower()
for filter in pairs(list) do
if tonumber(filter) then
local spellName = GetSpellInfo(filter)
if spellName then
filter = format("%s (%s)", spellName, filter)
else
filter = tostring(filter)
end
end
if filter:lower():find(searchText) then filters[filter] = filter end
end
if not next(filters) then filters[""] = L["NONE"] end
return filters
end
}
}
}
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function(info)
E.global.unitframe.AuraBarColors = E:CopyTable({}, G.unitframe.AuraBarColors)
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
local spellID = selectedSpell and match(selectedSpell, "(%d+)")
if spellID then spellID = tonumber(spellID) end
if not selectedSpell or E.global.unitframe.AuraBarColors[(spellID or selectedSpell)] == nil then
E.Options.args.filters.args.spellGroup = nil
return
end
E.Options.args.filters.args.spellGroup = {
order = 15,
type = "group",
name = selectedSpell,
guiInline = true,
args = {
color = {
order = 1,
type = "color",
name = L["COLOR"],
get = function(info)
local t = E.global.unitframe.AuraBarColors[(spellID or selectedSpell)]
if type(t) == "boolean" then
return 0, 0, 0, 1
else
return t.r, t.g, t.b, t.a
end
end,
set = function(info, r, g, b)
local spell = (spellID or selectedSpell)
if type(E.global.unitframe.AuraBarColors[spell]) ~= "table" then
E.global.unitframe.AuraBarColors[spell] = {}
end
local t = E.global.unitframe.AuraBarColors[spell]
t.r, t.g, t.b = r, g, b
UF:CreateAndUpdateUF("player")
UF:CreateAndUpdateUF("target")
UF:CreateAndUpdateUF("focus")
end
},
removeColor = {
order = 2,
type = "execute",
name = L["Restore Defaults"],
func = function(info)
E.global.unitframe.AuraBarColors[(spellID or selectedSpell)] = false
UF:CreateAndUpdateUF("player")
UF:CreateAndUpdateUF("target")
UF:CreateAndUpdateUF("focus")
end
}
}
}
elseif selectedFilter == "Buff Indicator (Pet)" then
if not E.global.unitframe.buffwatch.PET then
E.global.unitframe.buffwatch.PET = {}
end
E.Options.args.filters.args.filterGroup = {
order = 15,
type = "group",
name = selectedFilter,
guiInline = true,
childGroups = "select",
args = {
addSpellID = {
order = 1,
type = "input",
name = L["Add SpellID"],
desc = L["Add a spell to the filter."],
get = function(info) return "" end,
set = function(info, value)
if not tonumber(value) then
E:Print(L["Value must be a number"])
elseif not GetSpellInfo(value) then
E:Print(L["Not valid spell id"])
else
E.global.unitframe.buffwatch.PET[tonumber(value)] = {["enabled"] = true, ["id"] = tonumber(value), ["point"] = "TOPRIGHT", ["color"] = {["r"] = 1, ["g"] = 0, ["b"] = 0}, ["anyUnit"] = true, ["style"] = "coloredIcon", ["xOffset"] = 0, ["yOffset"] = 0}
selectedSpell = nil
UpdateFilterGroup()
UF:CreateAndUpdateUF("pet")
end
end
},
removeSpellID = {
order = 2,
type = "execute",
name = L["Remove SpellID"],
desc = L["Remove a spell from the filter."],
func = function()
if G.unitframe.buffwatch.PET[selectedSpell] then
E.global.unitframe.buffwatch.PET[selectedSpell].enabled = false
E:Print(L["You may not remove a spell from a default filter that is not customly added. Setting spell to false instead."])
else
E.global.unitframe.buffwatch.PET[selectedSpell] = nil
end
selectedSpell = nil
UpdateFilterGroup()
UF:CreateAndUpdateUF("pet")
end,
disabled = function() return not selectedSpell end
},
quickSearch = {
order = 3,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
values = function()
local values = {}
local list = E.global.unitframe.buffwatch.PET
if not list then return end
local searchText = quickSearchText:lower()
for _, spell in pairs(list) do
if spell.id then
local name = GetSpellInfo(spell.id)
if name and name:lower():find(searchText) then values[spell.id] = name end
end
end
return values
end,
get = function(info) return selectedSpell end,
set = function(info, value)
selectedSpell = value
UpdateFilterGroup()
end
}
}
}
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function(info)
E.global.unitframe.buffwatch.PET = E:CopyTable({}, G.unitframe.buffwatch.PET)
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
if selectedSpell then
local name = GetSpellInfo(selectedSpell)
if name then
E.Options.args.filters.args.filterGroup.args[name] = {
order = -10,
type = "group",
name = name.." ("..selectedSpell..")",
get = function(info) return E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]] end,
set = function(info, value) E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]] = value UF:CreateAndUpdateUF("pet") end,
args = {
enabled = {
order = 0,
type = "toggle",
name = L["Enable"],
},
point = {
order = 1,
type = "select",
name = L["Anchor Point"],
values = {
["TOPLEFT"] = "TOPLEFT",
["TOPRIGHT"] = "TOPRIGHT",
["BOTTOMLEFT"] = "BOTTOMLEFT",
["BOTTOMRIGHT"] = "BOTTOMRIGHT",
["LEFT"] = "LEFT",
["RIGHT"] = "RIGHT",
["TOP"] = "TOP",
["BOTTOM"] = "BOTTOM"
}
},
sizeOverride = {
order = 2,
type = "range",
name = L["Size Override"],
min = 0, max = 50, step = 1
},
xOffset = {
order = 3,
type = "range",
name = L["xOffset"],
min = -75, max = 75, step = 1
},
yOffset = {
order = 4,
type = "range",
name = L["yOffset"],
min = -75, max = 75, step = 1
},
style = {
order = 5,
type = "select",
name = L["Style"],
values = {
["coloredIcon"] = L["Colored Icon"],
["texturedIcon"] = L["Textured Icon"],
["NONE"] = L["NONE"]
}
},
color = {
order = 6,
type = "color",
name = L["COLOR"],
get = function(info)
local t = E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]]
return t.r, t.g, t.b, t.a
end,
set = function(info, r, g, b)
local t = E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]]
t.r, t.g, t.b = r, g, b
UF:CreateAndUpdateUF("pet")
end
},
displayText = {
order = 7,
type = "toggle",
name = L["Display Text"]
},
textColor = {
order = 8,
type = "color",
name = L["Text Color"],
get = function(info)
local t = E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]]
if t then
return t.r, t.g, t.b, t.a
else
return 1, 1, 1, 1
end
end,
set = function(info, r, g, b)
local t = E.global.unitframe.buffwatch.PET[selectedSpell][info[#info]]
t.r, t.g, t.b = r, g, b
UF:CreateAndUpdateUF("pet")
end
},
decimalThreshold = {
order = 9,
type = "range",
name = L["Decimal Threshold"],
desc = L["Threshold before text goes into decimal form. Set to -1 to disable decimals."],
min = -1, max = 10, step = 1
},
textThreshold = {
order = 10,
type = "range",
name = L["Text Threshold"],
desc = L["At what point should the text be displayed. Set to -1 to disable."],
min = -1, max = 60, step = 1
},
anyUnit = {
order = 11,
type = "toggle",
name = L["Show Aura From Other Players"]
},
onlyShowMissing = {
order = 12,
type = "toggle",
name = L["Show When Not Active"]
}
}
}
else
E:Print(L["Not valid spell id"])
end
end
elseif selectedFilter == "Buff Indicator" then
if not E.global.unitframe.buffwatch[E.myclass] then
E.global.unitframe.buffwatch[E.myclass] = {}
end
E.Options.args.filters.args.filterGroup = {
order = 15,
type = "group",
name = selectedFilter,
guiInline = true,
childGroups = "select",
args = {
addSpellID = {
order = 1,
type = "input",
name = L["Add SpellID"],
desc = L["Add a spell to the filter."],
get = function(info) return "" end,
set = function(info, value)
if not tonumber(value) then
E:Print(L["Value must be a number"])
elseif not GetSpellInfo(value) then
E:Print(L["Not valid spell id"])
else
E.global.unitframe.buffwatch[E.myclass][tonumber(value)] = {["enabled"] = true, ["id"] = tonumber(value), ["point"] = "TOPRIGHT", ["color"] = {["r"] = 1, ["g"] = 0, ["b"] = 0}, ["anyUnit"] = false, ["style"] = "coloredIcon", ["xOffset"] = 0, ["yOffset"] = 0}
selectedSpell = nil
UpdateFilterGroup()
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
UF:UpdateAuraWatchFromHeader("raidpet", true)
end
end
},
removeSpellID = {
order = 2,
type = "execute",
name = L["Remove SpellID"],
desc = L["Remove a spell from the filter."],
func = function()
if E.global.unitframe.buffwatch[E.myclass][selectedSpell] then
E.global.unitframe.buffwatch[E.myclass][selectedSpell].enabled = false
E:Print(L["You may not remove a spell from a default filter that is not customly added. Setting spell to false instead."])
else
E.global.unitframe.buffwatch[E.myclass][selectedSpell] = nil
end
selectedSpell = nil
UpdateFilterGroup()
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
UF:UpdateAuraWatchFromHeader("raidpet", true)
end,
disabled = function() return not selectedSpell end
},
quickSearch = {
order = 3,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
values = function()
local values = {}
local list = E.global.unitframe.buffwatch[E.myclass]
if not list then return end
local searchText = quickSearchText:lower()
for _, spell in pairs(list) do
if spell.id then
local name = GetSpellInfo(spell.id)
if name and name:lower():find(searchText) then values[spell.id] = name end
end
end
return values
end,
get = function(info) return selectedSpell end,
set = function(info, value)
selectedSpell = value
UpdateFilterGroup()
end
}
}
}
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function(info)
E.global.unitframe.buffwatch[E.myclass] = E:CopyTable({}, G.unitframe.buffwatch[E.myclass])
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
if selectedSpell then
local name = GetSpellInfo(selectedSpell)
E.Options.args.filters.args.filterGroup.args[name] = {
order = -10,
type = "group",
name = name.." ("..selectedSpell..")",
get = function(info) return E.global.unitframe.buffwatch[E.myclass][selectedSpell][info[#info]] end,
set = function(info, value)
E.global.unitframe.buffwatch[E.myclass][selectedSpell][info[#info]] = value
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
UF:UpdateAuraWatchFromHeader("raidpet", true)
end,
args = {
enabled = {
order = 0,
type = "toggle",
name = L["Enable"]
},
point = {
order = 1,
type = "select",
name = L["Anchor Point"],
values = {
["TOPLEFT"] = "TOPLEFT",
["TOPRIGHT"] = "TOPRIGHT",
["BOTTOMLEFT"] = "BOTTOMLEFT",
["BOTTOMRIGHT"] = "BOTTOMRIGHT",
["LEFT"] = "LEFT",
["RIGHT"] = "RIGHT",
["TOP"] = "TOP",
["BOTTOM"] = "BOTTOM"
}
},
sizeOverride = {
order = 2,
type = "range",
name = L["Size Override"],
min = 0, max = 50, step = 1
},
xOffset = {
order = 3,
type = "range",
name = L["xOffset"],
min = -75, max = 75, step = 1
},
yOffset = {
order = 4,
type = "range",
name = L["yOffset"],
min = -75, max = 75, step = 1
},
style = {
order = 5,
type = "select",
name = L["Style"],
values = {
["coloredIcon"] = L["Colored Icon"],
["texturedIcon"] = L["Textured Icon"],
["NONE"] = L["NONE"]
}
},
color = {
order = 6,
type = "color",
name = L["COLOR"],
get = function(info)
local t = E.global.unitframe.buffwatch[E.myclass][selectedSpell][info[#info]]
return t.r, t.g, t.b, t.a
end,
set = function(info, r, g, b)
local t = E.global.unitframe.buffwatch[E.myclass][selectedSpell][info[#info]]
t.r, t.g, t.b = r, g, b
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
UF:UpdateAuraWatchFromHeader("raidpet", true)
end
},
displayText = {
order = 7,
type = "toggle",
name = L["Display Text"]
},
textColor = {
order = 8,
type = "color",
name = L["Text Color"],
get = function(info)
local t = E.global.unitframe.buffwatch[E.myclass][selectedSpell][info[#info]]
if t then
return t.r, t.g, t.b, t.a
else
return 1, 1, 1, 1
end
end,
set = function(info, r, g, b)
E.global.unitframe.buffwatch[E.myclass][selectedSpell].textColor = E.global.unitframe.buffwatch[E.myclass][selectedSpell].textColor or {}
local t = E.global.unitframe.buffwatch[E.myclass][selectedSpell].textColor
t.r, t.g, t.b = r, g, b
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
UF:UpdateAuraWatchFromHeader("raidpet", true)
end
},
decimalThreshold = {
order = 9,
type = "range",
name = L["Decimal Threshold"],
desc = L["Threshold before text goes into decimal form. Set to -1 to disable decimals."],
min = -1, max = 10, step = 1
},
textThreshold = {
order = 10,
type = "range",
name = L["Text Threshold"],
desc = L["At what point should the text be displayed. Set to -1 to disable."],
min = -1, max = 60, step = 1
},
anyUnit = {
order = 11,
type = "toggle",
name = L["Show Aura From Other Players"]
},
onlyShowMissing = {
order = 12,
type = "toggle",
name = L["Show When Not Active"]
}
}
}
end
elseif selectedFilter == "Buff Indicator (Profile)" then
E.Options.args.filters.args.filterGroup = {
order = 15,
type = "group",
name = selectedFilter,
guiInline = true,
childGroups = "select",
args = {
addSpellID = {
order = 1,
type = "input",
name = L["Add SpellID"],
desc = L["Add a spell to the filter."],
get = function(info) return "" end,
set = function(info, value)
if not tonumber(value) then
E:Print(L["Value must be a number"])
elseif not GetSpellInfo(value) then
E:Print(L["Not valid spell id"])
else
E.db.unitframe.filters.buffwatch[tonumber(value)] = {["enabled"] = true, ["id"] = tonumber(value), ["point"] = "TOPRIGHT", ["color"] = {["r"] = 1, ["g"] = 0, ["b"] = 0}, ["anyUnit"] = false, ["style"] = "coloredIcon", ["xOffset"] = 0, ["yOffset"] = 0}
selectedSpell = nil
UpdateFilterGroup()
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
end
end
},
removeSpellID = {
order = 2,
type = "execute",
name = L["Remove SpellID"],
desc = L["Remove a spell from the filter."],
func = function()
if P.unitframe.filters.buffwatch[selectedSpell] then
E.db.unitframe.filters.buffwatch[selectedSpell].enabled = false
E:Print(L["You may not remove a spell from a default filter that is not customly added. Setting spell to false instead."])
else
E.db.unitframe.filters.buffwatch[selectedSpell] = nil
end
selectedSpell = nil
UpdateFilterGroup()
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
end,
disabled = function() return not selectedSpell end
},
quickSearch = {
order = 3,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
values = function()
local values = {}
local list = E.db.unitframe.filters.buffwatch
if not list then return end
local searchText = quickSearchText:lower()
for _, spell in pairs(list) do
if spell.id then
local name = GetSpellInfo(spell.id)
if name:lower():find(searchText) then values[spell.id] = name end
end
end
return values
end,
get = function(info) return selectedSpell end,
set = function(info, value)
selectedSpell = value
UpdateFilterGroup()
end
}
}
}
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function(info)
E.db.unitframe.filters.buffwatch = {}
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
if selectedSpell then
local name = GetSpellInfo(selectedSpell)
E.Options.args.filters.args.filterGroup.args[name] = {
order = -10,
type = "group",
name = name.." ("..selectedSpell..")",
hidden = function() return not E.db.unitframe.filters.buffwatch[selectedSpell] end,
get = function(info)
if E.db.unitframe.filters.buffwatch[selectedSpell] then
return E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]]
end
end,
set = function(info, value)
E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]] = value
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
end,
args = {
enabled = {
order = 0,
type = "toggle",
name = L["Enable"]
},
point = {
order = 1,
type = "select",
name = L["Anchor Point"],
values = {
["TOPLEFT"] = "TOPLEFT",
["TOPRIGHT"] = "TOPRIGHT",
["BOTTOMLEFT"] = "BOTTOMLEFT",
["BOTTOMRIGHT"] = "BOTTOMRIGHT",
["LEFT"] = "LEFT",
["RIGHT"] = "RIGHT",
["TOP"] = "TOP",
["BOTTOM"] = "BOTTOM"
}
},
sizeOverride = {
order = 2,
type = "range",
name = L["Size Override"],
min = 0, max = 50, step = 1
},
xOffset = {
order = 3,
type = "range",
name = L["xOffset"],
min = -75, max = 75, step = 1
},
yOffset = {
order = 4,
type = "range",
name = L["yOffset"],
min = -75, max = 75, step = 1
},
style = {
order = 5,
type = "select",
name = L["Style"],
values = {
["coloredIcon"] = L["Colored Icon"],
["texturedIcon"] = L["Textured Icon"],
["NONE"] = L["NONE"]
}
},
color = {
order = 6,
type = "color",
name = L["COLOR"],
get = function(info)
if E.db.unitframe.filters.buffwatch[selectedSpell] then
local t = E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]]
return t.r, t.g, t.b, t.a
end
end,
set = function(info, r, g, b)
local t = E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]]
t.r, t.g, t.b = r, g, b
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
end
},
displayText = {
order = 7,
type = "toggle",
name = L["Display Text"]
},
textColor = {
order = 8,
type = "color",
name = L["Text Color"],
get = function(info)
if E.db.unitframe.filters.buffwatch[selectedSpell] then
local t = E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]]
if t then
return t.r, t.g, t.b, t.a
else
return 1, 1, 1, 1
end
end
end,
set = function(info, r, g, b)
local t = E.db.unitframe.filters.buffwatch[selectedSpell][info[#info]]
t.r, t.g, t.b = r, g, b
UF:UpdateAuraWatchFromHeader("raid")
UF:UpdateAuraWatchFromHeader("raid40")
UF:UpdateAuraWatchFromHeader("party")
end
},
decimalThreshold = {
order = 9,
type = "range",
name = L["Decimal Threshold"],
desc = L["Threshold before text goes into decimal form. Set to -1 to disable decimals."],
min = -1, max = 10, step = 1
},
textThreshold = {
order = 10,
type = "range",
name = L["Text Threshold"],
desc = L["At what point should the text be displayed. Set to -1 to disable."],
min = -1, max = 60, step = 1
},
anyUnit = {
order = 11,
type = "toggle",
name = L["Show Aura From Other Players"]
},
onlyShowMissing = {
order = 12,
type = "toggle",
name = L["Show When Not Active"]
}
}
}
end
else
if not selectedFilter or not E.global.unitframe.aurafilters[selectedFilter] then
E.Options.args.filters.args.filterGroup = nil
E.Options.args.filters.args.spellGroup = nil
E.Options.args.filters.args.resetGroup = nil
return
end
E.Options.args.filters.args.filterGroup = {
order = 10,
type = "group",
name = selectedFilter,
guiInline = true,
args = {
addSpell = {
order = 1,
type = "input",
name = L["Add Spell ID or Name"],
desc = L["Add a spell to the filter. Use spell ID if you don't want to match all auras which share the same name."],
get = function(info) return "" end,
set = function(info, value)
if tonumber(value) then value = tonumber(value) end
if not E.global.unitframe.aurafilters[selectedFilter].spells[value] then
E.global.unitframe.aurafilters[selectedFilter].spells[value] = {
["enable"] = true,
["priority"] = 0,
["stackThreshold"] = 0
}
end
UpdateFilterGroup()
UF:Update_AllFrames()
end
},
removeSpell = {
order = 2,
type = "execute",
name = L["Remove Spell"],
desc = L["Remove a spell from the filter. Use the spell ID if you see the ID as part of the spell name in the filter."],
func = function()
local value = selectedSpell:match(" %((%d+)%)$") or selectedSpell
if tonumber(value) then value = tonumber(value) end
if G.unitframe.aurafilters[selectedFilter] then
if G.unitframe.aurafilters[selectedFilter].spells[value] then
E.global.unitframe.aurafilters[selectedFilter].spells[value].enable = false
E:Print(L["You may not remove a spell from a default filter that is not customly added. Setting spell to false instead."])
else
E.global.unitframe.aurafilters[selectedFilter].spells[value] = nil
end
else
E.global.unitframe.aurafilters[selectedFilter].spells[value] = nil
end
UpdateFilterGroup()
UF:Update_AllFrames()
end,
disabled = function() return not (selectedSpell and selectedSpell ~= "") end
},
filterType = {
order = 3,
type = "select",
name = L["Filter Type"],
desc = L["Set the filter type. Blacklist will hide any auras in the list and show all others. Whitelist will show any auras in the filter and hide all others."],
values = {
["Whitelist"] = L["Whitelist"],
["Blacklist"] = L["Blacklist"]
},
get = function() return E.global.unitframe.aurafilters[selectedFilter].type end,
set = function(info, value) E.global.unitframe.aurafilters[selectedFilter].type = value UF:Update_AllFrames() end
},
quickSearch = {
order = 4,
type = "input",
name = L["Filter Search"],
desc = L["Search for a spell name inside of a filter."],
get = function() return quickSearchText end,
set = function(info,value) quickSearchText = value end
},
selectSpell = {
order = 10,
type = "select",
name = L["Select Spell"],
width = "double",
guiInline = true,
get = function(info) return selectedSpell end,
set = function(info, value)
selectedSpell = value
UpdateFilterGroup()
end,
values = function()
local filters = {}
local list = E.global.unitframe.aurafilters[selectedFilter].spells
if not list then return end
local searchText = quickSearchText:lower()
for filter in pairs(list) do
if tonumber(filter) then
local spellName = GetSpellInfo(filter)
if spellName then
filter = format("%s (%s)", spellName, filter)
else
filter = tostring(filter)
end
end
if filter:lower():find(searchText) then filters[filter] = filter end
end
if not next(filters) then filters[""] = L["NONE"] end
return filters
end
}
}
}
if E.DEFAULT_FILTER[selectedFilter] then
--Disable and hide filter type option for default filters
E.Options.args.filters.args.filterGroup.args.filterType.disabled = true
E.Options.args.filters.args.filterGroup.args.filterType.hidden = true
--Add button to reset content of the filter back to default
E.Options.args.filters.args.resetGroup = {
order = 25,
type = "group",
name = L["Reset Filter"],
guiInline = true,
args = {
enableReset = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function(info) return FilterResetState[selectedFilter] end,
set = function(info, value)
FilterResetState[selectedFilter] = value
E.Options.args.filters.args.resetGroup.args.resetFilter.disabled = (not value)
end
},
resetFilter = {
order = 2,
type = "execute",
name = L["Reset Filter"],
desc = L["This will reset the contents of this filter back to default. Any spell you have added to this filter will be removed."],
disabled = function() return not FilterResetState[selectedFilter] end,
func = function()
E.global.unitframe.aurafilters[selectedFilter].spells = E:CopyTable({}, G.unitframe.aurafilters[selectedFilter].spells)
selectedSpell = nil
UpdateFilterGroup()
UF:Update_AllFrames()
end
}
}
}
end
local spellID = selectedSpell and match(selectedSpell, "(%d+)")
if spellID then spellID = tonumber(spellID) end
if not selectedSpell or not E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)] then
E.Options.args.filters.args.spellGroup = nil
return
end
E.Options.args.filters.args.spellGroup = {
order = 15,
type = "group",
name = selectedSpell,
guiInline = true,
args = {
enable = {
order = 1,
type = "toggle",
name = L["Enable"],
get = function()
if not (spellID or selectedSpell) then
return false
else
return E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].enable
end
end,
set = function(info, value) E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].enable = value UpdateFilterGroup() UF:Update_AllFrames() end
},
forDebuffIndicator = {
order = 2,
type = "group",
name = L["Used as RaidDebuff Indicator"],
guiInline = true,
args = {
priority = {
order = 1,
type = "range",
name = L["Priority"],
desc = L["Set the priority order of the spell, please note that prioritys are only used for the raid debuff module, not the standard buff/debuff module. If you want to disable set to zero."],
min = 0, max = 99, step = 1,
get = function()
if not selectedSpell then
return 0
else
return E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].priority
end
end,
set = function(info, value) E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].priority = value UpdateFilterGroup() UF:Update_AllFrames() end
},
stackThreshold = {
order = 2,
type = "range",
name = L["Stack Threshold"],
desc = L["The debuff needs to reach this amount of stacks before it is shown. Set to 0 to always show the debuff."],
min = 0, max = 99, step = 1,
get = function()
if not selectedSpell then
return 0
else
return E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].stackThreshold
end
end,
set = function(info, value) E.global.unitframe.aurafilters[selectedFilter].spells[(spellID or selectedSpell)].stackThreshold = value UpdateFilterGroup() UF:Update_AllFrames() end
}
}
}
}
}
end
UF:Update_AllFrames()
end
E.Options.args.filters = {
order = -10, --Always Last Hehehe
type = "group",
name = L["FILTERS"],
args = {
createFilter = {
order = 1,
type = "input",
name = L["Create Filter"],
desc = L["Create a filter, once created a filter can be set inside the buffs/debuffs section of each unit."],
get = function(info) return "" end,
set = function(info, value)
if match(value, "^[%s%p]-$") then
return
end
if match(value, ",") then
E:Print(L["Filters are not allowed to have commas in their name. Stripping commas from filter name."])
value = gsub(value, ",", "")
end
if match(value, "^Friendly:") or match(value, "^Enemy:") then
return --dont allow people to create Friendly: or Enemy: filters
end
if G.unitframe.specialFilters[value] or E.global.unitframe.aurafilters[value] then
E:Print(L["Filter already exists!"])
return
end
E.global.unitframe.aurafilters[value] = {}
E.global.unitframe.aurafilters[value].spells = {}
end
},
selectFilter = {
order = 2,
type = "select",
name = L["Select Filter"],
get = function(info) return selectedFilter end,
set = function(info, value)
if value == "" then
selectedFilter = nil
selectedSpell = nil
else
selectedSpell = nil
if FilterResetState[selectedFilter] then
FilterResetState[selectedFilter] = nil
end
selectedFilter = value
end
quickSearchText = ""
UpdateFilterGroup()
end,
values = function()
local filters = {}
filters[""] = L["NONE"]
local list = E.global.unitframe.aurafilters
if not list then return end
for filter in pairs(list) do
filters[filter] = filter
end
filters["Buff Indicator"] = "Buff Indicator"
filters["Buff Indicator (Pet)"] = "Buff Indicator (Pet)"
filters["Buff Indicator (Profile)"] = "Buff Indicator (Profile)"
filters["AuraBar Colors"] = "AuraBar Colors"
filters["Debuff Highlight"] = "Debuff Highlight"
return filters
end
},
deleteFilter = {
order = 3,
type = "execute",
name = L["Delete Filter"],
desc = L["Delete a created filter, you cannot delete pre-existing filters, only custom ones."],
func = function()
E.global.unitframe.aurafilters[selectedFilter] = nil
removePriority(selectedFilter) --This will wipe a filter from the new aura system profile settings.
selectedFilter = nil
selectedSpell = nil
quickSearchText = ""
E.Options.args.filters.args.filterGroup = nil
end,
disabled = function() return G.unitframe.aurafilters[selectedFilter] end,
hidden = function() return selectedFilter == nil end
}
}
}
function E:SetToFilterConfig(filter)
selectedFilter = filter or "Buff Indicator"
UpdateFilterGroup()
E.Libs.AceConfigDialog:SelectGroup("ElvUI", "filters")
end