--[[ BPetBar Scripts used by the Bongos Pet Action Bar replacement Buttons: PetActionButton1 .. PetActionButton10 Saved Variables: Bongos.pet = { 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. } TODO: Add the ability to specify the number of rows. Don't hid the bar itself, but hide its buttons. Code cleanup --]] --constants local DEFAULT_SPACING = 3; local DEFAULT_ROWS = 1; --[[ Helper Functions ]]-- function BPetBar_ForAllButtons(action, arg1) for i=1, NUM_PET_ACTION_SLOTS do action(getglobal("BPetActionButton"..i), arg1); 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 columns = math.ceil(NUM_PET_ACTION_SLOTS / rows); --resize the bar bar:SetWidth((30 + space) * columns - space); bar:SetHeight((30 + space) * math.ceil(NUM_PET_ACTION_SLOTS / columns) - space); --set the position of the first button of the bar local button = getglobal("BPetActionButton1"); if not button or button:GetParent() ~= bar then for i=1, NUM_PET_ACTION_SLOTS do BPetButton.Create(i, bar); end button = getglobal("BPetActionButton1"); end button:ClearAllPoints(); button:SetPoint("TOPLEFT", bar); --set the positions of the remaining buttons local index = 1; for i = 1, rows, 1 do for j = 1, columns, 1 do index = index + 1; if index > NUM_PET_ACTION_SLOTS then return; end button = getglobal("BPetActionButton" .. index); button:ClearAllPoints(); button:SetPoint("LEFT", "BPetActionButton" .. index - 1, "RIGHT", space, 0); end if index > NUM_PET_ACTION_SLOTS then return; end button = getglobal("BPetActionButton" .. index); button:ClearAllPoints(); button:SetPoint("TOP", "BPetActionButton" .. index - columns, "BOTTOM", 0, -space); end end --[[ Event Functions ]]-- local function OnEvent() if event == "UPDATE_BINDINGS" then BPetBar_ForAllButtons(BPetButton.UpdateHotkey); elseif PetHasActionBar() then if (event == "UNIT_FLAGS" or event == "UNIT_AURA") and arg1 == "pet" then BPetBar_ForAllButtons(BPetButton.Update); elseif event == "PET_BAR_UPDATE" then BPetBar_ForAllButtons(BPetButton.Update); elseif event =="PET_BAR_UPDATE_COOLDOWN" then BPetBar_ForAllButtons(BPetButton.UpdateCooldown); elseif event =="PET_BAR_SHOWGRID" then bg_showGridPet = 1; BPetBar_ForAllButtons(BPetButton.ShowGrid); elseif event =="PET_BAR_HIDEGRID" then bg_showGridPet = nil; if not BActionSets_ShowGrid() then BPetBar_ForAllButtons(BPetButton.HideGrid); end end else BPetBar_ForAllButtons(BPetButton.Hide); end end --[[ Rightclick Menu Functions ]]-- local function CreateConfigMenu(name) local menu = CreateFrame("Button", name, UIParent, "BongosRightClickMenu"); menu:SetText("Pet 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(BPetBar, this:GetValue(), BPetBar.sets.space); end getglobal(this:GetName() .. "ValText"):SetText(this:GetValue()); end); rowsSlider:SetValueStep(1); rowsSlider:SetMinMaxValues(1, NUM_PET_ACTION_SLOTS); getglobal(name .. "RowsText"):SetText("Rows"); getglobal(name .. "RowsLow"):SetText(1); getglobal(name .. "RowsHigh"):SetText(NUM_PET_ACTION_SLOTS); 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(BPetBar, BPetBar.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 BongosPetBarMenu then CreateConfigMenu("BongosPetBarMenu"); end BongosPetBarMenu.onShow = 1; BongosPetBarMenu.frame = bar; BongosPetBarMenuHide:SetChecked(not bar.sets.vis); BongosPetBarMenuSpacing:SetValue(bar.sets.space or DEFAULT_SPACING); BongosPetBarMenuRows:SetValue(bar.sets.rows or DEFAULT_ROWS); BongosPetBarMenuScale:SetValue(bar:GetScale() * 100); BongosPetBarMenuOpacity:SetValue(bar:GetAlpha() * 100); BMenu.ShowMenuForBar(BongosPetBarMenu, bar); BongosPetBarMenu.onShow = nil; end --[[ Startup ]]-- BScript.AddStartupAction(function() local bar = BBar.Create("pet", "BPetBar", "BActionSets.pet", ShowMenu); if not bar:IsUserPlaced() then bar:SetPoint("BOTTOM", UIParent, "BOTTOM", 0, 528); end bar:SetScript("OnEvent", OnEvent); bar:RegisterEvent("UNIT_FLAGS"); bar:RegisterEvent("UNIT_AURA"); bar:RegisterEvent("PET_BAR_UPDATE"); bar:RegisterEvent("PET_BAR_UPDATE_COOLDOWN"); bar:RegisterEvent("PET_BAR_SHOWGRID"); bar:RegisterEvent("PET_BAR_HIDEGRID"); bar:RegisterEvent("UPDATE_BINDINGS"); Layout(bar, bar.sets.rows, bar.sets.space); end)