@@ -34,6 +34,92 @@ local UnitDBToUnitPrettyName = {
3434local AnchorPoints = { { [" TOPLEFT" ] = " Top Left" , [" TOP" ] = " Top" , [" TOPRIGHT" ] = " Top Right" , [" LEFT" ] = " Left" , [" CENTER" ] = " Center" , [" RIGHT" ] = " Right" , [" BOTTOMLEFT" ] = " Bottom Left" , [" BOTTOM" ] = " Bottom" , [" BOTTOMRIGHT" ] = " Bottom Right" }, { " TOPLEFT" , " TOP" , " TOPRIGHT" , " LEFT" , " CENTER" , " RIGHT" , " BOTTOMLEFT" , " BOTTOM" , " BOTTOMRIGHT" , } }
3535local FrameStrataList = {{ [" BACKGROUND" ] = " Background" , [" LOW" ] = " Low" , [" MEDIUM" ] = " Medium" , [" HIGH" ] = " High" , [" DIALOG" ] = " Dialog" , [" FULLSCREEN" ] = " Fullscreen" , [" FULLSCREEN_DIALOG" ] = " Fullscreen Dialog" , [" TOOLTIP" ] = " Tooltip" }, { " BACKGROUND" , " LOW" , " MEDIUM" , " HIGH" , " DIALOG" , " FULLSCREEN" , " FULLSCREEN_DIALOG" , " TOOLTIP" }}
3636
37+ local function GetAuraBaseFilter (auraDB )
38+ return auraDB == " Buffs" and " HELPFUL" or " HARMFUL"
39+ end
40+
41+ local function GetAuraFilterConfig (auraDB )
42+ if not UUF .AURA_FILTERS or type (UUF .AURA_FILTERS [auraDB ]) ~= " table" then
43+ return {}
44+ end
45+ return UUF .AURA_FILTERS [auraDB ]
46+ end
47+
48+ local function GetAuraFilterToggleOrder (auraDB )
49+ local auraFilterConfig = GetAuraFilterConfig (auraDB )
50+ local baseFilter = GetAuraBaseFilter (auraDB )
51+ local auraFilters = {}
52+ for filterType , filterData in pairs (auraFilterConfig ) do
53+ if filterType ~= baseFilter and type (filterData ) == " table" then
54+ auraFilters [# auraFilters + 1 ] = filterType
55+ end
56+ end
57+ table.sort (auraFilters , function (a , b )
58+ local auraFilterA = (auraFilterConfig [a ] and auraFilterConfig [a ].Title ) or a
59+ local auraFilterB = (auraFilterConfig [b ] and auraFilterConfig [b ].Title ) or b
60+ if auraFilterA == auraFilterB then return a < b end
61+ return auraFilterA < auraFilterB
62+ end )
63+ return auraFilters
64+ end
65+
66+ local function ResolveAuraFilterSelectionKey (auraDB , filterString )
67+ local auraFilterConfig = GetAuraFilterConfig (auraDB )
68+ local baseFilter = GetAuraBaseFilter (auraDB )
69+ if type (filterString ) ~= " string" then return nil end
70+ local decodedFilterString = filterString :gsub (" ||" , " |" )
71+
72+ if decodedFilterString ~= baseFilter and auraFilterConfig [decodedFilterString ] then
73+ return decodedFilterString
74+ end
75+
76+ for filterType in decodedFilterString :gmatch (" [^|]+" ) do
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
85+ end
86+ 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
95+ return selectedFilters
96+ end
97+
98+ local function GetSelectedAuraFilter (selectedFilters , orderedFilters )
99+ for _ , filterType in ipairs (orderedFilters ) do
100+ if selectedFilters [filterType ] then
101+ return filterType
102+ end
103+ end
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
115+ end
116+
117+ local function EncodeAuraFilterStringForStorage (filterString )
118+ if type (filterString ) ~= " string" then return " " end
119+ local decodedFilterString = filterString :gsub (" ||" , " |" )
120+ return decodedFilterString :gsub (" |" , " ||" )
121+ end
122+
37123local Power = {
38124 [0 ] = " Mana" ,
39125 [1 ] = " Rage" ,
@@ -2198,48 +2284,84 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
21982284 Toggle :SetRelativeWidth (0.33 )
21992285 AuraContainer :AddChild (Toggle )
22002286
2201- local OnlyShowPlayerToggle = AG :Create (" CheckBox" )
2202- OnlyShowPlayerToggle :SetLabel (" Only Show Player " .. auraDB )
2203- OnlyShowPlayerToggle :SetValue (AuraDB .OnlyShowPlayer )
2204- OnlyShowPlayerToggle :SetCallback (" OnValueChanged" , function (_ , _ , value ) AuraDB .OnlyShowPlayer = value if unit == " boss" then UUF :UpdateBossFrames () else UUF :UpdateUnitAuras (UUF [unit :upper ()], unit , auraDB ) end end )
2205- OnlyShowPlayerToggle :SetRelativeWidth (0.33 )
2206- AuraContainer :AddChild (OnlyShowPlayerToggle )
2207-
2208- local ShowTypeCheckbox = AG :Create (" CheckBox" )
2209- ShowTypeCheckbox :SetLabel (auraDB .. " Type Border" )
2210- ShowTypeCheckbox :SetValue (AuraDB .ShowType )
2211- ShowTypeCheckbox :SetCallback (" OnValueChanged" , function (_ , _ , value ) AuraDB .ShowType = value if unit == " boss" then UUF :UpdateBossFrames () else UUF :UpdateUnitAuras (UUF [unit :upper ()], unit , auraDB ) end end )
2212- ShowTypeCheckbox :SetRelativeWidth (0.33 )
2213- AuraContainer :AddChild (ShowTypeCheckbox )
2214-
2215- local FilterDropdown = AG : Create ( " Dropdown " )
2216- if auraDB == " Buffs " then
2217- FilterDropdown : SetList ({
2218- [ " HELPFUL " ] = " All " ,
2219- [ " HELPFUL|PLAYER " ] = " Player " ,
2220- [ " HELPFUL|RAID " ] = " Raid " ,
2221- [ " INCLUDE_NAME_PLATE_ONLY " ] = " Nameplate " ,
2222- } )
2223- else
2224- FilterDropdown : SetList ({
2225- [ " HARMFUL " ] = " All " ,
2226- [ " HARMFUL|PLAYER " ] = " Player " ,
2227- [ " HARMFUL|RAID " ] = " Raid " ,
2228- [ " INCLUDE_NAME_PLATE_ONLY " ] = " Nameplate " ,
2229- })
2287+ -- local OnlyShowPlayerToggle = AG:Create("CheckBox")
2288+ -- OnlyShowPlayerToggle:SetLabel("Only Show Player "..auraDB)
2289+ -- OnlyShowPlayerToggle:SetValue(AuraDB.OnlyShowPlayer)
2290+ -- OnlyShowPlayerToggle:SetCallback("OnValueChanged", function(_, _, value) AuraDB.OnlyShowPlayer = value if unit == "boss" then UUF:UpdateBossFrames() else UUF:UpdateUnitAuras(UUF[unit:upper()], unit, auraDB) end end)
2291+ -- OnlyShowPlayerToggle:SetRelativeWidth(0.33)
2292+ -- AuraContainer:AddChild(OnlyShowPlayerToggle)
2293+
2294+ -- local ShowTypeCheckbox = AG:Create("CheckBox")
2295+ -- ShowTypeCheckbox:SetLabel(auraDB .. " Type Border")
2296+ -- ShowTypeCheckbox:SetValue(AuraDB.ShowType)
2297+ -- ShowTypeCheckbox:SetCallback("OnValueChanged", function(_, _, value) AuraDB.ShowType = value if unit == "boss" then UUF:UpdateBossFrames() else UUF:UpdateUnitAuras(UUF[unit:upper()], unit, auraDB) end end)
2298+ -- ShowTypeCheckbox:SetRelativeWidth(0.33)
2299+ -- AuraContainer:AddChild(ShowTypeCheckbox)
2300+
2301+ local auraBaseFilter = GetAuraBaseFilter ( auraDB )
2302+ local auraFilterConfig = GetAuraFilterConfig ( auraDB )
2303+ local auraFilterOrder = GetAuraFilterToggleOrder ( auraDB )
2304+ local auraFilterSelections = ParseAuraFilterSelections ( auraDB , AuraDB . Filter or auraBaseFilter )
2305+ local auraFilterToggles = {}
2306+ local isUpdatingAuraFilterToggles = false
2307+
2308+ local function UpdateAuraFilter ( )
2309+ local builtFilter = BuildAuraFilterString ( auraBaseFilter , auraFilterSelections , auraFilterOrder )
2310+ AuraDB . Filter = EncodeAuraFilterStringForStorage ( builtFilter )
2311+ if unit == " boss " then
2312+ UUF : UpdateBossFrames ()
2313+ else
2314+ UUF : UpdateUnitAuras ( UUF [ unit : upper ()], unit , auraDB )
2315+ end
22302316 end
2231- FilterDropdown :SetLabel (" Aura Filter" )
2232- FilterDropdown :SetValue (AuraDB .Filter or (auraDB == " Buffs" and " HELPFUL" or " HARMFUL" ))
2233- FilterDropdown :SetRelativeWidth (1.0 )
2234- FilterDropdown :SetCallback (" OnValueChanged" , function (_ , _ , value )
2235- AuraDB .Filter = value
2317+
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+
2331+ local normalizedAuraFilter = EncodeAuraFilterStringForStorage (BuildAuraFilterString (auraBaseFilter , auraFilterSelections , auraFilterOrder ))
2332+ if AuraDB .Filter ~= normalizedAuraFilter then
2333+ AuraDB .Filter = normalizedAuraFilter
22362334 if unit == " boss" then
22372335 UUF :UpdateBossFrames ()
22382336 else
22392337 UUF :UpdateUnitAuras (UUF [unit :upper ()], unit , auraDB )
22402338 end
2241- end )
2242- AuraContainer :AddChild (FilterDropdown )
2339+ end
2340+
2341+ GUIWidgets .CreateHeader (AuraContainer , " Aura Filters" )
2342+
2343+ for _ , auraFilter in ipairs (auraFilterOrder ) do
2344+ local filterType = auraFilter
2345+ local filterData = auraFilterConfig [filterType ]
2346+ local FilterToggle = AG :Create (" CheckBox" )
2347+ FilterToggle :SetLabel (filterData .Title or filterType )
2348+ FilterToggle :SetDescription (filterData .Desc or " " )
2349+ FilterToggle :SetValue (auraFilterSelections [filterType ] or false )
2350+ FilterToggle :SetRelativeWidth (1.0 )
2351+ FilterToggle :SetCallback (" OnValueChanged" , function (_ , _ , value )
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 ()
2359+ UpdateAuraFilter ()
2360+ end )
2361+ auraFilterToggles [filterType ] = FilterToggle
2362+ AuraContainer :AddChild (FilterToggle )
2363+ end
2364+ RefreshAuraFilterToggles ()
22432365
22442366 local LayoutContainer = GUIWidgets .CreateInlineGroup (containerParent , " Layout & Positioning" )
22452367
@@ -2380,6 +2502,7 @@ local function CreateSpecificAuraSettings(containerParent, unit, auraDB)
23802502 GUIWidgets .DeepDisable (AuraContainer , false , Toggle )
23812503 GUIWidgets .DeepDisable (LayoutContainer , false , Toggle )
23822504 GUIWidgets .DeepDisable (CountContainer , false , Toggle )
2505+ RefreshAuraFilterToggles ()
23832506 else
23842507 GUIWidgets .DeepDisable (AuraContainer , true , Toggle )
23852508 GUIWidgets .DeepDisable (LayoutContainer , true , Toggle )
@@ -3181,4 +3304,4 @@ function UUFG:CloseUUFGUI()
31813304 if isGUIOpen and Container then
31823305 Container :Hide ()
31833306 end
3184- end
3307+ end
0 commit comments