Chapter 25
Taking Protected Action in Combat 499
or IsControlKeyDown() and “heals“
or IsShiftKeyDown() and “hands“
menu = menu and self:GetFrameRef(menu)
if lastMenu and lastMenu:IsShown() and i
lastMenu:GetParent() == self then
lastMenu:Hide()
if lastMenu == menu then
return
end
end
if menu then
menu:Hide()
menu:SetParent(self)
menu:SetPoint(“TOPLEFT“, “$cursor“)
menu:SetFrameLevel(self:GetFrameLevel() + 2)
menu:Show()
lastMenu = menu
end
]]
for i, frame in ipairs{PlayerFrame, PartyMemberFrame1, i
PartyMemberFrame2, PartyMemberFrame3, PartyMemberFrame4} do
frame:SetAttribute(“shift-type1“, “spelllist“)
frame:SetAttribute(“ctrl-type1“, “spelllist“)
frame:SetAttribute(“alt-type1“, “spelllist“)
frame:SetAttribute(“_spelllist“, openSpellList)
SecureHandlerSetFrameRef(frame, “blessings“, BlessedMenusBlessings)
SecureHandlerSetFrameRef(frame, “heals“, BlessedMenusHeals)
SecureHandlerSetFrameRef(frame, “hands“, BlessedMenusHands)
end
Pdf change page order acrobat - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
how to reorder pages in pdf file; reorder pages in pdf online
Pdf change page order acrobat - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
change page order pdf reader; pdf change page order
.NET PDF Document Viewing, Annotation, Conversion & Processing
Insert, delete PDF pages. Re-order, rotate PDF pages. PDF Read. Print. Support for all the print modes in Acrobat PDF. Print only specified page ranges.
moving pages in pdf; how to rearrange pdf pages online
VB.NET PDF: How to Create Watermark on PDF Document within
create a watermark to PDF file in order to help or image (such as business's logo) on any desired PDF page. And with our PDF Watermark Creator, users need no
how to rearrange pages in a pdf document; move pages in pdf online
CH A P T E R
26
Creating Unit Frames with
Group Templates
Earlier in this book you learned how to create a very simple unit frame, and
thenlaterextendeditby making itclickableusingsecuretemplates.With some
work, you could extend this addon to show your party or raid, but because
each individual frames is a secure template, it cannot be created or configured
while the player is in combat.
One way around this is to create all of the frames ahead of time and use
the ‘‘unit watch’’ system to show them as needed. For something like party
frames, this might even make the most sense, because you can create the
frames before the player enters combat, and the secure template system will
show and hide them as necessary. However, this method isn’t well suited to
displaying larger groups like raids.
What if you want to display your raid group and sort it by class or raid
role? This would allow you to always have the tanks in one location and the
unit frames of your healers in another. Unfortunately, there doesn’t seem to
be a way to do this in the default user interface. Luckily, Blizzard provides
several templates that allow developers to create raid, party, and pet frames
that update and configure themselves even while the player is in combat. The
templates allow you to pre-program the type and configuration of the frames,
as well as directions of how the frames should be placed and sorted.
In this chapter you use the
SecureGroupHeaderTemplate
to create a fully
functional party/raid unit frame addon called SquareUnitFrames.
Configuring a SecureGroupHeader
The role of the secure group headers is actually pretty straightforward,
managing only the parts that aren’t possible in addon code. The header’s
501
GIF to PDF Converter | Convert GIF to PDF, Convert PDF to GIF
as easy as printing; Support both single-page and batch Drop image to process GIF to PDF image conversion; Provide filter option to change brightness, color and
pdf reverse page order online; how to move pages within a pdf document
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
It can be used standalone. JPEG to PDF Converter is able to convert image files to PDF directly without the software Adobe Acrobat Reader for conversion.
rearrange pdf pages in preview; reverse page order pdf online
502
Part III
Advanced Addon Techniques
primary responsibility is managing the creation and placement of frames. As
players join your party or raid, the secure template handles the creation of
new frames for each of them. If an addon were to try this while the player is
in combat, the new frames would be locked down, unable to be modified. The
group headers enable your addon to do last-minute configuration before the
frame is everlocked down.
The process for creating a new group header is roughly as follows:
1. Create a new header frame that inherits from
SecureGroupHeader
Template
.This may be a custom XML template that inherits from the
Blizzard template and adds things such as artwork andlabels, or just the
raw template itself.
2. Set attributes on the new header for some of the following:
What characters, classes, groups should be displayedin the header?
Should the header be displayed when the player is in a party, raid,
solo, or all of the above?
When new frames are created, how should they be anchored to the
existing frames?
How should the frames be sorted?
Should the frames be grouped, or displayed in columns and rows?
3. Supply an XML template (optionally) that the header will use to create
newunitframes.Again,thiscouldjustbethestandard
SecureUnitButton
or a custom template with artwork and other elements.
4. Provide a configuration function (optionally) that will be called when
anew unit frame is created, allowing for last-minute customization by
addons.
Of course, creating a fully functional raid addon is a bit more complicated
than this, but once you’ve mastered the basics of using the template, other
features can be added to your addon as necessary.
Configuration Options
A
SecureGroupHeader
has plenty of options that can be set using attributes.
These options can be grouped into three major classes: filtering, grouping and
sorting, and display. Tables 26-1, 26-2, and 26-3 describe these attributes.
When specifyinga
groupBy
attribute,youmustalso supplya
groupingOrder
or the template will encounter an error, because
groupingOrder
doesn’t have
any default values.
PDF to WORD Converter | Convert PDF to Word, Convert Word to PDF
PDF to Word Converter has accurate output, and PDF to Word Converter doesn't need the support of Adobe Acrobat & Microsoft Word.
reverse pdf page order online; how to move pdf pages around
TIFF to PDF Converter | Convert TIFF to PDF, Convert PDF to TIFF
PDF to TIFF Converter doesn't require other third-party such as Adobe Acrobat. Completely free for use and upgrade; Easy to convert multi-page PDF files to multi
reorder pages in pdf document; move pages within pdf
Chapter 26
Creating Unit Frames with Group Templates 503
Table 26-1: Filtering Attributes
ATTRIBUTE
TYPE
DESCRIPTION
showRaid
boolean
When true, the group header is shown when
the player is in a raid.
showParty
boolean
When true, the group header is shown when
the player is in a party. This attribute doesn’t
imply showRaid but can work alongside it.
showPlayer
boolean
When true, the header includes the player
when not in a raid (normally, the player would
not be visible in a party listing).
showSolo
boolean
When true, the header is shown when the
player is not in any group. This option implies
showPlayer.
nameList
string
Acomma-separated list of player names to be
included in the listing. This option is not used if
groupFilter is specified.
groupFilter
string
A group number, or any combination of the
following strings:
Acomma-separated list of raid group
numbers
Acomma-separated list of uppercase class
names in English (WARRIOR, PRIEST, and
so on)
A comma-separated list of uppercase
group roles (MAINTANK, MAINASSIST)
strictFiltering
boolean
When true, a character must match both a
group and a class from the groupFilter list.
This allows you to specify “1,WARRIOR“,which
shows all warriors in group 1.
Table 26-2: Grouping and Sorting Attributes
ATTRIBUTE
TYPE
DESCRIPTION
groupBy
string
Specifies a grouping to apply before the list of
players is sorted. Can be one of the following
values: “GROUP“, “CLASS“, or “ROLE“. The
sorting within these groups can be specified
with the groupingOrder attribute.
Continued
DICOM to PDF Converter | Convert DICOM to PDF, Convert PDF to
Adobe Acrobat or any other print drivers when they use DICOM to PDF Converter. Additionally, high-quality image conversion of DICOM & PDF files in single page
rearrange pages in pdf; rearrange pages in pdf reader
BMP to PDF Converter | Convert Bitmap to PDF, Convert PDF to BMP
interface; Powerful image converter for Bitmap and PDF files; No need for Adobe Acrobat Reader & print driver during conversion; Support
move pages in a pdf; change page order pdf preview
504
Part III
Advanced Addon Techniques
Table 26-2 (continued)
ATTRIBUTE
TYPE
DESCRIPTION
groupingOrder
string
Specifies what order should be applied to the
groups before they are sorted individually. This
should be a comma-separated string of group
numbers, uppercase class names, or uppercase
role names (depending on what type of
grouping was specified).
sortMethod
string
Specifies what sorting method should be used
for ordering raid frames. Can be either “NAME“
or “INDEX“, where index will sort the raid by
the internal raid ID. This value defaults to
“INDEX“.
sortDir
string
Specifies the sort order using “ASC“ for
ascending, and “DESC“ for descending. This
value defaults to “ASC“.
Table 26-3: Display Attributes
ATTRIBUTE
TYPE
DESCRIPTION
template
string
The name of an XML template to usewhen
creating new frames. This can be a custom
template, or the simple
SecureUnitButtonTemplate.
templateType
string
The frame type of the XML template being used
(Button, StatusBar, and so on).
point
string
Avalid XML anchor point. This point will be
used to anchor a new frame to an existing
frame. The code will intelligently use the
opposing anchor points, so if you specify
“TOP“, it will anchor the “TOP“ point of the
new frame to the “BOTTOM“ point of the
previous frame.
xOffset
number
An x offset (in pixels) to be used when
anchoring new frames.
yOffset
number
Ay offset (in pixels) to be used when
anchoring new frames.
maxColumns
number
The maximum number of columns that the
header will create. The default for this attribute
is a single column.
Chapter 26
Creating Unit Frames with Group Templates 505
ATTRIBUTE
TYPE
DESCRIPTION
unitsPerColumn
number
The maximum number of units that will be
displayed in a single column. When this value is
nil, there is no limit.
startingIndex
number
The index in the final sorted list at which to start
displaying units. This value defaults to 1.
columnSpacing
number
The amount of space (in pixels) between the
columns. This value defaults to 0.
columnAnchorPoint string
The anchor point for each new column. A value
of “LEFT“ causes thecolumns to grow to the
right.
initial-anchor
string
The initial anchor point for new unit frames.
This can be used to place the frame in a
different starting location (such as growing from
the bottom up instead of top down). This value
should be a comma-separated list containing
anchor point, relative anchor point, x offset, and
yoffset.
initial-width
number
The initial width of the unit frame in pixels.
initial-height
number
The initial height of the unit frame in pixels.
initial-scale
number
The initial scale of the unit frame.
Initial-unitwatch boolean
Whether or not the frame should register for
unit watch when initially created. If this
attribute is set to the string state, the frame will
be notified via the w attribute. If this attribute is
set to any other true value, the frame will be
shown or hidden depending on whether or not
the unit exists.
In Table 26-3, a column means the initial level of grouping for the raid
frames. Because you can specify a custom anchor point for the frames (using
the
point
attribute),yourcolumns couldactually behorizontal,and your rows
could be vertical. In addition, when using a multicolumn display, you must
specify a
columnAnchorPoint
or the template will generate an error.
Initial Configuration Function
In addition to the predefined attributes, a group header can identify an
initial configuration function that will be called after a frame has been cre-
ated, but before it is fully locked down by the user interface. Setting the
506
Part III
Advanced Addon Techniques
initialConfigFunction
key in the header’s table to a function enables this
feature.
This function will be able to set attributes on the frame and do any other
one-time configuration bits. This is a good chance to register events and
click handlers, or set up any secure click actions. Although the frame is not
completely locked down, you are still unable to move/hide/show the frame
from within this function.
Creating SquareUnitFrames
As with all of your addons, start by creating an addon skeleton called
SquareUnitFrames
, containing both a Lua and an XML file. Create
SquareUnitFrames.toc
and add the following:
## Interface: 30300
## Title: SquareUnitFrames
## Notes: Square shaped party/raid frames
SquareUnitFrames.xml
SquareUnitFrames.lua
Constructing the Template
Anormal
SecureUnitButton
won’t have any visual elements and you know
you want to display at least the unit’s name, health, and power. Open up
SquareUnitFrames.xml
and include the following code to define the button
template:
<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/
http://wowprogramming.com/FrameXML/UI.xsd“>
<Frame name=“SquareUnitFrames_UnitTemplate“ virtual=“true“>
<Size x=“36“ y=“36“/>
<Layers>
<Layer level=“BACKGROUND“>
<Texture setAllPoints=“true“>
<Color r=“0.0“ g=“0.0“ b=“0.0“/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnShow function=“SquareUnitFrames_Frame_OnShow“/>
</Scripts>
</Frame>
</Ui>
Chapter 26
Creating Unit Frames with Group Templates 507
This code creates a new template called
SquareUnitFrames_UnitTemplate
that will be used by the group header to create new frames. The template
defines a solid black background texture, sized 36-by-36 pixels. The restof the
sub-frames will be children of this main frame.
After the
</Layers>
tag and before the
<Scripts>
tag, add the following
frame definitions:
<Frames>
<Button name=“$parent_Unit“ parentKey=“unit“ i
inherits=“SecureUnitButtonTemplate“>
<Size x=“34“ y=“34“/>
<Anchors>
<Anchor point=“TOPLEFT“>
<Offset x=“1“ y=“-1“/>
</Anchor>
</Anchors>
<Layers>
<Layer level=“OVERLAY“>
<FontString name=“$parent_Name“ parentKey=“name“
inherits=“GameFontHighlight“ setAllPoints=“true“/>
</Layer>
</Layers>
<Frames>
<StatusBar name=“$parent_HealthBar“ parentKey=“healthBar“>
<Size x=“34“ y=“30“/>
<Anchors>
<Anchor point=“TOPLEFT“/>
</Anchors>
<BarTexture file=“Interface\Buttons\UI-Listbox-Highlight2“/>
<BarColor r=“1.0“ g=“1.0“ b=“1.0“/>
</StatusBar>
<StatusBar name=“$parent_PowerBar“ parentKey=“powerBar“>
<Size x=“34“ y=“3“/>
<Anchors>
<Anchor point=“TOPLEFT“ relativeTo=“$parent_HealthBar“
relativePoint=“BOTTOMLEFT“>
<Offset x=“0“ y=“-1“/>
</Anchor>
</Anchors>
<BarTexture file=i
“Interface\TargetingFrame\UI-TargetingFrame-BarFill“/>
<BarColor r=“1.0“ g=“1.0“ b=“1.0“/>
</StatusBar>
</Frames>
</Button>
</Frames>
This first sub-frameis theactual button thatdisplaystheunit’s name,health,
and power (for example, mana, rage, or energy). The button is anchored and
508
Part III
Advanced Addon Techniques
sized in a way that causes the background to appear as a one-pixel border on
all sides. The textures used here were chosen for a specific visual style, but
you could use any texture for your status bars. The health bar dominates most
of the frame, whereas the power bar is just 3 pixels high.
Creating a Header Template
Although you could create a header purely in Lua and set attributes on it in
your main script, setting the attributes in XML may be preferable because it
allows the frame to be validated as a whole (and remain alterable in Lua).
After the template definition in
SquareUnitFrames.xml
but before the
</Ui>
tag, add the following code:
<Frame name=“SquareUnitFrames_Header“ parent=“UIParent“
inherits=“SecureGroupHeaderTemplate“ movable=“true“>
<Anchors>
<Anchor point=“CENTER“/>
</Anchors>
<Attributes>
<Attribute name=“showParty“ type=“boolean“ value=“true“/>
<Attribute name=“showRaid“ type=“boolean“ value=“true“/>
<Attribute name=“showPlayer“ type=“boolean“ value=“true“/>
<Attribute name=“showSolo“ type=“boolean“ value=“true“/>
<Attribute name=“maxColumns“ type=“number“ value=“8“/>
<Attribute name=“unitsPerColumn“ type=“number“ value=“5“/>
<Attribute name=“columnAnchorPoint“ type=“string“ value=“TOP“/>
<Attribute name=“point“ type=“string“ value=“LEFT“/>
<Attribute name=“template“ type=“string“
value=“SquareUnitFrames_UnitTemplate“/>
<Attribute name=“templateType“ type=“string“ value=“Frame“/>
<Attribute name=“xOffset“ type=“number“ value=“-1“/>
<Attribute name=“yOffset“ type=“number“ value=“1“/>
</Attributes>
</Frame>
This new frame template inherits from
SecureGroupHeaderTemplate
and
begins anchored in the center of the screen. The attributes section programs
how the header is to behave. You learn more about each of the possible
attributes in thenext section butfornow,knowthatthis framewill include the
player in its display, andwill be shown when the playeris in a raid,in a party,
or soloing. Frames are organized into columns of five, with eight columns
total. The gridof frames groups from left to right andthe template you’ve just
defined is used to create the child frames.
Because each frame has a one-pixel black border, two frames stacked
vertically would have two pixels in between, and a one-pixel border around.
To prevent this and make the borders consistent,
xOffset
and
yOffset
are set
to tell the header how to anchor new frames.
Documents you may be interested
Documents you may be interested