Hello
I know that the new SecuredAuraheader is quite complicated to use, this is a helper to show you how RDX handle that.
Create a file AuraButtonTemplate.xml :
The secureAuraengine need a xml template to create buttons on the fly :
Code:
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Button name="RDXAB30x30Template" inherits="SecureActionButtonTemplate" virtual="true">
<Size x="30" y="30"/>
<Attributes>
<Attribute name="type" value="cancelaura"/>
</Attributes>
<Scripts>
<OnLoad>
self:RegisterForClicks("RightButtonUp");
</OnLoad>
<OnEnter>
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT");
GameTooltip:SetFrameLevel(self:GetFrameLevel() + 2);
if self:GetAttribute("target-slot") == 16 or self:GetAttribute("target-slot") == 17 or self:GetAttribute("target-slot") == 18 then
GameTooltip:SetInventoryItem("player", self:GetID());
else
GameTooltip:SetUnitAura("player", self:GetID());
end
</OnEnter>
<OnLeave>
GameTooltip:Hide();
</OnLeave>
</Scripts>
</Button>
</Ui>
Important tags description :
Size This will define the height and width of your buff, example: <Size x="30" y="30"/>
Attribute : indicate the button is a cancelaura type.
<Attributes>
<Attribute name="type" value="cancelaura"/>
</Attributes>
Create the SecureAuraHeader handler :
Code:
local headerAura = CreateFrame("Frame", "SAH", nil, "SecureAuraHeaderTemplate");
headerAura:SetAttribute("unit", "player"); -- to activate UNITAURA event refresh
headerAura:SetAttribute("filter", "HELPFUL");
headerAura:SetAttribute("template", "RDXAB30x30Template"); -- must be the template name of your XML
headerAura:SetAttribute("minWidth", 100);
headerAura:SetAttribute("minHeight", 100);
-- the following code create a buff bar anchor to TOPLEFT and buff orientation goes to right with 10 buttons max on two rows
headerAura:SetAttribute("point", "TOPLEFT");
headerAura:SetAttribute("xOffset", 30);
headerAura:SetAttribute("yOffset", 0);
headerAura:SetAttribute("wrapAfter", 10);
headerAura:SetAttribute("wrapXOffset", 0);
headerAura:SetAttribute("wrapYOffset", -30);
headerAura:SetAttribute("maxWraps", 2);
-- sorting
headerAura:SetAttribute("sortMethod", "NAME"); -- INDEX or NAME or TIME
headerAura:SetAttribute("sortDir", "+"); -- - to reverse
headerAura:Show();
-- provide a simple iterator to the header
local function siter_active_children(header, i)
i = i + 1;
local child = header:GetAttribute("child" .. i);
if child and child:IsShown() then
return i, child, child:GetAttribute("index");
end
end
function headerAura:ActiveChildren() return siter_active_children, self, 0; end
-- The update style function
local function updateStyle()
for _,frame in headerAura:ActiveChildren() do
-- create style texture if it doesn't exist
if not frame.tex then
frame.tex = CreateTexture(frame);
frame.tex:SetAllPoints(frame);
frame.cd = CreateFrame("Cooldown");
frame.cd:SetAllPoints(frame);
frame.txt = CreateFontString(frame);
frame.txt:SetAllPoints(frame);
frame.txt:SetFont(GameFontNormal);
end
local name, _, icon, count, debuffType, duration, expirationTime = UnitAura("player", frame:GetID(), "HELPFUL");
if name then
frame.tex:SetTexture(icon);
frame.cd:SetCooldown(expirationTime - duration, duration);
if count > 1 then frame.txt:SetText(count); else frame.txt:SetText("");end
frame.tex:Show();
frame.cd:Show();
frame.txt:Show();
else
frame.tex:Hide();
frame.cd:Hide();
frame.txt:Hide();
end
end
end
create a new handler to update the style of each button
Code:
local f = CreateFrame("Frame");
f:RegisterEvent("UNIT_AURA");
-- in the OnEvent UNIT_AURA :
-- depending of the framework you are using, delay the update to the next frame. I suppose there is a similary function in ace. The example here use our VFL framework
VFLT.NextFrame(math.random(10000000), function() updateStyle() end);
I hope this will help you in your addons.
Cheers
Sigg