-- rActionBar: core -- zork, 2016 ----------------------------- -- Variables ----------------------------- local A, L = ... L.addonName = A L.dragFrames = {} L.addonColor = "0000FF00" L.addonShortcut = "rab" ----------------------------- -- rActionBar Global ----------------------------- rActionBar = {} rActionBar.addonName = A ----------------------------- -- Functions ----------------------------- function L:GetButtonList(buttonName,numButtons) local buttonList = {} for i=1, numButtons do local button = _G[buttonName..i] if not button then break end table.insert(buttonList, button) end return buttonList end --points --1. p1, f, fp1, fp2 --2. p2, rb-1, p3, bm1, bm2 --3. p4, b-1, p5, bm3, bm4 local function SetupButtonPoints(frame, buttonList, buttonWidth, buttonHeight, numCols, p1, fp1, fp2, p2, p3, bm1, bm2, p4, p5, bm3, bm4) for index, button in next, buttonList do if not frame.__blizzardBar then button:SetParent(frame) end button:SetSize(buttonWidth, buttonHeight) button:ClearAllPoints() if index == 1 then button:SetPoint(p1, frame, fp1, fp2) elseif numCols == 1 or mod(index, numCols) == 1 then button:SetPoint(p2, buttonList[index-numCols], p3, bm1, bm2) else button:SetPoint(p4, buttonList[index-1], p5, bm3, bm4) end end end local function SetupButtonFrame(frame, framePadding, buttonList, buttonWidth, buttonHeight, buttonMargin, numCols, startPoint) local numButtons = # buttonList numCols = min(numButtons, numCols) local numRows = ceil(numButtons/numCols) local frameWidth = numCols*buttonWidth + (numCols-1)*buttonMargin + 2*framePadding local frameHeight = numRows*buttonHeight + (numRows-1)*buttonMargin + 2*framePadding frame:SetSize(frameWidth,frameHeight) --TOPLEFT --1. TL, f, p, -p --2. T, rb-1, B, 0, -m --3. L, b-1, R, m, 0 if startPoint == "TOPLEFT" then SetupButtonPoints(frame, buttonList, buttonWidth, buttonHeight, numCols, startPoint, framePadding, -framePadding, "TOP", "BOTTOM", 0, -buttonMargin, "LEFT", "RIGHT", buttonMargin, 0) --end --TOPRIGHT --1. TR, f, -p, -p --2. T, rb-1, B, 0, -m --3. R, b-1, L, -m, 0 elseif startPoint == "TOPRIGHT" then SetupButtonPoints(frame, buttonList, buttonWidth, buttonHeight, numCols, startPoint, -framePadding, -framePadding, "TOP", "BOTTOM", 0, -buttonMargin, "RIGHT", "LEFT", -buttonMargin, 0) --end --BOTTOMRIGHT --1. BR, f, -p, p --2. B, rb-1, T, 0, m --3. R, b-1, L, -m, 0 elseif startPoint == "BOTTOMRIGHT" then SetupButtonPoints(frame, buttonList, buttonWidth, buttonHeight, numCols, startPoint, -framePadding, framePadding, "BOTTOM", "TOP", 0, buttonMargin, "RIGHT", "LEFT", -buttonMargin, 0) --end --BOTTOMLEFT --1. BL, f, p, p --2. B, rb-1, T, 0, m --3. L, b-1, R, m, 0 --elseif startPoint == "BOTTOMLEFT" then else startPoint = "BOTTOMLEFT" SetupButtonPoints(frame, buttonList, buttonWidth, buttonHeight, numCols, startPoint, framePadding, framePadding, "BOTTOM", "TOP", 0, buttonMargin, "LEFT", "RIGHT", buttonMargin, 0) end end function L:CreateButtonFrame(cfg,buttonList,delaySetup) --create new parent frame for buttons local frame = CreateFrame("Frame", cfg.frameName, cfg.frameParent, cfg.frameTemplate) frame:SetPoint(unpack(cfg.framePoint)) frame:SetScale(cfg.frameScale) frame.__blizzardBar = cfg.blizzardBar if delaySetup then local function OnLogin(...) SetupButtonFrame(frame, cfg.framePadding, buttonList, cfg.buttonWidth, cfg.buttonHeight, cfg.buttonMargin, cfg.numCols, cfg.startPoint) end rLib:RegisterCallback("PLAYER_LOGIN", OnLogin) else SetupButtonFrame(frame, cfg.framePadding, buttonList, cfg.buttonWidth, cfg.buttonHeight, cfg.buttonMargin, cfg.numCols, cfg.startPoint) end --reparent the Blizzard bar if cfg.blizzardBar then cfg.blizzardBar:SetParent(frame) cfg.blizzardBar:EnableMouse(false) end --show/hide the frame on a given state driver if cfg.frameVisibility then frame.frameVisibility = cfg.frameVisibility frame.frameVisibilityFunc = cfg.frameVisibilityFunc RegisterStateDriver(frame, cfg.frameVisibilityFunc or "visibility", cfg.frameVisibility) end --add drag functions rLib:CreateDragFrame(frame, L.dragFrames, -2, true) --hover animation if cfg.fader then rLib:CreateButtonFrameFader(frame, buttonList, cfg.fader) end return frame end --create slash commands rLib:CreateSlashCmd(L.addonName, L.addonShortcut, L.dragFrames, L.addonColor)