Quantcast

-- 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)