Flex Bar

Yet another in the long list of extra button bars.
 
At its heart FlexBar provides 96 extra buttons that you can hide/show independently, move where ever you want and lock into place. With grouping, auto arrangement of buttons in a group and and a variety of appearance specific commands, you can make your buttons look anyway you like.
 
If that's all you need from your extra button bar, simply read the Basic Usage section and configure it to your heart's delight. Just remember, Flexbar also has the ability to apply many of it's actions on game events -- such as when you gain or lose aggro or your stance changes (among many others).
 
For details on how to use that see Advanced Usage: Events
 
IMPORTANT: In all the commands. If the value is a number, range of numbers or set of numbers you do not need quotes around the numbers. EG button=5, target=1-4, button=[1 3 5]. If the value is a word you need single quotes. EG On='MouseEnterGroup'.
 
All commands, events and named targets are now case insensitive (as of V1.22)
 
IMPORTANT NOTE FOR USERS OF EARLIER VERSIONS: Please delete the old FlexBar folder from your addon's folder, start WoW and log in/log out BEFORE installing V1.2. Some of the config variable data structures have changed and not doing this will cause errors.
 
This only applies to users of versions earlier than 1.2.

Basic Usage

If you've never installed a mod before, you have a couple of small tasks ahead of you.
 
1. Inside your World of Warcraft folder, create a folder named Interface (if it doesn't already exist)
2. Inside the Interface folder, create a folder named Addons
3. Download Flex Bar, and unzip it in the addons directory. If you have already unzipped it (and are reading this from its directory) then simply copy the FlexBar directory into the Addons directory.
 
now, simply log in to World of Warcraft.
 
If you are already logged in, type /console reloadui at the command line to load the mod.
 
At this time there should be NO buttons showing. They're there, just hidden. If, instead,
you see a huge grid of 96 buttons - then simply type /flexbar hide button=1-96 to get to a pristine
state.
 
On logging in you should see (in the chat box) "Flexbar V1.2 loaded."

Basic commands

In order to work with buttons, we have to be able to see them. The command for that is:
/flexbar Show Button=<button numbers>
 
<button numbers> can be any number from 1 to 96, a range of numbers in the form #-# where number is from 1 to 96, or a set of numbers [ # # # # ]
 
Note -- Anytime you see Button=<button numbers> you can use these.
 
Examples:
/flexbar Show Button=1
/flexbar Show Button=1-3
/flexbar Show Button=[ 1 3 5 ]
 
In order to get unused buttons out of the way simply type:
/flexbar Hide Button=<button numbers>
 
All the button's other attributes stay unchanged, it's just hidden.
 
Once you have the buttons you want showing, you want to move them where they will fit your screen: At the upper left of the button is a small handle. Click and drag here to move the button.
 
Once you have a button where you want it, you want to avoid moving it accidentally, the command for this is:
/flexbar Lock Button=<button numbers>
 
To unlock the button and allow dragging again simply type:
/flexbar unlock Button=<button numbers>
 
There are a number of commands associated with changing the appearance of a button. Some of these may not have obvious uses until you read the Events section, as they are meant to provide visual feed back to such things as the action on the button being in range.
 
Typing
/Flexbar Appearance
will show the ingame help for the following commands:
/FlexBar Hide Button=<button numbers>
/FlexBar Show Button=<button numbers>
/FlexBar Scale Button=<button numbers> Scale=<scale> [reset='true']
/Flexbar Fade Button=<button numbers> Alpha=<alpha>
/Flexbar Shade Button=<button numbers Color=<[ r g b ]>
 
We've covered Hide/Show.
 
Scale allows you to change the relative size of the button. Scale can range from 5 to 50. Please note, my parser doesn't do decimals at the moment, so 5 is .5, 10 is 1.0, 20 is 2.0 and so on. Simply multiply the desired scale by 10 to get the right one. This also applies to alpha and the r,g,b components of color.
 
Fade allows you to change the transparency of a button. 10 is fully opaque, 1 is nearly transparent. IMPORTANT: When a button is hidden with /Flexbar Hide, it is unclickable. When it is simply invisible with an alpha of 1 you can click it. Please be aware of this.
 
Shade allows you to apply a color mask to a button. A color of [10 10 10] leaves no change to the icon. A color of [10 5 5] will overlay a red tint on the button. Experiment with the various colors to see the effects. r,g,b can range from 0 to 10.
 
Additionally /flexbar shade takes an optional reset='true' parameter. If this is specified then there will be no color applied to the icon and the icon shading will return to the default WoW behavior (which includes shading for not enough mana). You still must specify a color, but it is ignored.
 
All the above commands take an optional Toggle=<toggle> argument. If the button is already in the state you're asking it to change to, and toggle is present, it switches to the state in toggle.
 
Examples:
/FlexBar Hide Button=1 toggle='true'
will hide button 1 if it's showing, but show it if it's hidden. This is actually identical to:
/FlexBar Show Button=1 toggle='true'
 
The following will switch the button between 70% size and full size:
/FlexBar Scale Button=1 Scale=7 Toggle=10
 
The following will toggle a button between fully opaque and nearly invisible
/FlexBar Fade Button=1 Alpha=3 Toggle=10
 
Finally, the following will toggle a red overlay on and off over the button:
/FlexBar Shade Button=1 Color=[ 10 5 5 ] Toggle=[ 10 10 10 ]
 
Typing
/FlexBar Movement
Will bring up the following in game help
/FlexBar Lock Button=<button numbers>
/FlexBar Unlock Button=<button numbers>
/FlexBar MoveABS Button=<button> XX=<x-coord> YY=<y-coord>
/FlexBar MoveRel Button=<button> TrgBtn=<button> dX=<dx> dY=<dy>
/FlexBar MoveToMouse Button=<button> dX=<dx> dY=<dy>
 
We've covered Lock/Unlock
 
A note about the movement commands:
1. All move commands take only a single button for an argument
 
MoveABS moves the button so that its top left corner (where handle and button meet) is at the specified coordinates. X coordinates start at 0 at the left of the screen and increase to the right. Y coordinates start at the bottom of the screen and increase to the top.
 
MoveRel moves the button to that its top left corner is dx to the right and dy above the top left of the specified target button.
 
Note, as with many of the commands, there is very little bounds checking. You can send a button somewhere off in the galaxy. Whether this only makes it invisible or may cause other game problems is unknown. Be careful with this.
 
Typing
/FlexBar MiscHelp
Will show the following commands (I'm leaving 2 out at the moment, they are intended for Event reaction and serve no purpose in the basic discussion)
/FlexBar HideGrid Button=<button numbers>
/FlexBar ShowGrid Button=<button numbers>
/FlexBar LockIcon Button=<button numbers> [Off='true']
/FlexBar Text Button=<button numbers> Text='text'
 
HideGrid and ShowGrid can be used to make buttons with no actions on them hide until you drag an action - then they pop up to allow you to place the action.
 
LockIcon will force you to shift-click to drag the action off the specified button. This will keep you from dragging actions off your buttons in combat. If the optional Off parameter is included it turns off the icon lock and buttons drag like normal.
 
Text allows you to set the text that appears in the upper right of the button. Keep in mind that the space is only 3-4 characters long. There are 3 special settings for this available in 1.2:
Setting it to '%b' will show the hotkey associated with that button
Setting it to '%d' will show the button number
Setting it to '%c' will show the cooldown remaining on the action on the button
 
Two other commands that will display under MiscHelp:
/FlexBar Verbose State=<'on' | 'off'>
/FlexBar ResetAll Confirm='yes'
/FlexBar Tooltip State=<'on' | 'off'>
/FlexBar SafeLoad State=<'on' | 'off'>
/FlexBar LoadProfile Profile='profile'
/FlexBar SaveProfile Profile='profile'
 
Setting Verbose on will result in lots of feedback about changes to buttons. I recommend this be turned OFF most of the time (as you will get spammed if you have any event actions going on). This should be set only while setting things up to get a bit more feedback about what you're setting. Most of the settings above have some very obvious visual effects.
 
Resetall completely clears your character's profile and reloads the UI.
 
Setting Tooltip to off will disable mouseover tooltips on flexbar buttons. Setting to on will re-enable them.
 
SafeLoad, SaveProfile and LoadProfile are primarily stopgaps until I can squash the lost config bug.
 
Turning SafeLoad on will require you to manually load your character's profile on entering the world each time, by clicking a prominent button. Please use this if you are experiencing lost configuration problems until I can sort out the bug.
 
SaveProfile will save you current setting under the name you specify. WARNING: If you specify the name of another character on your account, you will overwrite that character's settings. Case is important here - 'Mairelon' is not 'mairelon'.
 
LoadProfile overwrites your current setting with the specified profile settings.
 
Example:
/flexbar saveprofile profile='Mairelon_Backup'
 
Then, if I need to restore that later:
 
/flexbar loadprofile profile='Mairelon_Backup'
 
Added to V1.22 is the
/FlexBar LoadConfig Config='configname'
command.
 
Using this command you can load a prewritten configuration from FlexBar_Config.lua. If you come up with a clever set of events and want to share them, you can write them as a configuration entry then load them from the command line. Please see FlexBar_Config.lua for details and examples.
 
NOTE: This is one of a few commands where case is important. There is nothing I can do about this. The config name must be exactly the way it is in the config file.

Advanced Usage: Groups

Sometimes you've moved a group of buttons together, and would like to move them as a whole. Also, there are some other advanced things that can be done if they are in groups.
 
Typing
/FlexBar GroupHelp
will display the following ingame help:
/FlexBar Group button=<button numbers> Anchor=<button>
/FlexBar UnGroup Group=<group number>
/FlexBar ListGroups [Group=<group numbers>]
/FlexBar HorizontalGroup Group=<group number> Height=<height> Padding=<padding>
/FlexBar VerticalGroup Group=<group number> Width=<width> Padding=<padding>
/FlexBar CircleGroup Group=<group number> Padding=<padding>
 
Group is the basic command to associate buttons into a group. You must specify the buttons to group and an anchor for the group. The anchor is important - it is going to be the only button in the group with a handle. Its number is going to become the group number and it is the only one that can be locked/unlocked. The anchor must be in the list of buttons to form the group.
Example: /Flexbar Group Button=1-4 Anchor=1
Will result in group 1 being formed with buttons 1, 2, 3, 4 in it. 1 is the button that you drag to drag the group.
 
NOTE: Once you have groups formed you may use Group=<group> in place of Button=<button numbers> in any command that takes the latter argument.
 
Ungroup disbands the group specified.
 
Listgroups will either list all the groups you have formed (if you omit Group=) or list the members of the group if you specify Group=. Note, in Group= you may specify multiple groups much as you would specify mulitple buttons in earlier commands.
 
HorizontalGroup, VerticalGroup and CircleGroup all auto-arrange buttons in the group.
 
HorizontalGroup arranges them in a horizontal line, height rows high with padding pixels in between buttons. It starts in the upper left corner with the lowest numbered button in the group and proceeds top to bottom, left to right.
 
VerticalGroup arranges them in a vertical line, width columns wide with padding pixels in between buttons. It starts in the upper left corner with the lowest numbered button in the group and proceeds left to right, top to bottom.
 
CircleGroup arranges up to 7 buttons (any bigger groups won't work) in a circular formation, starting with the lowest numbered button in the 10 o'clock position, proceeding clockwise with the 7th button in the center.
 

Advanced Usage: Remap and Advanced

There were 3 commands from MiscHelp not covered above. These commands are primarily useful only for events, and are a bit confusing:
 
/FlexBar Remap Button=<button numbers> Base=<id> [Toggle='true'] [Reset='true']
 
Is a powerful, yet potentially confusing command in the Miscellaneous group. To understand how it works, a Buttons 101 overview is necessary.
 
WoW buttons are uniquely identified by their ID. Two buttons with the same ID are essentially the same. The default action bar works by changing the ID's associated with it's 12 buttons when you page through it. On page 1 they use ID's 1-12, on page 2 they use 13-24 on up to page 6 which uses 61-72.
 
For various classes, other ID ranges are used for stance/shape specific stuff. Specifically 73-108 are used by the 3 warrior stances. 73-84 and 97-108 are used by Cat and Bear form for druids and who knows what else.
 
Finally, 109-120 seem to be completely unused. NO ID'S OVER 120 are allowed - they will crash WoW if they are used!
 
FlexBar uses ID's 1-72 for buttons 1-72, ID's 109-120 for buttons 85-96 and: In the case of Warriors 61-72 for buttons 73-84 -- THAT MEANS THEY DUPLICATE 61-72. THERE IS NO FIX FOR THIS, WARRIORS SIMPLY GET LESS AVAILABLE ID'S. Druids use ID's 85-96 for buttons 73-84. Everyone else uses ID's 97-108 for buttons 73-84.
 
Now, that is how buttons are set by default in FlexBar. Remap allows you to set those button ID's any way you want. The advantage here is that the hotkey for the button stays the same while the action if performs may change (just like the actionbar).
 
Example
/Flexbar Remap Button=1-12 Base=25
 
Once this is executed, buttons 1-12 now have ID's 25-36 (just like buttons 25-36)
 
/Flexbar Remap Button=1-12 Base=25 toggle='true'
This will toggle the ID's between default and 25-36. On remap toggle is a bit odd - if the buttons are mapped to anything BUT default and toggle is specified, then they are set to default. Rather than, as in scale/color/fade the toggle only happening if the button is already in the state specified.
 
/Flexbar Remap Button=1-12 Base=1 Reset='true'
Ignores base and simply resets buttons 1-12 to their default ID's.
 
Setting the ID's of buttons to overlap reserved ranges (such as warrior stances) has undefined results. Try it, you may find something useful. But, if you break it remember /Flexbar resetall :)
 
/FlexBar Advanced Button=<button numbers> State=<'on' | 'off'>
 
When Advanced is turned on - buttons are only triggered on a left-click. This is useful in conjunction with the RightClick event to do alternate things on right-clicks of buttons.
 
/FlexBar Use Button=<button numbers>
 
This will actually trigger the listed buttons. While it allows multiple buttons - I don't know how well that will work. Also, you will not - I repeat - NOT be able to get multiple spell casts with this. The primary purpose of this is in conjunction with the RightClick event to assign an alternate function to a button.
 
Addendum: Use will ONLY fire on an actual click on the button, no other event but LeftButtonClick and RightButtonClick will trigger it.

Advanced Usage: Events

The original FlexBar contained some basic abilities to hide/show buttons on events such as entering/leaving combat and gaining/losing aggro. As I progressed I was adding more and more commands to allows the full range of hide/show on a wide variety of events.
 
V1.2 Does away with all the specific commands to hide/show on various events. Instead it allows any combination of a variety of commands with a variety of events.
 
The following commands can be tied to events occurring during gameplay:
Hide, Show, Scale, Fade, Shade, Remap, MoveABS, MoveRel, MoveToMouse and to a limited extent Use
 
The syntax to make these occur on events is as follows:
/FlexBar Hide Button=<button numbers> ..... On='EventName' Target='Target'
/FlexBar Show Button=<button numbers> ..... On='EventName' Target='Target'
/FlexBar Fade Button=<button numbers> ..... On='EventName' Target='Target'
/FlexBar Shade Button=<button numbers> ..... On='EventName' Target='Target'
/FlexBar Scale Button=<button numbers> ..... On='EventName' Target='Target'
/FlexBar Remap Button=<button numbers> ..... On='EventName' Target='Target'
/Flexbar MoveABS button=<button numbers> .... On='EventName' Target=Target
/Flexbar MoveRel button=<button numbers> ..... On='EventName' Target=<target>
/Flexbar MoveToMouse button=<button numbers> ...... On='EventName' Target=target
/FlexBar Use Button=<button numbers> ..... On='EventName' Target='Target'
 
Some examples:
To make a group show on entering combat:
/Flexbar Show Group=1 On='EnterCombat'
To make a group show on mouseover
/Flexbar Show Group=1 On='MouseEnterGroup' Target=1
 
Note that some events do not have targets, such as enter combat. For those that do the target refers to the item originating the event. In the second example we want to respond to MouseEnterGroup only from group 1.
 
The complete list of events is as follows:
Event Name (Spelling and Capitalization must be exact)
Target
MouseEnterGroup
Group mouse entered
MouseLeaveGroup
Group Mouse Left
Raised when the cursor enters/leaves a group's bounds. I use a different algorithm in 1.2 than previous versions. It is faster (no stuttering on large groups). Known issue - groups of small buttons may have a small border around them where they register the mouse as inside the group before it enters.
 
MouseEnterButton
Button mouse entered (must be visible)
MouseLeaveButton
Button mouse left
Raised when the mouse enters/leaves a button. Button must be visible.
 
EnterCombat
no target
LeaveCombat
no target
Enter/Leave combat is raised when you activate/deactivate auto-attack. This is not based on aggro, but on whether you have attack turned on.
 
GainAggro
no target
LoseAggro
no target
Gaining/Losing Aggro is detected by when your regen stops/starts.
 
RightButtonClick
button that was r-clicked
LeftButtonClick
button that was l-clicked
Raised when the specified button is clicked. In order to have seperate actions on r/l clicks Advanced mode must be enabled
 
CoolDownMet
button who's action is done cooling down
CoolDownStart
button who's action's cooldown is starting
Detects cooldown on action on hotkey - when it goes to non zerro, CoolDownStart is raised. When it hits zero, CoolDownMet is raised
 
EnoughMana
button who's action now has enough mana
NotEnoughMana
button who's action now doesn't have enough mana
Raised when your mana climbs above/ drops below the amount necessary to activate the ability on the target button. I think (am not sure) this is true of rage and energy too.
 
OutOfRange
button who's action is now out of range
NowInRange
button who's action is now in range
Raised when the ability on the specified button goes out of and into range. I noticed that raptor strike never generates these events, but auto shot does.
 
GainBuff
buff name gained (must be exact - see combat log. The message will be in the form "You gain buff name.")
LoseBuff
buff name lost - see above, in this case the combat log will read "buff name leaves you."
Raised on the message when you gain/lose buffs. While some stances/forms cause gainbuff messages - not all cause lose buff message. For these use GainAura. Additionally LoseBuff does not fire if you lose it to dieing.
For the above you MUST have Periodic self buffs turned on in chat filters.
GainAura
Aura gained - these include stances, shapes, paladin auars and stealth.
LoseAura
Aura lost
A timer checks to see if you've changed stances/forms/auras/stealth. If you have it raises a LoseAura for the lost one then a GainAura for the new one. If you didn't previously have an aura up, you won't get a lose aura. If you simply get rid of an aura, you won't get a gain aura (such as de-stealthing).
I don't know the exact wording for each target aura. See below for instructions on finding it.
TargetMiss
type of miss (block, dodge, parry, miss)
PlayerMiss
type of miss (block, dodge, parry, miss)
TargetMiss is when the target misses you, PlayerMiss is when you miss the target
I am not 100% sure I have all the player miss types right -- I don't remember ever seeing a PlayerMiss Parry - so I don't know if I'm not looking for the right text or if the mobs in question simply never parried in the testing.
HealthAbove##
UnitCode for the health change - can be player, party1, party2, party3, party4, target, pet, mouseover
HealthBelow##
Same as above
HealthFull
 
## is 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 (except health above does not generate a 100). As a targets health drops/climbs one an event is raised once as he passes these percentages.
 
LostTarget
no target
GainTarget
Reaction of target to player hostile, neutral, friendly
TargetReactionChanged
Reaction of target to player
Note: Unless the reaction changes, there will be no target change event. It may also be possible to lose and reaquire a target fast enough not to get lose/gain target.
 
GainPartyMate
party1, party2, party3, party4 -- untested
LosePartyMate
see above
On a timer, checks for the existence of each party mate. If you had someone at Party1 and now done, losepartymate is raised for party1, if you didn't and now do, gainpartymate is raised for party1.
 
GainPet
no target
LosePet
no target
Functions almost identically to Lose/GainPartyMate, but specific to pets so no target needed.
 
ActionBarPage
Page to which actionbar changed
Raised when the user switches actionbar pages, either by the arrows or hotkeys.
 
BindingKeyUp
Binding key number that was released
BindingKeyDown
Binding key number that was pressed
V1.2 includes 30 new hotkey bindings. Each one will raise the above events as it's pressed and released, with the target being which binding number was activated.
 
IsUsable
Button who's action is usable
NotUsable
Button who's action is unusable
Is/Not Usable is used for abilities that have preconditions, such as your opponent dodging (overpower) or you parrying (riposte). It only indicates that the precondition has been met, but not if you have enough rage/energy to execute the move.
 
ManaAbove##
Unit code for player
ManaBelow##
Unit code
ManaFull
 
Also fired on energy and rage.
 
 
 
 
 
 
To see what events are being raised type the following:
/script FBDisplayEvent=true
 
This will not save across sessions and will spam you mightily with event messages. Use this to see what event exactly is raised as you switch into and out of stances/forms etc, or when you gain/lose buffs.
 
When you are done type:
/script FBDisplayEvent=nil
 
To turn it off.
 
Typing
/FlexBar EventHelp
will display the following:
/FlexBar ListEvents
/FlexBar DeleteEvent Event=<event>
 
ListEvents will list all the events you have registered and their commands. DeleteEvent deletes the event by number (the number it is listed by in ListEvents). Only one event may be deleted at any time.
 
This is an unsupported command put in by me to track event raising. Until I get enough feedback about messages for stances/forms et. al. and can document them, this will be the only way to determine what event/target to use. My apologies, but I barely have time to level my Paladin (I'm back to full rest bonus again!) much less other classes to test these out.
 
As of 01/11/2005 this is a Alpha release. I believe it will function well, but I believe bugs are inevitable :/
 
As always, I appreciate all feedback. I spend way to much time on the wow UI forums, and I will be checking my email at the_real_orang@yahoo.com much more frequently than I have over the holidays (my apologies to those who have written and not gottena reply).