-- rBuffFrame: core -- zork, 2016 ----------------------------- -- Variables ----------------------------- local A, L = ... L.addonName = A L.dragFrames = {} L.addonColor = "0000FFFF" L.addonShortcut = "rbf" ----------------------------- -- Hide Blizzard BuffFrame ----------------------------- --local hiddenFrame = CreateFrame("Frame") --hiddenFrame:Hide() --BuffFrame:SetParent(hiddenFrame) ----------------------------- -- rBuffFrame Global ----------------------------- rBuffFrame = {} rBuffFrame.addonName = A ----------------------------- -- Functions ----------------------------- local function GetButtonList(buttonName,numButtons,buttonList) buttonList = buttonList or {} for i=1, numButtons do local button = _G[buttonName..i] if not button then break end if button:IsShown() then table.insert(buttonList, button) end 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 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, rowMargin) local numButtons = # buttonList numCols = max(min(numButtons, numCols),1) local numRows = max(ceil(numButtons/numCols),1) if not rowMargin then rowMargin = buttonMargin end local frameWidth = numCols*buttonWidth + (numCols-1)*buttonMargin + 2*framePadding local frameHeight = numRows*buttonHeight + (numRows-1)*rowMargin + 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, -rowMargin, "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, -rowMargin, "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, rowMargin, "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, rowMargin, "LEFT", "RIGHT", buttonMargin, 0) end end function rBuffFrame:CreateBuffFrame(addonName,cfg) cfg.frameName = addonName.."BuffFrame" cfg.frameParent = cfg.frameParent or UIParent cfg.frameTemplate = nil --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) local function UpdateAllBuffAnchors() --add temp enchant buttons local buttonList = GetButtonList("TempEnchant",BuffFrame.numEnchants) --add all other buff buttons buttonList = GetButtonList("BuffButton",BUFF_MAX_DISPLAY,buttonList) --adjust frame by button list SetupButtonFrame(frame, cfg.framePadding, buttonList, cfg.buttonWidth, cfg.buttonHeight, cfg.buttonMargin, cfg.numCols, cfg.startPoint, cfg.rowMargin) end hooksecurefunc("BuffFrame_UpdateAllBuffAnchors", UpdateAllBuffAnchors) --add drag functions rLib:CreateDragFrame(frame, L.dragFrames, -2, true) return frame end function rBuffFrame:CreateDebuffFrame(addonName,cfg) cfg.frameName = addonName.."DebuffFrame" cfg.frameParent = cfg.frameParent or UIParent cfg.frameTemplate = nil --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) local function UpdateAllDebuffAnchors(buttonName, index) --add all other debuff buttons local buttonList = GetButtonList("DebuffButton",DEBUFF_MAX_DISPLAY) --adjust frame by button list SetupButtonFrame(frame, cfg.framePadding, buttonList, cfg.buttonWidth, cfg.buttonHeight, cfg.buttonMargin, cfg.numCols, cfg.startPoint) end hooksecurefunc("DebuffButton_UpdateAnchors", UpdateAllDebuffAnchors) --add drag functions local relativeToName, _, relativeTo = nil, unpack(cfg.framePoint) if type(relativeTo) == "table" then relativeToName = relativeTo:GetName() elseif type(relativeTo) == "string" and _G[relativeTo] then relativeToName = relativeTo end if relativeToName ~= addonName.."BuffFrame" then rLib:CreateDragFrame(frame, L.dragFrames, -2, true) end return frame end --create slash commands rLib:CreateSlashCmd(L.addonName, L.addonShortcut, L.dragFrames, L.addonColor)