WoWInterface SVN bdGrid

[/] [trunk/] [lib/] [oUF/] [elements/] [aura.lua] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Blooblahguy-207965
--[[ Element: Auras
2 Blooblahguy-207965
 
3 Blooblahguy-207965
 Handles creation and updating of aura icons.
4 Blooblahguy-207965
 
5 Blooblahguy-207965
 Widget
6 Blooblahguy-207965
 
7 Blooblahguy-207965
 Auras   - A Frame to hold icons representing both buffs and debuffs.
8 Blooblahguy-207965
 Buffs   - A Frame to hold icons representing buffs.
9 Blooblahguy-207965
 Debuffs - A Frame to hold icons representing debuffs.
10 Blooblahguy-207965
 
11 Blooblahguy-207965
 Options
12 Blooblahguy-207965
 
13 Blooblahguy-207965
 .disableCooldown    - Disables the cooldown spiral. Defaults to false.
14 Blooblahguy-207965
 .size               - Aura icon size. Defaults to 16.
15 Blooblahguy-207965
 .onlyShowPlayer     - Only show auras created by player/vehicle.
16 Blooblahguy-207965
 .showStealableBuffs - Display the stealable texture on buffs that can be
17 Blooblahguy-207965
                       stolen.
18 Blooblahguy-207965
 .spacing            - Spacing between each icon. Defaults to 0.
19 Blooblahguy-207965
 .['spacing-x']      - Horizontal spacing between each icon. Takes priority over
20 Blooblahguy-207965
                       `spacing`.
21 Blooblahguy-207965
 .['spacing-y']      - Vertical spacing between each icon. Takes priority over
22 Blooblahguy-207965
                       `spacing`.
23 Blooblahguy-207965
 .['growth-x']       - Horizontal growth direction. Defaults to RIGHT.
24 Blooblahguy-207965
 .['growth-y']       - Vertical growth direction. Defaults to UP.
25 Blooblahguy-207965
 .initialAnchor      - Anchor point for the icons. Defaults to BOTTOMLEFT.
26 Blooblahguy-207965
 .filter             - Custom filter list for auras to display. Defaults to
27 Blooblahguy-207965
                       HELPFUL on buffs and HARMFUL on debuffs.
28 Blooblahguy-207965
 
29 Blooblahguy-207965
 Options Auras
30 Blooblahguy-207965
 
31 Blooblahguy-207965
 .numBuffs     - The maximum number of buffs to display. Defaults to 32.
32 Blooblahguy-207965
 .numDebuffs   - The maximum number of debuffs to display. Defaults to 40.
33 Blooblahguy-207965
 .gap          - Controls the creation of an invisible icon between buffs and
34 Blooblahguy-207965
                 debuffs. Defaults to false.
35 Blooblahguy-207965
 .buffFilter   - Custom filter list for buffs to display. Takes priority over
36 Blooblahguy-207965
                 `filter`.
37 Blooblahguy-207965
 .debuffFilter - Custom filter list for debuffs to display. Takes priority over
38 Blooblahguy-207965
                 `filter`.
39 Blooblahguy-207965
 
40 Blooblahguy-207965
 Options Buffs
41 Blooblahguy-207965
 
42 Blooblahguy-207965
 .num - Number of buffs to display. Defaults to 32.
43 Blooblahguy-207965
 
44 Blooblahguy-207965
 Options Debuffs
45 Blooblahguy-207965
 
46 Blooblahguy-207965
 .num - Number of debuffs to display. Defaults to 40.
47 Blooblahguy-207965
 
48 Blooblahguy-207965
 Examples
49 Blooblahguy-207965
 
50 Blooblahguy-207965
   -- Position and size
51 Blooblahguy-207965
   local Buffs = CreateFrame("Frame", nil, self)
52 Blooblahguy-207965
   Buffs:SetPoint("RIGHT", self, "LEFT")
53 Blooblahguy-207965
   Buffs:SetSize(16 * 2, 16 * 16)
54 Blooblahguy-207965
 
55 Blooblahguy-207965
   -- Register with oUF
56 Blooblahguy-207965
   self.Buffs = Buffs
57 Blooblahguy-207965
 
58 Blooblahguy-207965
 Hooks and Callbacks
59 Blooblahguy-207965
 
60 Blooblahguy-207965
]]
61 Blooblahguy-207965
 
62 Blooblahguy-207965
local parent, ns = ...
63 Blooblahguy-207965
local oUF = ns.oUF
64 Blooblahguy-207965
 
65 Blooblahguy-207965
local VISIBLE = 1
66 Blooblahguy-207965
local HIDDEN = 0
67 Blooblahguy-207965
 
68 Blooblahguy-207965
local UpdateTooltip = function(self)
69 Blooblahguy-207965
        GameTooltip:SetUnitAura(self:GetParent().__owner.unit, self:GetID(), self.filter)
70 Blooblahguy-207965
end
71 Blooblahguy-207965
 
72 Blooblahguy-207965
local OnEnter = function(self)
73 Blooblahguy-207965
        if(not self:IsVisible()) then return end
74 Blooblahguy-207965
 
75 Blooblahguy-207965
        GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
76 Blooblahguy-207965
        self:UpdateTooltip()
77 Blooblahguy-207965
end
78 Blooblahguy-207965
 
79 Blooblahguy-207965
local OnLeave = function()
80 Blooblahguy-207965
        GameTooltip:Hide()
81 Blooblahguy-207965
end
82 Blooblahguy-207965
 
83 Blooblahguy-207965
local createAuraIcon = function(icons, index)
84 Blooblahguy-207965
        icons.createdIcons = icons.createdIcons + 1
85 Blooblahguy-207965
 
86 Blooblahguy-207965
        local button = CreateFrame("Button", nil, icons)
87 Blooblahguy-207965
        button:RegisterForClicks'RightButtonUp'
88 Blooblahguy-207965
 
89 Blooblahguy-207965
        local cd = CreateFrame("Cooldown", nil, button, "CooldownFrameTemplate")
90 Blooblahguy-207965
        cd:SetAllPoints(button)
91 Blooblahguy-207965
 
92 Blooblahguy-207965
        local icon = button:CreateTexture(nil, "BORDER")
93 Blooblahguy-207965
        icon:SetAllPoints(button)
94 Blooblahguy-207965
 
95 Blooblahguy-207965
        local count = button:CreateFontString(nil, "OVERLAY")
96 Blooblahguy-207965
        count:SetFontObject(NumberFontNormal)
97 Blooblahguy-207965
        count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 0)
98 Blooblahguy-207965
 
99 Blooblahguy-207965
        local overlay = button:CreateTexture(nil, "OVERLAY")
100 Blooblahguy-207965
        overlay:SetTexture"Interface\\Buttons\\UI-Debuff-Overlays"
101 Blooblahguy-207965
        overlay:SetAllPoints(button)
102 Blooblahguy-207965
        overlay:SetTexCoord(.296875, .5703125, 0, .515625)
103 Blooblahguy-207965
        button.overlay = overlay
104 Blooblahguy-207965
 
105 Blooblahguy-207965
        local stealable = button:CreateTexture(nil, 'OVERLAY')
106 Blooblahguy-207965
        stealable:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-Stealable]]
107 Blooblahguy-207965
        stealable:SetPoint('TOPLEFT', -3, 3)
108 Blooblahguy-207965
        stealable:SetPoint('BOTTOMRIGHT', 3, -3)
109 Blooblahguy-207965
        stealable:SetBlendMode'ADD'
110 Blooblahguy-207965
        button.stealable = stealable
111 Blooblahguy-207965
 
112 Blooblahguy-207965
        button.UpdateTooltip = UpdateTooltip
113 Blooblahguy-207965
        button:SetScript("OnEnter", OnEnter)
114 Blooblahguy-207965
        button:SetScript("OnLeave", OnLeave)
115 Blooblahguy-207965
 
116 Blooblahguy-207965
        table.insert(icons, button)
117 Blooblahguy-207965
 
118 Blooblahguy-207965
        button.icon = icon
119 Blooblahguy-207965
        button.count = count
120 Blooblahguy-207965
        button.cd = cd
121 Blooblahguy-207965
 
122 Blooblahguy-207965
        --[[ :PostCreateIcon(button)
123 Blooblahguy-207965
 
124 Blooblahguy-207965
         Callback which is called after a new aura icon button has been created.
125 Blooblahguy-207965
 
126 Blooblahguy-207965
         Arguments
127 Blooblahguy-207965
 
128 Blooblahguy-207965
         button - The newly created aura icon button.
129 Blooblahguy-207965
         ]]
130 Blooblahguy-207965
        if(icons.PostCreateIcon) then icons:PostCreateIcon(button) end
131 Blooblahguy-207965
 
132 Blooblahguy-207965
        return button
133 Blooblahguy-207965
end
134 Blooblahguy-207965
 
135 Blooblahguy-207965
local customFilter = function(icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster)
136 Blooblahguy-207965
        if((icons.onlyShowPlayer and icon.isPlayer) or (not icons.onlyShowPlayer and name)) then
137 Blooblahguy-207965
                return true
138 Blooblahguy-207965
        end
139 Blooblahguy-207965
end
140 Blooblahguy-207965
 
141 Blooblahguy-207965
local updateIcon = function(unit, icons, index, offset, filter, isDebuff, visible)
142 Blooblahguy-207965
        local name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff = UnitAura(unit, index, filter)
143 Blooblahguy-207965
        if(name) then
144 Blooblahguy-207965
                local n = visible + offset + 1
145 Blooblahguy-207965
                local icon = icons[n]
146 Blooblahguy-207965
                if(not icon) then
147 Blooblahguy-207965
                        --[[ :CreateIcon(index)
148 Blooblahguy-207965
 
149 Blooblahguy-207965
                         A function which creates the aura icon for a given index.
150 Blooblahguy-207965
 
151 Blooblahguy-207965
                         Arguments
152 Blooblahguy-207965
 
153 Blooblahguy-207965
                         index - The offset the icon should be created at.
154 Blooblahguy-207965
 
155 Blooblahguy-207965
                         Returns
156 Blooblahguy-207965
 
157 Blooblahguy-207965
                         A button used to represent aura icons.
158 Blooblahguy-207965
                        ]]
159 Blooblahguy-207965
                        icon = (icons.CreateIcon or createAuraIcon) (icons, n)
160 Blooblahguy-207965
                end
161 Blooblahguy-207965
 
162 Blooblahguy-207965
                local isPlayer
163 Blooblahguy-207965
                if(caster == 'player' or caster == 'vehicle') then
164 Blooblahguy-207965
                        isPlayer = true
165 Blooblahguy-207965
                end
166 Blooblahguy-207965
 
167 Blooblahguy-207965
                icon.owner = caster
168 Blooblahguy-207965
                icon.filter = filter
169 Blooblahguy-207965
                icon.isDebuff = isDebuff
170 Blooblahguy-207965
                icon.isPlayer = isPlayer
171 Blooblahguy-207965
 
172 Blooblahguy-207965
 
173 Blooblahguy-207965
                --[[ :CustomFilter(unit, icon, ...)
174 Blooblahguy-207965
 
175 Blooblahguy-207965
                 Defines a custom filter which controls if the aura icon should be shown
176 Blooblahguy-207965
                 or not.
177 Blooblahguy-207965
 
178 Blooblahguy-207965
                 Arguments
179 Blooblahguy-207965
 
180 Blooblahguy-207965
                 self - The widget that holds the aura icon.
181 Blooblahguy-207965
                 unit - The unit that has the aura.
182 Blooblahguy-207965
                 icon - The button displaying the aura.
183 Blooblahguy-207965
                 ...  - The return values from
184 Blooblahguy-207965
                 [UnitAura](http://wowprogramming.com/docs/api/UnitAura).
185 Blooblahguy-207965
 
186 Blooblahguy-207965
                 Returns
187 Blooblahguy-207965
 
188 Blooblahguy-207965
                 A boolean value telling the aura element if it should be show the icon
189 Blooblahguy-207965
                 or not.
190 Blooblahguy-207965
                ]]
191 Blooblahguy-207965
                local show = (icons.CustomFilter or customFilter) (icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff)
192 Blooblahguy-207965
                if(show) then
193 Blooblahguy-207965
                        -- We might want to consider delaying the creation of an actual cooldown
194 Blooblahguy-207965
                        -- object to this point, but I think that will just make things needlessly
195 Blooblahguy-207965
                        -- complicated.
196 Blooblahguy-207965
                        local cd = icon.cd
197 Blooblahguy-207965
                        if(cd and not icons.disableCooldown) then
198 Blooblahguy-207965
                                if(duration and duration > 0) then
199 Blooblahguy-207965
                                        cd:SetCooldown(timeLeft - duration, duration)
200 Blooblahguy-207965
                                        cd:Show()
201 Blooblahguy-207965
                                else
202 Blooblahguy-207965
                                        cd:Hide()
203 Blooblahguy-207965
                                end
204 Blooblahguy-207965
                        end
205 Blooblahguy-207965
 
206 Blooblahguy-207965
                        if((isDebuff and icons.showDebuffType) or (not isDebuff and icons.showBuffType) or icons.showType) then
207 Blooblahguy-207965
                                local color = DebuffTypeColor[dtype] or DebuffTypeColor.none
208 Blooblahguy-207965
 
209 Blooblahguy-207965
                                icon.overlay:SetVertexColor(color.r, color.g, color.b)
210 Blooblahguy-207965
                                icon.overlay:Show()
211 Blooblahguy-207965
                        else
212 Blooblahguy-207965
                                icon.overlay:Hide()
213 Blooblahguy-207965
                        end
214 Blooblahguy-207965
 
215 Blooblahguy-207965
                        local stealable = not isDebuff and isStealable
216 Blooblahguy-207965
                        if(stealable and icons.showStealableBuffs and not UnitIsUnit('player', unit)) then
217 Blooblahguy-207965
                                icon.stealable:Show()
218 Blooblahguy-207965
                        else
219 Blooblahguy-207965
                                icon.stealable:Hide()
220 Blooblahguy-207965
                        end
221 Blooblahguy-207965
 
222 Blooblahguy-207965
                        icon.icon:SetTexture(texture)
223 Blooblahguy-207965
                        icon.count:SetText((count > 1 and count))
224 Blooblahguy-207965
 
225 Blooblahguy-207965
                        local size = icons.size or 16
226 Blooblahguy-207965
                        icon:SetSize(size, size)
227 Blooblahguy-207965
 
228 Blooblahguy-207965
                        icon:EnableMouse(true)
229 Blooblahguy-207965
                        icon:SetID(index)
230 Blooblahguy-207965
                        icon:Show()
231 Blooblahguy-207965
 
232 Blooblahguy-207965
                        --[[ :PostUpdateIcon(unit, icon, index, offest)
233 Blooblahguy-207965
 
234 Blooblahguy-207965
                         Callback which is called after the aura icon was updated.
235 Blooblahguy-207965
 
236 Blooblahguy-207965
                         Arguments
237 Blooblahguy-207965
 
238 Blooblahguy-207965
                         self   - The widget that holds the aura icon.
239 Blooblahguy-207965
                         unit   - The unit that has the aura.
240 Blooblahguy-207965
                         icon   - The button that was updated.
241 Blooblahguy-207965
                         index  - The index of the aura.
242 Blooblahguy-207965
                         offset - The offset the button was created at.
243 Blooblahguy-207965
                         ]]
244 Blooblahguy-207965
                        if(icons.PostUpdateIcon) then
245 Blooblahguy-207965
                                icons:PostUpdateIcon(unit, icon, index, n)
246 Blooblahguy-207965
                        end
247 Blooblahguy-207965
 
248 Blooblahguy-207965
                        return VISIBLE
249 Blooblahguy-207965
                else
250 Blooblahguy-207965
                        return HIDDEN
251 Blooblahguy-207965
                end
252 Blooblahguy-207965
        end
253 Blooblahguy-207965
end
254 Blooblahguy-207965
 
255 Blooblahguy-207965
--[[ :SetPosition(from, to)
256 Blooblahguy-207965
 
257 Blooblahguy-207965
 Function used to (re-)anchor aura icons. This function is only called when
258 Blooblahguy-207965
 new aura icons have been created or if :PreSetPosition is defined.
259 Blooblahguy-207965
 
260 Blooblahguy-207965
 Arguments
261 Blooblahguy-207965
 
262 Blooblahguy-207965
 self - The widget that holds the aura icons.
263 Blooblahguy-207965
 from - The aura icon before the new aura icon.
264 Blooblahguy-207965
 to   - The current number of created icons.
265 Blooblahguy-207965
]]
266 Blooblahguy-207965
local SetPosition = function(icons, from, to)
267 Blooblahguy-207965
        local sizex = (icons.size or 16) + (icons['spacing-x'] or icons.spacing or 0)
268 Blooblahguy-207965
        local sizey = (icons.size or 16) + (icons['spacing-y'] or icons.spacing or 0)
269 Blooblahguy-207965
        local anchor = icons.initialAnchor or "BOTTOMLEFT"
270 Blooblahguy-207965
        local growthx = (icons["growth-x"] == "LEFT" and -1) or 1
271 Blooblahguy-207965
        local growthy = (icons["growth-y"] == "DOWN" and -1) or 1
272 Blooblahguy-207965
        local cols = math.floor(icons:GetWidth() / sizex + .5)
273 Blooblahguy-207965
 
274 Blooblahguy-207965
        for i = from, to do
275 Blooblahguy-207965
                local button = icons[i]
276 Blooblahguy-207965
 
277 Blooblahguy-207965
                -- Bail out if the to range is out of scope.
278 Blooblahguy-207965
                if(not button) then break end
279 Blooblahguy-207965
                local col = (i - 1) % cols
280 Blooblahguy-207965
                local row = math.floor((i - 1) / cols)
281 Blooblahguy-207965
 
282 Blooblahguy-207965
                button:ClearAllPoints()
283 Blooblahguy-207965
                button:SetPoint(anchor, icons, anchor, col * sizex * growthx, row * sizey * growthy)
284 Blooblahguy-207965
        end
285 Blooblahguy-207965
end
286 Blooblahguy-207965
 
287 Blooblahguy-207965
local filterIcons = function(unit, icons, filter, limit, isDebuff, offset, dontHide)
288 Blooblahguy-207965
        if(not offset) then offset = 0 end
289 Blooblahguy-207965
        local index = 1
290 Blooblahguy-207965
        local visible = 0
291 Blooblahguy-207965
        local hidden = 0
292 Blooblahguy-207965
        while(visible < limit) do
293 Blooblahguy-207965
                local result = updateIcon(unit, icons, index, offset, filter, isDebuff, visible)
294 Blooblahguy-207965
                if(not result) then
295 Blooblahguy-207965
                        break
296 Blooblahguy-207965
                elseif(result == VISIBLE) then
297 Blooblahguy-207965
                        visible = visible + 1
298 Blooblahguy-207965
                elseif(result == HIDDEN) then
299 Blooblahguy-207965
                        hidden = hidden + 1
300 Blooblahguy-207965
                end
301 Blooblahguy-207965
 
302 Blooblahguy-207965
                index = index + 1
303 Blooblahguy-207965
        end
304 Blooblahguy-207965
 
305 Blooblahguy-207965
        if(not dontHide) then
306 Blooblahguy-207965
                for i = visible + offset + 1, #icons do
307 Blooblahguy-207965
                        icons[i]:Hide()
308 Blooblahguy-207965
                end
309 Blooblahguy-207965
        end
310 Blooblahguy-207965
 
311 Blooblahguy-207965
        return visible, hidden
312 Blooblahguy-207965
end
313 Blooblahguy-207965
 
314 Blooblahguy-207965
local UpdateAuras = function(self, event, unit)
315 Blooblahguy-207965
        if(self.unit ~= unit) then return end
316 Blooblahguy-207965
 
317 Blooblahguy-207965
        local auras = self.Auras
318 Blooblahguy-207965
        if(auras) then
319 Blooblahguy-207965
                if(auras.PreUpdate) then auras:PreUpdate(unit) end
320 Blooblahguy-207965
 
321 Blooblahguy-207965
                local numBuffs = auras.numBuffs or 32
322 Blooblahguy-207965
                local numDebuffs = auras.numDebuffs or 40
323 Blooblahguy-207965
                local max = numBuffs + numDebuffs
324 Blooblahguy-207965
 
325 Blooblahguy-207965
                local visibleBuffs, hiddenBuffs = filterIcons(unit, auras, auras.buffFilter or auras.filter or 'HELPFUL', numBuffs, nil, 0, true)
326 Blooblahguy-207965
 
327 Blooblahguy-207965
                local hasGap
328 Blooblahguy-207965
                if(visibleBuffs ~= 0 and auras.gap) then
329 Blooblahguy-207965
                        hasGap = true
330 Blooblahguy-207965
                        visibleBuffs = visibleBuffs + 1
331 Blooblahguy-207965
 
332 Blooblahguy-207965
                        local icon = auras[visibleBuffs] or (auras.CreateIcon or createAuraIcon) (auras, visibleBuffs)
333 Blooblahguy-207965
 
334 Blooblahguy-207965
                        -- Prevent the icon from displaying anything.
335 Blooblahguy-207965
                        if(icon.cd) then icon.cd:Hide() end
336 Blooblahguy-207965
                        icon:EnableMouse(false)
337 Blooblahguy-207965
                        icon.icon:SetTexture()
338 Blooblahguy-207965
                        icon.overlay:Hide()
339 Blooblahguy-207965
                        icon.stealable:Hide()
340 Blooblahguy-207965
                        icon.count:SetText()
341 Blooblahguy-207965
                        icon:Show()
342 Blooblahguy-207965
 
343 Blooblahguy-207965
                        --[[ :PostUpdateGapIcon(unit, icon, visibleBuffs)
344 Blooblahguy-207965
 
345 Blooblahguy-207965
                         Callback which is called after an invisible aura icon has been
346 Blooblahguy-207965
                         created. This is only used by Auras when the `gap` option is enabled.
347 Blooblahguy-207965
 
348 Blooblahguy-207965
                         Arguments
349 Blooblahguy-207965
 
350 Blooblahguy-207965
                         self         - The widget that holds the aura icon.
351 Blooblahguy-207965
                         unit         - The unit that has the aura icon.
352 Blooblahguy-207965
                         icon         - The invisible aura icon / gap.
353 Blooblahguy-207965
                         visibleBuffs - The number of currently visible buffs.
354 Blooblahguy-207965
                        ]]
355 Blooblahguy-207965
                        if(auras.PostUpdateGapIcon) then
356 Blooblahguy-207965
                                auras:PostUpdateGapIcon(unit, icon, visibleBuffs)
357 Blooblahguy-207965
                        end
358 Blooblahguy-207965
                end
359 Blooblahguy-207965
 
360 Blooblahguy-207965
                local visibleDebuffs, hiddenDebuffs = filterIcons(unit, auras, auras.debuffFilter or auras.filter or 'HARMFUL', numDebuffs, true, visibleBuffs)
361 Blooblahguy-207965
                auras.visibleDebuffs = visibleDebuffs
362 Blooblahguy-207965
 
363 Blooblahguy-207965
                if(hasGap and visibleDebuffs == 0) then
364 Blooblahguy-207965
                        auras[visibleBuffs]:Hide()
365 Blooblahguy-207965
                        visibleBuffs = visibleBuffs - 1
366 Blooblahguy-207965
                end
367 Blooblahguy-207965
 
368 Blooblahguy-207965
                auras.visibleBuffs = visibleBuffs
369 Blooblahguy-207965
                auras.visibleAuras = auras.visibleBuffs + auras.visibleDebuffs
370 Blooblahguy-207965
 
371 Blooblahguy-207965
                local fromRange, toRange
372 Blooblahguy-207965
                if(auras.PreSetPosition) then
373 Blooblahguy-207965
                        fromRange, toRange = auras:PreSetPosition(max)
374 Blooblahguy-207965
                end
375 Blooblahguy-207965
 
376 Blooblahguy-207965
                if(fromRange or auras.createdIcons > auras.anchoredIcons) then
377 Blooblahguy-207965
                        (auras.SetPosition or SetPosition) (auras, fromRange or auras.anchoredIcons + 1, toRange or auras.createdIcons)
378 Blooblahguy-207965
                        auras.anchoredIcons = auras.createdIcons
379 Blooblahguy-207965
                end
380 Blooblahguy-207965
 
381 Blooblahguy-207965
                if(auras.PostUpdate) then auras:PostUpdate(unit) end
382 Blooblahguy-207965
        end
383 Blooblahguy-207965
 
384 Blooblahguy-207965
        local buffs = self.Buffs
385 Blooblahguy-207965
        if(buffs) then
386 Blooblahguy-207965
                if(buffs.PreUpdate) then buffs:PreUpdate(unit) end
387 Blooblahguy-207965
 
388 Blooblahguy-207965
                local numBuffs = buffs.num or 32
389 Blooblahguy-207965
                local visibleBuffs, hiddenBuffs = filterIcons(unit, buffs, buffs.filter or 'HELPFUL', numBuffs)
390 Blooblahguy-207965
                buffs.visibleBuffs = visibleBuffs
391 Blooblahguy-207965
 
392 Blooblahguy-207965
                local fromRange, toRange
393 Blooblahguy-207965
                if(buffs.PreSetPosition) then
394 Blooblahguy-207965
                        fromRange, toRange = buffs:PreSetPosition(numBuffs)
395 Blooblahguy-207965
                end
396 Blooblahguy-207965
 
397 Blooblahguy-207965
                if(fromRange or buffs.createdIcons > buffs.anchoredIcons) then
398 Blooblahguy-207965
                        (buffs.SetPosition or SetPosition) (buffs, fromRange or buffs.anchoredIcons + 1, toRange or buffs.createdIcons)
399 Blooblahguy-207965
                        buffs.anchoredIcons = buffs.createdIcons
400 Blooblahguy-207965
                end
401 Blooblahguy-207965
 
402 Blooblahguy-207965
                if(buffs.PostUpdate) then buffs:PostUpdate(unit) end
403 Blooblahguy-207965
        end
404 Blooblahguy-207965
 
405 Blooblahguy-207965
        local debuffs = self.Debuffs
406 Blooblahguy-207965
        if(debuffs) then
407 Blooblahguy-207965
                if(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end
408 Blooblahguy-207965
 
409 Blooblahguy-207965
                local numDebuffs = debuffs.num or 40
410 Blooblahguy-207965
                local visibleDebuffs, hiddenDebuffs = filterIcons(unit, debuffs, debuffs.filter or 'HARMFUL', numDebuffs, true)
411 Blooblahguy-207965
                debuffs.visibleDebuffs = visibleDebuffs
412 Blooblahguy-207965
 
413 Blooblahguy-207965
                local fromRange, toRange
414 Blooblahguy-207965
                if(debuffs.PreSetPosition) then
415 Blooblahguy-207965
                        fromRange, toRange = debuffs:PreSetPosition(numDebuffs)
416 Blooblahguy-207965
                end
417 Blooblahguy-207965
 
418 Blooblahguy-207965
                if(fromRange or debuffs.createdIcons > debuffs.anchoredIcons) then
419 Blooblahguy-207965
                        (debuffs.SetPosition or SetPosition) (debuffs, fromRange or debuffs.anchoredIcons + 1, toRange or debuffs.createdIcons)
420 Blooblahguy-207965
                        debuffs.anchoredIcons = debuffs.createdIcons
421 Blooblahguy-207965
                end
422 Blooblahguy-207965
 
423 Blooblahguy-207965
                if(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end
424 Blooblahguy-207965
        end
425 Blooblahguy-207965
end
426 Blooblahguy-207965
 
427 Blooblahguy-207965
local Update = function(self, event, unit)
428 Blooblahguy-207965
        if(self.unit ~= unit) then return end
429 Blooblahguy-207965
 
430 Blooblahguy-207965
        UpdateAuras(self, event, unit)
431 Blooblahguy-207965
 
432 Blooblahguy-207965
        -- Assume no event means someone wants to re-anchor things. This is usually
433 Blooblahguy-207965
        -- done by UpdateAllElements and :ForceUpdate.
434 Blooblahguy-207965
        if(event == 'ForceUpdate' or not event) then
435 Blooblahguy-207965
                local buffs = self.Buffs
436 Blooblahguy-207965
                if(buffs) then
437 Blooblahguy-207965
                        (buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdIcons)
438 Blooblahguy-207965
                end
439 Blooblahguy-207965
 
440 Blooblahguy-207965
                local debuffs = self.Debuffs
441 Blooblahguy-207965
                if(debuffs) then
442 Blooblahguy-207965
                        (debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdIcons)
443 Blooblahguy-207965
                end
444 Blooblahguy-207965
 
445 Blooblahguy-207965
                local auras = self.Auras
446 Blooblahguy-207965
                if(auras) then
447 Blooblahguy-207965
                        (auras.SetPosition or SetPosition) (auras, 1, auras.createdIcons)
448 Blooblahguy-207965
                end
449 Blooblahguy-207965
        end
450 Blooblahguy-207965
end
451 Blooblahguy-207965
 
452 Blooblahguy-207965
local ForceUpdate = function(element)
453 Blooblahguy-207965
        return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
454 Blooblahguy-207965
end
455 Blooblahguy-207965
 
456 Blooblahguy-207965
local Enable = function(self)
457 Blooblahguy-207965
        if(self.Buffs or self.Debuffs or self.Auras) then
458 Blooblahguy-207965
                self:RegisterEvent("UNIT_AURA", UpdateAuras)
459 Blooblahguy-207965
 
460 Blooblahguy-207965
                local buffs = self.Buffs
461 Blooblahguy-207965
                if(buffs) then
462 Blooblahguy-207965
                        buffs.__owner = self
463 Blooblahguy-207965
                        buffs.ForceUpdate = ForceUpdate
464 Blooblahguy-207965
 
465 Blooblahguy-207965
                        buffs.createdIcons = 0
466 Blooblahguy-207965
                        buffs.anchoredIcons = 0
467 Blooblahguy-207965
                end
468 Blooblahguy-207965
 
469 Blooblahguy-207965
                local debuffs = self.Debuffs
470 Blooblahguy-207965
                if(debuffs) then
471 Blooblahguy-207965
                        debuffs.__owner = self
472 Blooblahguy-207965
                        debuffs.ForceUpdate = ForceUpdate
473 Blooblahguy-207965
 
474 Blooblahguy-207965
                        debuffs.createdIcons = 0
475 Blooblahguy-207965
                        debuffs.anchoredIcons = 0
476 Blooblahguy-207965
                end
477 Blooblahguy-207965
 
478 Blooblahguy-207965
                local auras = self.Auras
479 Blooblahguy-207965
                if(auras) then
480 Blooblahguy-207965
                        auras.__owner = self
481 Blooblahguy-207965
                        auras.ForceUpdate = ForceUpdate
482 Blooblahguy-207965
 
483 Blooblahguy-207965
                        auras.createdIcons = 0
484 Blooblahguy-207965
                        auras.anchoredIcons = 0
485 Blooblahguy-207965
                end
486 Blooblahguy-207965
 
487 Blooblahguy-207965
                return true
488 Blooblahguy-207965
        end
489 Blooblahguy-207965
end
490 Blooblahguy-207965
 
491 Blooblahguy-207965
local Disable = function(self)
492 Blooblahguy-207965
        if(self.Buffs or self.Debuffs or self.Auras) then
493 Blooblahguy-207965
                self:UnregisterEvent("UNIT_AURA", UpdateAuras)
494 Blooblahguy-207965
        end
495 Blooblahguy-207965
end
496 Blooblahguy-207965
 
497 Blooblahguy-207965
oUF:AddElement('Aura', Update, Enable, Disable)