ElvUI/Modules/UnitFrames/Elements/Threat.lua

134 lines
4.4 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local UF = E:GetModule('UnitFrames');
local unpack = unpack
local CreateFrame = CreateFrame
function UF:Construct_Threat(frame)
local threat = CreateFrame('Frame', nil, frame)
--Main ThreatGlow
threat.MainGlow = frame:CreateShadow(4, true)
threat.MainGlow:SetFrameStrata('BACKGROUND')
threat.MainGlow:SetParent(frame)
threat.MainGlow:Hide()
--Secondary ThreatGlow, for power frame when using power offset
threat.PowerGlow = frame:CreateShadow(4, true)
threat.PowerGlow:SetFrameStrata('BACKGROUND')
threat.PowerGlow:SetParent(frame)
threat.PowerGlow:Hide()
threat.TextureIcon = threat:CreateTexture(nil, 'OVERLAY')
threat.TextureIcon:Size(8)
threat.TextureIcon:SetTexture(E.media.blankTex)
threat.TextureIcon:Hide()
threat.PostUpdate = self.UpdateThreat
return threat
end
function UF:Configure_Threat(frame)
local threat = frame.ThreatIndicator
if not threat then return end
local threatStyle = frame.db and frame.db.threatStyle
if threatStyle and threatStyle ~= 'NONE' then
if not frame:IsElementEnabled('ThreatIndicator') then
frame:EnableElement('ThreatIndicator')
end
if threatStyle == 'GLOW' then
threat:SetFrameStrata('BACKGROUND')
threat.MainGlow:ClearAllPoints()
threat.MainGlow:SetAllPoints(frame.TargetGlow)
if frame.USE_POWERBAR_OFFSET then
threat.PowerGlow:ClearAllPoints()
threat.PowerGlow:SetAllPoints(frame.TargetGlow.powerGlow)
end
elseif threatStyle:match('^ICON') then
threat:SetFrameStrata('LOW')
threat:SetFrameLevel(75) --Inset power uses 50, we want it to appear above that
local point = threatStyle:gsub('ICON', '')
threat.TextureIcon:ClearAllPoints()
threat.TextureIcon:Point(point, frame.Health, point)
elseif threatStyle == 'HEALTHBORDER' and frame.InfoPanel then
frame.InfoPanel:SetFrameLevel(frame.Health:GetFrameLevel() - 3)
elseif threatStyle == 'INFOPANELBORDER' and frame.InfoPanel then
frame.InfoPanel:SetFrameLevel(frame.Health:GetFrameLevel() + 3)
end
elseif frame:IsElementEnabled('ThreatIndicator') then
frame:DisableElement('ThreatIndicator')
end
end
function UF:ThreatBorderColor(backdrop, lock, r, g, b)
backdrop.forcedBorderColors = lock and {r, g, b} or nil
backdrop:SetBackdropBorderColor(r, g, b)
end
do
local classPowers = {
MONK = 'Stagger',
DRUID = 'AdditionalPower',
PRIEST = 'AdditionalPower',
SHAMAN = 'AdditionalPower',
DEATHKNIGHT = 'Runes'
}
local myClassPower = classPowers[E.myclass]
function UF:ThreatClassBarBorderColor(parent, status, r, g, b)
local classPower = myClassPower and parent[myClassPower]
if classPower then UF:ThreatBorderColor(classPower.backdrop, status, r, g, b) end
if parent.ClassPower then UF:ThreatBorderColor(parent.ClassPower.backdrop, status, r, g, b) end
if parent.AlternativePower then UF:ThreatBorderColor(parent.AlternativePower.backdrop, status, r, g, b) end
end
end
function UF:ThreatHandler(threat, parent, threatStyle, status, r, g, b)
if threatStyle == 'GLOW' then
if status then
threat.MainGlow:Show()
threat.MainGlow:SetBackdropBorderColor(r, g, b)
if parent.USE_POWERBAR_OFFSET then
threat.PowerGlow:Show()
threat.PowerGlow:SetBackdropBorderColor(r, g, b)
end
else
threat.MainGlow:Hide()
threat.PowerGlow:Hide()
end
elseif threatStyle == 'BORDERS' then
if parent.InfoPanel then UF:ThreatBorderColor(parent.InfoPanel.backdrop, status, r, g, b) end
if parent.Power then UF:ThreatBorderColor(parent.Power.backdrop, status, r, g, b) end
UF:ThreatBorderColor(parent.Health.backdrop, status, r, g, b)
UF:ThreatClassBarBorderColor(parent, status, r, g, b)
elseif threatStyle == 'HEALTHBORDER' then
UF:ThreatBorderColor(parent.Health.backdrop, status, r, g, b)
elseif threatStyle == 'INFOPANELBORDER' then
if parent.InfoPanel then UF:ThreatBorderColor(parent.InfoPanel.backdrop, status, r, g, b) end
elseif threatStyle ~= 'NONE' and threat.TextureIcon then
if status then
threat.TextureIcon:Show()
threat.TextureIcon:SetVertexColor(r, g, b)
else
threat.TextureIcon:Hide()
end
end
end
function UF:UpdateThreat(unit, status, r, g, b)
local parent = self:GetParent()
local db = parent.db and parent.db.threatStyle
local badunit = not unit or parent.unit ~= unit
if not badunit and status and status > 1 then
UF:ThreatHandler(self, parent, db, status, r, g, b)
else
UF:ThreatHandler(self, parent, db, nil, unpack(E.media.unitframeBorderColor))
end
end