vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        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.