vanilla-wow-addons – Rev 1
?pathlinks?
--[[
BActionButtonMain
This is the event handler for Bongos ActonBars and ActionButtons.
TODO:
Nothing, I think. Should be fairly optimized.
--]]
bg_showGrid = nil; --is determines if empty buttons are being shown or not.
--[[ Helper Functions ]]--
function BActionMain_ForAllButtons(action, arg1)
local numActionBars = BActionBar.GetNumber();
for i = 1, numActionBars do
if getglobal("BActionBar" .. i) then
for j = BActionBar.GetStart(i), BActionBar.GetEnd(i) do
local button = getglobal("BActionButton" .. j);
if button and button:GetParent() then
action(button, arg1);
else
break;
end
end
end
end
end
function BActionMain_ForAllShownButtons(action, arg1)
local numActionBars = BActionBar.GetNumber();
for i = 1, numActionBars do
local bar = getglobal("BActionBar" .. i);
if bar and bar:IsShown() then
for j = BActionBar.GetStart(i), BActionBar.GetEnd(i) do
local button = getglobal("BActionButton" .. j);
if button then
action(button, arg1);
else
break;
end
end
end
end
end
--[[ Update Functions ]]--
--Enable/disable the OnUpdate function depending on if contextual paging is enabled or not
function BActionMain_UpdateOnUpdateHandler()
for i = 1, BActionBar.GetNumber() do
if BActionBar.CanContextPage(i) then
BActionMain:Show();
return;
end
end
BActionMain:Hide();
end
local function UpdateButtonsWithID(id)
local numActionBars = BActionBar.GetNumber();
for i = 1, numActionBars do
local bar = getglobal("BActionBar" .. i);
if bar and bar:IsShown() then
for j = BActionBar.GetStart(i), BActionBar.GetEnd(i) do
local button = getglobal("BActionButton" .. j);
if button and BActionButton.GetPagedID(button:GetID()) == id then
BActionButton.Update(button);
end
end
end
end
end
function BActionMain_UpdatePage()
for i = 1, BActionBar.GetNumber() do
if BActionBar.CanPage(i) then
BActionBar.Update(i);
end
end
end
local function GetTargetOffset()
if not bg_quickPaged and UnitCanAttack("player", "target") then
return 0;
end
return 1;
end
function BActionMain_UpdateContext(barID)
local offset = GetTargetOffset();
if barID then
if BActionBar.CanContextPage(barID) then
BActionBar.SetContextOffset(barID, offset);
end
else
for i = 1, BActionBar.GetNumber() do
if BActionBar.CanContextPage(i) then
BActionBar.SetContextOffset(i, offset);
end
end
end
end
--[[ OnX Functions ]]--
--in theory, I've optimized the if/then/else order of event frequency
local function OnEvent()
if arg1 == "player" and (event == "UNIT_MANA" or event == "UNIT_HEALTH" or event == "UNIT_RAGE" or event == "UNIT_FOCUS" or event == "UNIT_ENERGY") or event == "PLAYER_COMBO_POINTS" then
BActionMain_ForAllShownButtons(BActionButton.UpdateUsable);
elseif event == "ACTIONBAR_UPDATE_COOLDOWN" or event == "ACTIONBAR_UPDATE_USABLE" or event == "UPDATE_INVENTORY_ALERTS" then
BActionMain_ForAllShownButtons(BActionButton.UpdateUsableAndCooldown);
elseif event == "UNIT_AURASTATE" and (arg1 == "player" or arg1 == "target") then
BActionMain_ForAllShownButtons(BActionButton.UpdateUsable);
elseif event == "ACTIONBAR_UPDATE_STATE" then
BActionMain_ForAllShownButtons(BActionButton.UpdateState);
elseif event == "UNIT_INVENTORY_CHANGED" and arg1=="player" then
BActionMain_ForAllShownButtons(BActionButton.Update);
elseif event == "PLAYER_TARGET_CHANGED" then
BActionMain_ForAllShownButtons(BActionButton.UpdateUsable);
if this:IsShown() then
BActionMain_UpdateContext();
end
elseif event == "PLAYER_AURAS_CHANGED" then
BActionMain_ForAllShownButtons(BActionButton.UpdateUsable);
elseif event == "ACTIONBAR_PAGE_CHANGED" then
BActionMain_UpdatePage();
elseif event == "PLAYER_ENTER_COMBAT" then
IN_ATTACK_MODE = 1;
BActionMain_ForAllShownButtons(BActionButton.UpdateFlash);
elseif event == "PLAYER_LEAVE_COMBAT" then
IN_ATTACK_MODE = nil;
BActionMain_ForAllShownButtons(BActionButton.UpdateFlash);
elseif event == "START_AUTOREPEAT_SPELL" then
IN_AUTOREPEAT_MODE = 1;
BActionMain_ForAllShownButtons(BActionButton.UpdateFlash);
elseif event == "STOP_AUTOREPEAT_SPELL" then
IN_AUTOREPEAT_MODE = nil;
BActionMain_ForAllShownButtons(BActionButton.UpdateFlash);
elseif event == "ACTIONBAR_SLOT_CHANGED" then
UpdateButtonsWithID(arg1);
elseif event == "ACTIONBAR_SHOWGRID" then
bg_showGrid = 1;
BActionMain_ForAllButtons(BActionButton.ShowGrid);
elseif event == "ACTIONBAR_HIDEGRID" then
bg_showGrid = nil;
if not BActionSets_ShowGrid() then
BActionMain_ForAllButtons(BActionButton.HideGrid);
end
elseif event == "CRAFT_SHOW" or event == "CRAFT_CLOSE" or event == "TRADE_SKILL_SHOW" or event == "TRADE_SKILL_CLOSE" then
BActionMain_ForAllShownButtons(BActionButton.UpdateState);
elseif event == "UPDATE_BINDINGS" then
BActionMain_ForAllButtons(BActionButton.UpdateHotkey);
elseif event == "PLAYER_LOGIN" then
BActionMain_ForAllShownButtons(BActionButton.Update);
if this:IsShown() then
BActionMain_UpdateContext();
end
end
end
local function OnUpdate()
if this.update <= 0 then
if not bg_quickPaged then
if BActionSets_IsSelfCastHotkeyDown() then
bg_quickPaged = 1;
BActionMain_UpdateContext();
end
elseif not BActionSets_IsSelfCastHotkeyDown() then
bg_quickPaged = nil;
BActionMain_UpdateContext();
end
this.update = 0.01;
else
this.update = this.update - arg1;
end
end
--[[ Function Overrides ]]--
--increment page
ActionBar_PageUp = function()
CURRENT_ACTIONBAR_PAGE = CURRENT_ACTIONBAR_PAGE + 1;
if CURRENT_ACTIONBAR_PAGE > BActionBar.GetNumber() then
CURRENT_ACTIONBAR_PAGE = 1;
end
ChangeActionBarPage();
end
--decrement page
ActionBar_PageDown = function()
CURRENT_ACTIONBAR_PAGE = CURRENT_ACTIONBAR_PAGE - 1;
if CURRENT_ACTIONBAR_PAGE < 1 then
CURRENT_ACTIONBAR_PAGE = BActionBar.GetNumber();
end
ChangeActionBarPage();
end
--[[ Startup ]]--
local function RegisterEvents(frame)
frame:RegisterEvent("PLAYER_TARGET_CHANGED");
frame:RegisterEvent("ACTIONBAR_PAGE_CHANGED");
frame:RegisterEvent("PLAYER_AURAS_CHANGED");
frame:RegisterEvent("ACTIONBAR_SHOWGRID");
frame:RegisterEvent("ACTIONBAR_HIDEGRID");
frame:RegisterEvent("UPDATE_BINDINGS");
frame:RegisterEvent("ACTIONBAR_UPDATE_STATE");
frame:RegisterEvent("ACTIONBAR_UPDATE_USABLE");
frame:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN");
frame:RegisterEvent("UPDATE_INVENTORY_ALERTS");
frame:RegisterEvent("UNIT_AURASTATE");
frame:RegisterEvent("CRAFT_SHOW");
frame:RegisterEvent("CRAFT_CLOSE");
frame:RegisterEvent("TRADE_SKILL_SHOW");
frame:RegisterEvent("TRADE_SKILL_CLOSE");
frame:RegisterEvent("UNIT_HEALTH");
frame:RegisterEvent("UNIT_MANA");
frame:RegisterEvent("UNIT_RAGE");
frame:RegisterEvent("UNIT_FOCUS");
frame:RegisterEvent("UNIT_ENERGY");
frame:RegisterEvent("PLAYER_ENTER_COMBAT");
frame:RegisterEvent("PLAYER_LEAVE_COMBAT");
frame:RegisterEvent("PLAYER_COMBO_POINTS");
frame:RegisterEvent("START_AUTOREPEAT_SPELL");
frame:RegisterEvent("STOP_AUTOREPEAT_SPELL");
frame:RegisterEvent("UNIT_INVENTORY_CHANGED");
frame:RegisterEvent("ACTIONBAR_SLOT_CHANGED");
frame:RegisterEvent("PLAYER_LOGIN");
end
BScript.AddStartupAction(function()
if not BActionMain then
--create the event frame
local frame = CreateFrame("Frame", "BActionMain");
frame:Hide();
frame.update = 0.01;
frame:SetScript("OnEvent", OnEvent);
frame:SetScript("OnUpdate", OnUpdate);
RegisterEvents(frame);
end
--Create actionbars
for i = 1, BActionBar.GetNumber() do
BActionBar.Create(i);
end
BActionMain_UpdateOnUpdateHandler();
end)
Generated by GNU Enscript 1.6.5.90.