vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        BClassBar
                <description>
                
        Saved Variables:
                Bongos.class = {
                        <All variables from BBar>
                        space
                                The spacing between action buttons, in pixels.  A nil value means that the bar is using default spacing
                        rows
                                How many rows the bar is organized into.
                }
--]]

--constants
local DEFAULT_SPACING = 2;
local DEFAULT_ROWS = 1;

--[[ Utility Functions ]]--

function BClassBar_ForAllButtons(action, arg1)
        for i = 1, GetNumShapeshiftForms() do
                local button = getglobal("BClassBarButton" .. i);
                if button then
                        action(button, arg1);
                else
                        return;
                end
        end
end

--[[ Layout Functions ]]--

local function SaveSettings(bar, rows, space)
        if not space or space == DEFAULT_SPACING then
                space = nil;
        end
        bar.sets.space = space;
        
        if not rows or rows == DEFAULT_ROWS then
                rows = nil;
        end
        bar.sets.rows = rows;
        
        return (rows or DEFAULT_ROWS), (space or DEFAULT_SPACING);
end

local function Layout(bar, rows, space)
        rows, space = SaveSettings(bar, rows, space);
        
        local numForms = GetNumShapeshiftForms();
        local columns = math.ceil(numForms / rows);
        
        --resize the bar
        bar:SetWidth((30 + space) * columns - space);
        bar:SetHeight((30 + space) * math.ceil(numForms / columns) - space);
        
        local index = 1;
        local buttonPrefix = bar:GetName() .. "Button";
        
        --set the position of the first button of the bar
        local button = getglobal(buttonPrefix .. index);
        button:ClearAllPoints();
        button:SetPoint("TOPLEFT", bar);
        
        --set the positions of the remaining buttons
        for i = 1, rows, 1 do 
                for j = 1, columns, 1 do
                        index = index + 1;
                        if index > numForms then return; end
                        
                        button = getglobal(buttonPrefix .. index);
                        button:ClearAllPoints();
                        button:SetPoint("LEFT", buttonPrefix .. index - 1, "RIGHT", space, 0);
                end
                if(index > numForms) then return; end
                
                button = getglobal(buttonPrefix .. index);
                button:ClearAllPoints();
                button:SetPoint("TOP", buttonPrefix .. index - columns, "BOTTOM", 0, -space);
        end
end

--[[ OnX Functions ]]--

local function OnEvent()
        if event == "UPDATE_BINDINGS" then
                BClassBar_ForAllButtons(BClassButton.UpdateHotkey);
                return;
        end
        local bar = this;
        
        --Update buttons
        for i=1, GetNumShapeshiftForms() do
                local button = getglobal(bar:GetName() .. "Button" .. i);
                if not button then
                        button = BClassButton.Create(i, bar);
                        layoutChanged = 1;
                else
                        BClassButton.Update(button);
                end
        end
        
        if layoutChanged then
                Layout(bar, bar.sets.rows, bar.sets.space);
        end
end

--[[  Rightclick Menu Functions  ]]--

local function CreateConfigMenu(name)
        local menu = CreateFrame("Button", name, UIParent, "BongosRightClickMenu");
        menu:SetText("Class Bar");
        menu:SetWidth(220);
        menu:SetHeight(236);
        
        local hideButton = CreateFrame("CheckButton", name .. "Hide", menu, "BongosHideButtonTemplate");
        
        local rowsSlider = CreateFrame("Slider", name .. "Rows", menu, "BongosSlider");
        rowsSlider:SetPoint("TOPLEFT", hideButton, "BOTTOMLEFT", 2, -10);
        rowsSlider:SetScript("OnValueChanged", function()
                if not this:GetParent().onShow then
                        Layout(BClassBar, this:GetValue(), BClassBar.sets.space);
                end
                getglobal(this:GetName() .. "ValText"):SetText( this:GetValue() );
        end);
        rowsSlider:SetValueStep(1);
        rowsSlider:SetMinMaxValues(1, GetNumShapeshiftForms());
        getglobal(name .. "RowsText"):SetText("Rows");
        getglobal(name .. "RowsLow"):SetText(1);
        
        local spacingSlider = CreateFrame("Slider", name .. "Spacing", menu, "BongosSpaceSlider");
        spacingSlider:SetPoint("TOP", rowsSlider, "BOTTOM", 0, -24);
        spacingSlider:SetScript("OnValueChanged", function()
                if not this:GetParent().onShow then
                        Layout(BClassBar, BClassBar.sets.rows, this:GetValue());
                end
                getglobal(this:GetName() .. "ValText"):SetText( this:GetValue() );
        end);
        
        local scaleSlider = CreateFrame("Slider", name .. "Scale", menu, "BongosScaleSlider");
        scaleSlider:SetPoint("TOP", spacingSlider, "BOTTOM", 0, -24);
        
        local opacitySlider = CreateFrame("Slider", name .. "Opacity", menu, "BongosOpacitySlider");
        opacitySlider:SetPoint("TOP", scaleSlider, "BOTTOM", 0, -24);
end

--Called when the right click menu is shown, loads the correct values to the checkbuttons/sliders/text
local function ShowMenu(bar)
        if not BongosClassBarMenu then
                CreateConfigMenu("BongosClassBarMenu");
        end
        
        BongosClassBarMenu.onShow = 1;
        BongosClassBarMenu.frame = bar;
        
        BongosClassBarMenuHide:SetChecked(not bar.sets.vis);
        BongosClassBarMenuSpacing:SetValue(bar.sets.space or DEFAULT_SPACING);
        BongosClassBarMenuRows:SetValue(bar.sets.rows or DEFAULT_ROWS);

        BongosClassBarMenuRowsHigh:SetText(GetNumShapeshiftForms());
        BongosClassBarMenuRows:SetMinMaxValues(1, GetNumShapeshiftForms());
        
        BongosClassBarMenuScale:SetValue(bar:GetScale() * 100);
        BongosClassBarMenuOpacity:SetValue(bar:GetAlpha() * 100);
        
        --Position menu then show it
        BMenu.ShowMenuForBar(BongosClassBarMenu, bar);
        BongosClassBarMenu.onShow = nil;
end

--[[ Startup ]]--

BScript.AddStartupAction(function()
        local bar = BBar.Create("class", "BClassBar", "BActionSets.class", ShowMenu);
        if not bar:IsUserPlaced() then
                bar:SetPoint("BOTTOM", UIParent, "BOTTOM", 0, 480);
        end
        
        bar:SetScript("OnEvent", OnEvent);
        
        bar:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");
        bar:RegisterEvent("ACTIONBAR_UPDATE_USABLE");
        bar:RegisterEvent("UPDATE_INVENTORY_ALERTS");
        bar:RegisterEvent("SPELL_UPDATE_COOLDOWN");
        bar:RegisterEvent("SPELL_UPDATE_USABLE");
        bar:RegisterEvent("PLAYER_AURAS_CHANGED");
        bar:RegisterEvent("ACTIONBAR_PAGE_CHANGED");
        bar:RegisterEvent("UNIT_HEALTH");
        bar:RegisterEvent("UNIT_HEALTH");
        bar:RegisterEvent("UNIT_RAGE");
        bar:RegisterEvent("UNIT_FOCUS");
        bar:RegisterEvent("UNIT_ENERGY");
        bar:RegisterEvent("UPDATE_BINDINGS");
end);

Generated by GNU Enscript 1.6.5.90.