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