View Single Post
Unread 10-22-10, 03:43 AM   #1
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,230
How To : Right click removing buff

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
sigg is offline   Reply With Quote