Skip to content

Commit 0ecb6e7

Browse files
committed
filter improvements
1 parent 79f562e commit 0ecb6e7

3 files changed

Lines changed: 81 additions & 20 deletions

File tree

Core/Config/GUI.lua

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,55 @@ local function GetAuraFilterToggleOrder(auraDB)
6363
return auraFilters
6464
end
6565

66-
local function ParseAuraFilterSelections(auraDB, filterString)
66+
local function ResolveAuraFilterSelectionKey(auraDB, filterString)
6767
local auraFilterConfig = GetAuraFilterConfig(auraDB)
6868
local baseFilter = GetAuraBaseFilter(auraDB)
69-
local selectedFilters = {}
70-
if type(filterString) ~= "string" then return selectedFilters end
69+
if type(filterString) ~= "string" then return nil end
7170
local decodedFilterString = filterString:gsub("||", "|")
71+
72+
if decodedFilterString ~= baseFilter and auraFilterConfig[decodedFilterString] then
73+
return decodedFilterString
74+
end
75+
7276
for filterType in decodedFilterString:gmatch("[^|]+") do
73-
if filterType ~= baseFilter and auraFilterConfig[filterType] then
74-
selectedFilters[filterType] = true
77+
if filterType ~= baseFilter then
78+
if auraFilterConfig[filterType] then
79+
return filterType
80+
end
81+
local baseQualifiedFilter = baseFilter .. "|" .. filterType
82+
if auraFilterConfig[baseQualifiedFilter] then
83+
return baseQualifiedFilter
84+
end
7585
end
7686
end
87+
88+
return nil
89+
end
90+
91+
local function ParseAuraFilterSelections(auraDB, filterString)
92+
local selectedFilters = {}
93+
local selectedFilter = ResolveAuraFilterSelectionKey(auraDB, filterString)
94+
if selectedFilter then selectedFilters[selectedFilter] = true end
7795
return selectedFilters
7896
end
7997

80-
local function BuildAuraFilterString(baseFilter, selectedFilters, orderedFilters)
81-
local filterParts = {baseFilter}
98+
local function GetSelectedAuraFilter(selectedFilters, orderedFilters)
8299
for _, filterType in ipairs(orderedFilters) do
83100
if selectedFilters[filterType] then
84-
filterParts[#filterParts + 1] = filterType
101+
return filterType
85102
end
86103
end
87-
return table.concat(filterParts, "|")
104+
end
105+
106+
local function SetSelectedAuraFilter(selectedFilters, orderedFilters, selectedFilter)
107+
for _, filterType in ipairs(orderedFilters) do
108+
selectedFilters[filterType] = filterType == selectedFilter and true or nil
109+
end
110+
end
111+
112+
local function BuildAuraFilterString(baseFilter, selectedFilters, orderedFilters)
113+
local selectedFilter = GetSelectedAuraFilter(selectedFilters, orderedFilters)
114+
return selectedFilter or baseFilter
88115
end
89116

90117
local function EncodeAuraFilterStringForStorage(filterString)
@@ -2275,6 +2302,8 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
22752302
local auraFilterConfig = GetAuraFilterConfig(auraDB)
22762303
local auraFilterOrder = GetAuraFilterToggleOrder(auraDB)
22772304
local auraFilterSelections = ParseAuraFilterSelections(auraDB, AuraDB.Filter or auraBaseFilter)
2305+
local auraFilterToggles = {}
2306+
local isUpdatingAuraFilterToggles = false
22782307

22792308
local function UpdateAuraFilter()
22802309
local builtFilter = BuildAuraFilterString(auraBaseFilter, auraFilterSelections, auraFilterOrder)
@@ -2286,6 +2315,19 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
22862315
end
22872316
end
22882317

2318+
local function RefreshAuraFilterToggles()
2319+
local selectedFilter = GetSelectedAuraFilter(auraFilterSelections, auraFilterOrder)
2320+
isUpdatingAuraFilterToggles = true
2321+
for _, filterType in ipairs(auraFilterOrder) do
2322+
local filterToggle = auraFilterToggles[filterType]
2323+
if filterToggle then
2324+
filterToggle:SetValue(auraFilterSelections[filterType] or false)
2325+
filterToggle:SetDisabled(selectedFilter and selectedFilter ~= filterType)
2326+
end
2327+
end
2328+
isUpdatingAuraFilterToggles = false
2329+
end
2330+
22892331
local normalizedAuraFilter = EncodeAuraFilterStringForStorage(BuildAuraFilterString(auraBaseFilter, auraFilterSelections, auraFilterOrder))
22902332
if AuraDB.Filter ~= normalizedAuraFilter then
22912333
AuraDB.Filter = normalizedAuraFilter
@@ -2307,11 +2349,19 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
23072349
FilterToggle:SetValue(auraFilterSelections[filterType] or false)
23082350
FilterToggle:SetRelativeWidth(1.0)
23092351
FilterToggle:SetCallback("OnValueChanged", function(_, _, value)
2310-
auraFilterSelections[filterType] = value and true or nil
2352+
if isUpdatingAuraFilterToggles then return end
2353+
if value then
2354+
SetSelectedAuraFilter(auraFilterSelections, auraFilterOrder, filterType)
2355+
else
2356+
auraFilterSelections[filterType] = nil
2357+
end
2358+
RefreshAuraFilterToggles()
23112359
UpdateAuraFilter()
23122360
end)
2361+
auraFilterToggles[filterType] = FilterToggle
23132362
AuraContainer:AddChild(FilterToggle)
23142363
end
2364+
RefreshAuraFilterToggles()
23152365

23162366
local LayoutContainer = GUIWidgets.CreateInlineGroup(containerParent, "Layout & Positioning")
23172367

@@ -2452,6 +2502,7 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
24522502
GUIWidgets.DeepDisable(AuraContainer, false, Toggle)
24532503
GUIWidgets.DeepDisable(LayoutContainer, false, Toggle)
24542504
GUIWidgets.DeepDisable(CountContainer, false, Toggle)
2505+
RefreshAuraFilterToggles()
24552506
else
24562507
GUIWidgets.DeepDisable(AuraContainer, true, Toggle)
24572508
GUIWidgets.DeepDisable(LayoutContainer, true, Toggle)

Core/Globals.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,16 +422,16 @@ end
422422
UUF.AURA_FILTERS = {
423423
Buffs = {
424424
["HELPFUL"] = {Title = "Helpful", Desc = "Buffs"},
425-
["PLAYER"] = {Title = "Player", Desc = "Buffs applied by the Player"},
426-
["RAID"] = {Title = "Raid", Desc = "|cFF40FF40Helpful|r: Buffs filtered by the Player's Class."},
425+
["HELPFUL|PLAYER"] = {Title = "Player", Desc = "Buffs applied by the Player"},
426+
["HELPFUL|RAID"] = {Title = "Raid", Desc = "|cFF40FF40Helpful|r: Buffs filtered by the Player's Class."},
427427
["EXTERNAL_DEFENSIVE"] = {Title = "External Defensives", Desc = "Externals."},
428428
["BIG_DEFENSIVE"] = {Title = "Big Defensives", Desc = "Big Defensive Buffs."},
429429
["IMPORTANT"] = {Title = "Important", Desc = "Important Buffs. Flagged by |cFF00B0F7Blizzard|r."},
430430
},
431431
Debuffs = {
432432
["HARMFUL"] = {Title = "Harmful", Desc = "Debuffs"},
433-
["PLAYER"] = {Title = "Player", Desc = "Debuffs applied by the Player"},
434-
["RAID"] = {Title = "Raid", Desc = "|cFFFF4040Harmful|r: Debuffs that show up on Raid Frames."},
433+
["HARMFUL|PLAYER"] = {Title = "Player", Desc = "Debuffs applied by the Player"},
434+
["HARMFUL|RAID"] = {Title = "Raid", Desc = "|cFFFF4040Harmful|r: Debuffs that show up on Raid Frames."},
435435
["CROWD_CONTROL"] = {Title = "Crowd Control", Desc = "Crowd Control Effects."},
436436
["RAID_PLAYER_DISPELLABLE"] = {Title = "Player Dispellable", Desc = "Auras that the Player can dispel."},
437437
["IMPORTANT"] = {Title = "Important", Desc = "Important Debuffs. Flagged by |cFF00B0F7Blizzard|r."},

Elements/Auras.lua

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,27 @@ local function EncodeAuraFilterStringForStorage(filterString)
5252
end
5353

5454
local function NormalizeAuraFilter(filterString, baseFilter, auraFilterConfig)
55-
local normalizedFilter = {baseFilter}
56-
local seen = {}
5755
local decodedFilterString = DecodeAuraFilterString(filterString)
5856
if type(decodedFilterString) ~= "string" then return baseFilter end
57+
58+
if auraFilterConfig and decodedFilterString ~= baseFilter and auraFilterConfig[decodedFilterString] then
59+
return decodedFilterString
60+
end
61+
5962
for filterType in decodedFilterString:gmatch("[^|]+") do
60-
if filterType ~= baseFilter and auraFilterConfig and auraFilterConfig[filterType] and not seen[filterType] then
61-
normalizedFilter[#normalizedFilter + 1] = filterType
62-
seen[filterType] = true
63+
if filterType ~= baseFilter and auraFilterConfig then
64+
if auraFilterConfig[filterType] then
65+
return filterType
66+
end
67+
68+
local baseQualifiedFilter = baseFilter .. "|" .. filterType
69+
if auraFilterConfig[baseQualifiedFilter] then
70+
return baseQualifiedFilter
71+
end
6372
end
6473
end
65-
return table.concat(normalizedFilter, "|")
74+
75+
return baseFilter
6676
end
6777

6878
local function StyleAuras(_, button, unit, auraType)

0 commit comments

Comments
 (0)