Aura position not updating correctly
Haleth opened this issue ยท 20 comments
Since the latest updated to aura positioning, when using Auras with Auras.gap = true, debuffs don't revert to their original position after a buff which moved them has disappeared. They appear where the gap used to be. It's hard to explain, screenshots show it in more detail:
Buff appears:
http://img710.imageshack.us/img710/4879/wowscrnshot100111182147.jpg
Buff disappears:
http://img6.imageshack.us/img6/5717/wowscrnshot100111182150.jpg
local Auras = CreateFrame("Frame", nil, self)
Auras:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, -4)
Auras.initialAnchor = "TOPLEFT"
Auras["growth-x"] = "RIGHT"
Auras["growth-y"] = "DOWN"
Auras['spacing-x'] = 3
Auras['spacing-y'] = 3
Auras.numDebuffs = 16
Auras.numBuffs = 16
Auras:SetHeight(500)
Auras:SetWidth(229)
Auras.size = 26
Auras.gap = true
self.Auras = Auras
Should be solved with e53dcb1. I'm not too pleased with how it works now, but at least it will work like before, with slightly less re-anchoring.
I will probably rewrite how gaps are handled later on. Right now this is done in the anchoring phase, when it would be better to just create one "fake" extra buff, which is invisible. That way we can do full updates with proper gapping without having to re-anchor all of the aura icons from scratch.
I didn't remove the code which prevent oUF from re-anchoring entirely, as it should still reduce the amount of calls to :SetPosition() by quite a lot in raids.
Seems to be fixed now, yeah. ^^
If you go for the fake buff method, make sure it disappears when there are no other buffs at all. Obvious, but just saying. :P
No worries! Same seems to apply to count, btw.
Have an other problem though. I used to have a filter in my PostUpdateIcon which looked like this (ignore the debuff type colouring):
local PostUpdateIcon
do
local playerUnits = {
player = true,
pet = true,
vehicle = true,
}
PostUpdateIcon = function(icons, unit, icon, index, offset, filter, isDebuff)
local texture = icon.icon
local _, _, _, _, dtype, _, _, _, _, _, spellID = UnitAura(unit, index, icon.filter)
if(unit~="target") then icon:Show() end
if(not playerUnits[icon.owner] and not C.debuffFilter[spellID] and not UnitIsFriend("player", unit) and icon.debuff)
or(UnitIsPlayer(unit) and not UnitIsFriend("player", unit) and not icon.debuff and not C.dangerousBuffs[spellID]) then
icon:Hide()
else
icon:Show()
if icon.debuff and dtype and UnitIsFriend("player", unit) then
local color = DebuffTypeColor[dtype]
icon.bg:SetVertexColor(color.r, color.g, color.b)
else
icon.bg:SetVertexColor(0, 0, 0)
end
end
end
end
Though now, it will display the 'gap' for every debuff that's hidden, so there can be like 8 gaps. I tried to change it to a CustomFilter like this:
local CustomFilter
do
local playerUnits = {
player = true,
pet = true,
vehicle = true,
}
CustomFilter = function(_, unit, icon, _, _, _, _, _, _, _, caster, _, _, spellID)
if(not playerUnits[icon.owner] and not C.debuffFilter[spellID] and not UnitIsFriend("player", unit) and icon.debuff)
or(UnitIsPlayer(unit) and not UnitIsFriend("player", unit) and not icon.debuff and not C.dangerousBuffs[spellID]) then
return false
end
return true
end
end
But then it won't show any buffs on NPCs, whereas the previous would show all NPC buffs.
Not sure if this is a bug or I'm overlooking something.
icon.owner will always be nil in a CustomFilter, as it gets set by the internal customfilter function. The same is true for icon.isPlayer.
So I use OmniCC, and if a timer is shown on an icon and then a gap appears, the OmniCC count will still show. Is there any easy way to work around this?
Looks like I forgot to hide the cooldown frame of the icon. :(
I'll push a fix when I get home.
Then what would be the best way to keep my filter? Using CustomFilter doesn't seem like an option because I can't check whether it's a buff or debuff (since I'm stuck with using UnitAura).
icon.isDebuff works fine for me. It's provided because the filter can contain more than just HARMFUL, but only if the layout sets it.
Hmm, it works now, even though I changed nothing. Awkward.
Thanks for all these changes. :) oUF is teaching me a lot more about lua.
So I use OmniCC, and if a timer is shown on an icon and then a gap appears, the OmniCC count will still show. Is there any easy way to work around this?
I just checked the source and I do hide the cooldown frame. I don't hide the count however. I tested with OmniCC regardless, but it doesn't add a timer to the gap here. CustomFiltering also doesn't create fake gaps.
Are you using a custom :SetPosition() function?
I'm not. Turns out it was an error on my side because I wasn't using the normal cooldown frame. >_>
Sorry to bug you with my questions.
Then what would be the best way to keep my filter? Using CustomFilter doesn't seem like an option because I can't check whether it's a buff or debuff (since I'm stuck with using UnitAura).
I can change the function to expose .filter and .debuff, as well as moving .owner and .isPlayer out of the internal customFilter function.
Note that CustomFilter is mainly intended to filter out icons you don't want to show and nothing else. PostUpdateIcon is there to deal with styling.
That'd be great, it's really hard to get a filter going otherwise when using Auras now. :)
And yes, the style will still be handled by PostUpdateIcon, that's no problem.