You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
6.5 KiB

local Combo = {isComboPoints = true}
ShadowUF.ComboPoints = Combo
local function createIcons(config, pointsFrame)
local point, relativePoint, x, y
local pointsConfig = pointsFrame.cpConfig
if( config.growth == "LEFT" ) then
point, relativePoint = "BOTTOMRIGHT", "BOTTOMLEFT"
x = config.spacing
elseif( config.growth == "UP" ) then
point, relativePoint = "BOTTOMLEFT", "TOPLEFT"
y = config.spacing
elseif( config.growth == "DOWN" ) then
point, relativePoint = "TOPLEFT", "BOTTOMLEFT"
y = config.spacing
else
point, relativePoint = "BOTTOMLEFT", "BOTTOMRIGHT"
x = config.spacing
end
x = x or 0
y = y or 0
for id=1, pointsConfig.max do
pointsFrame.icons[id] = pointsFrame.icons[id] or pointsFrame:CreateTexture(nil, "OVERLAY")
local texture = pointsFrame.icons[id]
texture:SetTexture(pointsConfig.icon)
texture:SetSize(config.size or 16, config.size or 16)
if( id > 1 ) then
texture:ClearAllPoints()
texture:SetPoint(point, pointsFrame.icons[id - 1], relativePoint, x, y)
else
texture:ClearAllPoints()
texture:SetPoint("CENTER", pointsFrame, "CENTER", 0, 0)
end
end
end
local function createBlocks(config, pointsFrame)
local pointsConfig = pointsFrame.cpConfig
if pointsConfig.max == 0 then return end
pointsFrame.visibleBlocks = pointsConfig.max
-- Position bars, the 5 accounts for borders
local blockWidth = (pointsFrame:GetWidth() - ((pointsConfig.max / (pointsConfig.grouping or 1)) - 1)) / pointsConfig.max
for id=1, pointsConfig.max do
pointsFrame.blocks[id] = pointsFrame.blocks[id] or pointsFrame:CreateTexture(nil, "OVERLAY")
local texture = pointsFrame.blocks[id]
local color = ShadowUF.db.profile.powerColors[pointsConfig.colorKey or "COMBOPOINTS"]
texture:SetVertexColor(color.r, color.g, color.b, color.a)
texture:SetHorizTile(false)
texture:SetTexture(ShadowUF.Layout.mediaPath.statusbar)
texture:SetHeight(pointsFrame:GetHeight())
texture:SetWidth(blockWidth)
texture:ClearAllPoints()
if not texture.background and config.background then
texture.background = pointsFrame:CreateTexture(nil, "BORDER")
texture.background:SetHeight(1)
texture.background:SetWidth(1)
texture.background:SetAllPoints(texture)
texture.background:SetHorizTile(false)
texture.background:SetVertexColor(color.r, color.g, color.b, ShadowUF.db.profile.bars.backgroundAlpha)
texture.background:SetTexture(ShadowUF.Layout.mediaPath.statusbar)
end
if texture.background then
texture.background:SetShown(config.background)
end
local offset = 1
if pointsConfig.grouping and ((id - 1) % pointsConfig.grouping ~= 0) then
offset = 0
end
if( config.growth == "LEFT" ) then
if( id > 1 ) then
texture:SetPoint("TOPRIGHT", pointsFrame.blocks[id - 1], "TOPLEFT", -offset, 0)
else
texture:SetPoint("TOPRIGHT", pointsFrame, "TOPRIGHT", 0, 0)
end
else
if( id > 1 ) then
texture:SetPoint("TOPLEFT", pointsFrame.blocks[id - 1], "TOPRIGHT", offset, 0)
else
texture:SetPoint("TOPLEFT", pointsFrame, "TOPLEFT", 0, 0)
end
end
end
end
function Combo:OnLayoutApplied(frame, config)
local key = self:GetComboPointType()
local pointsFrame = frame[key]
if( not pointsFrame ) then return end
pointsFrame:SetFrameLevel(frame.topFrameLevel + 1)
local pointsConfig = pointsFrame.cpConfig
config = config[key]
-- Not a bar so set the containers frame configuration
if( config and not config.isBar ) then
ShadowUF.Layout:ToggleVisibility(pointsFrame, frame.visibility[key])
end
if( not frame.visibility[key] ) then return end
-- Hide the active combo points
if( pointsFrame.points ) then
for _, texture in pairs(pointsFrame.points) do
texture:Hide()
end
end
-- Setup for bar display!
if( config.isBar ) then
pointsFrame.blocks = pointsFrame.blocks or {}
pointsFrame.points = pointsFrame.blocks
createBlocks(config, pointsFrame, pointsConfig.max)
-- guess not, will have to do icons :(
else
pointsFrame.icons = pointsFrame.icons or {}
pointsFrame.points = pointsFrame.icons
createIcons(config, pointsFrame, pointsConfig.max)
-- Position the main frame
pointsFrame:SetSize(0.1, 0.1)
ShadowUF.Layout:AnchorFrame(frame, pointsFrame, config)
end
end
function Combo:OnDisable(frame)
frame:UnregisterAll(self)
end
function Combo:UpdateBarBlocks(frame, event, unit, powerType)
local key = self:GetComboPointType()
local pointsFrame = frame[key]
if( not pointsFrame or not pointsFrame.cpConfig.eventType or not pointsFrame.blocks ) then return end
if( event and powerType ~= pointsFrame.cpConfig.eventType ) then return end
local max = self.GetMaxPoints and self:GetMaxPoints() or UnitPowerMax("player", pointsFrame.cpConfig.powerType)
if( max == 0 or pointsFrame.visibleBlocks == max ) then return end
pointsFrame.cpConfig.max = max
if( not ShadowUF.db.profile.units[frame.unitType][key].isBar ) then
createIcons(ShadowUF.db.profile.units[frame.unitType][key], pointsFrame)
pointsFrame.visibleBlocks = max
return
else
createBlocks(ShadowUF.db.profile.units[frame.unitType][key], pointsFrame)
pointsFrame.visibleBlocks = max
end
local blockWidth = (pointsFrame:GetWidth() - (max - 1)) / max
for id=1, max do
pointsFrame.blocks[id]:SetWidth(blockWidth)
pointsFrame.blocks[id]:Show()
end
for id=max+1, #pointsFrame.blocks do
pointsFrame.blocks[id]:Hide()
end
end
function Combo:Update(frame, event, unit, powerType)
local key = self:GetComboPointType()
-- Anything power based will have an eventType to filter on
if( event and frame[key].cpConfig.eventType and frame[key].cpConfig.eventType ~= powerType ) then return end
local points = self:GetPoints(unit)
-- Bar display, hide it if we don't have any combo points
if( ShadowUF.db.profile.units[frame.unitType][key].isBar ) then
ShadowUF.Layout:SetBarVisibility(frame, key, ShadowUF.db.profile.units[frame.unitType][key].showAlways or (points and points > 0))
end
for id, pointTexture in pairs(frame[key].points) do
if( id <= points ) then
pointTexture:Show()
else
pointTexture:Hide()
end
end
end
function Combo:OnLayoutWidgets(frame)
local key = self:GetComboPointType()
if( not frame.visibility[key] or not ShadowUF.db.profile.units[frame.unitType][key].isBar or not frame[key].blocks) then return end
local height = frame[key]:GetHeight()
for _, block in pairs(frame[key].blocks) do
block:SetHeight(height)
end
end