mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-27 16:34:45 +00:00
271 lines
9.7 KiB
Lua
271 lines
9.7 KiB
Lua
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local UF = E:GetModule("UnitFrames");
|
|
|
|
local ns = oUF
|
|
local ElvUF = ns.oUF
|
|
assert(ElvUF, "ElvUI was unable to locate oUF.")
|
|
|
|
--Cache global variables
|
|
--Lua functions
|
|
local select = select
|
|
local floor = math.floor
|
|
local find, format, sub, gsub = string.find, string.format, string.sub, string.gsub
|
|
--WoW API / Variables
|
|
local CreateFrame = CreateFrame
|
|
|
|
function UF:Configure_ClassBar(frame)
|
|
if not frame.VARIABLES_SET then return end
|
|
local bars = frame[frame.ClassBar]
|
|
if not bars then return end
|
|
|
|
local db = frame.db
|
|
bars.Holder = frame.ClassBarHolder
|
|
bars.origParent = frame
|
|
|
|
--Fix height in case it is lower than the theme allows, or in case it's higher than 30px when not detached
|
|
if (not self.thinBorders and not E.PixelMode) and frame.CLASSBAR_HEIGHT > 0 and frame.CLASSBAR_HEIGHT < 7 then --A height of 7 means 6px for borders and just 1px for the actual power statusbar
|
|
frame.CLASSBAR_HEIGHT = 7
|
|
if db.classbar then db.classbar.height = 7 end
|
|
UF.ToggleResourceBar(bars) --Trigger update to health if needed
|
|
elseif (self.thinBorders or E.PixelMode) and frame.CLASSBAR_HEIGHT > 0 and frame.CLASSBAR_HEIGHT < 3 then --A height of 3 means 2px for borders and just 1px for the actual power statusbar
|
|
frame.CLASSBAR_HEIGHT = 3
|
|
if db.classbar then db.classbar.height = 3 end
|
|
UF.ToggleResourceBar(bars) --Trigger update to health if needed
|
|
elseif (not frame.CLASSBAR_DETACHED and frame.CLASSBAR_HEIGHT > 30) then
|
|
frame.CLASSBAR_HEIGHT = 10
|
|
if db.classbar then db.classbar.height = 10 end
|
|
--Override visibility if Classbar is DruidAltMana in order to fix a bug when Auto Hide is enabled, height is higher than 30 and it goes from detached to not detached
|
|
local overrideVisibility = frame.ClassBar == "DruidAltMana"
|
|
UF.ToggleResourceBar(bars, overrideVisibility) --Trigger update to health if needed
|
|
end
|
|
|
|
--We don't want to modify the original frame.CLASSBAR_WIDTH value, as it bugs out when the classbar gains more buttons
|
|
local CLASSBAR_WIDTH = frame.CLASSBAR_WIDTH
|
|
|
|
local color = E.db.unitframe.colors.borderColor
|
|
bars.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
|
|
|
|
if frame.USE_MINI_CLASSBAR and not frame.CLASSBAR_DETACHED then
|
|
bars:ClearAllPoints()
|
|
E:Point(bars, "CENTER", frame.Health.backdrop, "TOP", 0, 0)
|
|
|
|
if frame.ClassBar == "DruidAltMana" then
|
|
CLASSBAR_WIDTH = CLASSBAR_WIDTH * 2/3
|
|
else
|
|
CLASSBAR_WIDTH = CLASSBAR_WIDTH * (frame.MAX_CLASS_BAR - 1) / frame.MAX_CLASS_BAR
|
|
end
|
|
|
|
bars:SetParent(frame)
|
|
bars:SetFrameLevel(50) --RaisedElementParent uses 100, we want it lower than this
|
|
|
|
if bars.Holder and bars.Holder.mover then
|
|
bars.Holder.mover:SetScale(0.0001)
|
|
bars.Holder.mover:SetAlpha(0)
|
|
end
|
|
elseif not frame.CLASSBAR_DETACHED then
|
|
bars:ClearAllPoints()
|
|
|
|
if frame.ORIENTATION == "RIGHT" then
|
|
E:Point(bars, "BOTTOMRIGHT", frame.Health.backdrop, "TOPRIGHT", -frame.BORDER, frame.SPACING*3)
|
|
else
|
|
E:Point(bars, "BOTTOMLEFT", frame.Health.backdrop, "TOPLEFT", frame.BORDER, frame.SPACING*3)
|
|
end
|
|
|
|
bars:SetParent(frame)
|
|
bars:SetFrameLevel(frame:GetFrameLevel() + 5)
|
|
|
|
if bars.Holder and bars.Holder.mover then
|
|
bars.Holder.mover:SetScale(0.0001)
|
|
bars.Holder.mover:SetAlpha(0)
|
|
end
|
|
else --Detached
|
|
CLASSBAR_WIDTH = db.classbar.detachedWidth - ((frame.BORDER + frame.SPACING)*2)
|
|
E:Size(bars.Holder, db.classbar.detachedWidth, db.classbar.height)
|
|
|
|
if not bars.Holder.mover then
|
|
bars:SerWidth(CLASSBAR_WIDTH)
|
|
bars:SetHeight(frame.CLASSBAR_HEIGHT - ((frame.BORDER+frame.SPACING)*2))
|
|
bars:ClearAllPoints()
|
|
E:Point(bars, "BOTTOMLEFT", bars.Holder, "BOTTOMLEFT", frame.BORDER + frame.SPACING, frame.BORDER + frame.SPACING)
|
|
E:CreateMover(bars.Holder, "ClassBarMover", L["Classbar"], nil, nil, nil, "ALL,SOLO", nil, "unitframe,player,classbar")
|
|
else
|
|
bars:ClearAllPoints()
|
|
E:Point(bars, "BOTTOMLEFT", bars.Holder, "BOTTOMLEFT", frame.BORDER + frame.SPACING, frame.BORDER + frame.SPACING)
|
|
bars.Holder.mover:SetScale(1)
|
|
bars.Holder.mover:SetAlpha(1)
|
|
end
|
|
|
|
if db.classbar.parent == "UIPARENT" then
|
|
bars:SetParent(E.UIParent)
|
|
else
|
|
bars:SetParent(frame)
|
|
end
|
|
|
|
if not db.classbar.strataAndLevel.useCustomStrata then
|
|
bars:SetFrameStrata("LOW")
|
|
else
|
|
bars:SetFrameStrata(db.classbar.strataAndLevel.frameStrata)
|
|
end
|
|
|
|
if not db.classbar.strataAndLevel.useCustomLevel then
|
|
bars:SetFrameLevel(frame:GetFrameLevel() + 5)
|
|
else
|
|
bars:SetFrameLevel(db.classbar.strataAndLevel.frameLevel)
|
|
end
|
|
end
|
|
|
|
bars:SetWidth(CLASSBAR_WIDTH)
|
|
bars:SetHeight(frame.CLASSBAR_HEIGHT - ((frame.BORDER + frame.SPACING)*2))
|
|
|
|
if frame.ClassBar == "DruidAltMana" then
|
|
if frame.CLASSBAR_DETACHED and db.classbar.verticalOrientation then
|
|
bars:SetOrientation("VERTICAL")
|
|
else
|
|
bars:SetOrientation("HORIZONTAL")
|
|
end
|
|
end
|
|
|
|
if frame.USE_CLASSBAR then
|
|
if frame.DruidAltMana and not frame:IsElementEnabled("DruidAltMana") then
|
|
frame:EnableElement("DruidAltMana")
|
|
end
|
|
else
|
|
if frame.DruidAltMana and frame:IsElementEnabled("DruidAltMana") then
|
|
frame:DisableElement("DruidAltMana")
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ToggleResourceBar(bars, overrideVisibility)
|
|
local bars = bars or this
|
|
local frame = bars.origParent or bars:GetParent()
|
|
local db = frame.db
|
|
if not db then return end
|
|
|
|
frame.CLASSBAR_SHOWN = bars:IsShown()
|
|
|
|
local height
|
|
if db.classbar then
|
|
height = db.classbar.height
|
|
elseif db.combobar then
|
|
height = db.combobar.height
|
|
end
|
|
|
|
if bars.text then
|
|
if frame.CLASSBAR_SHOWN then
|
|
bars.text:SetAlpha(1)
|
|
else
|
|
bars.text:SetAlpha(0)
|
|
end
|
|
end
|
|
|
|
frame.CLASSBAR_HEIGHT = (frame.USE_CLASSBAR and (frame.CLASSBAR_SHOWN and height) or 0)
|
|
frame.CLASSBAR_YOFFSET = (not frame.USE_CLASSBAR or not frame.CLASSBAR_SHOWN or frame.CLASSBAR_DETACHED) and 0 or (frame.USE_MINI_CLASSBAR and ((frame.SPACING+(frame.CLASSBAR_HEIGHT/2))) or (frame.CLASSBAR_HEIGHT - (frame.BORDER-frame.SPACING)))
|
|
|
|
if not frame.CLASSBAR_DETACHED then --Only update when necessary
|
|
UF:Configure_HealthBar(frame)
|
|
UF:Configure_Portrait(frame, true) --running :Hide on portrait makes the frame all funky
|
|
end
|
|
end
|
|
UF.ToggleResourceBar = ToggleResourceBar
|
|
|
|
-------------------------------------------------------------
|
|
-- DRUID
|
|
-------------------------------------------------------------
|
|
function UF:Construct_DruidAltMana(frame)
|
|
local druidAltMana = CreateFrame("StatusBar", "DruidAltMana", frame)
|
|
druidAltMana:SetFrameLevel(druidAltMana:GetFrameLevel() + 1)
|
|
druidAltMana.colorPower = true
|
|
druidAltMana.PostUpdate = UF.PostUpdateDruidAltMana
|
|
druidAltMana.PostUpdateVisibility = UF.PostVisibilityDruidAltMana
|
|
E:CreateBackdrop(druidAltMana, "Default")
|
|
UF.statusbars[druidAltMana] = true
|
|
druidAltMana:SetStatusBarTexture(E.media.blankTex)
|
|
|
|
druidAltMana.bg = druidAltMana:CreateTexture(nil, "BORDER")
|
|
druidAltMana.bg:SetAllPoints(druidAltMana)
|
|
druidAltMana.bg:SetTexture(E.media.blankTex)
|
|
druidAltMana.bg.multiplier = 0.3
|
|
|
|
druidAltMana.text = druidAltMana:CreateFontString(nil, "OVERLAY")
|
|
UF:Configure_FontString(druidAltMana.text)
|
|
|
|
druidAltMana:SetScript("OnShow", ToggleResourceBar)
|
|
druidAltMana:SetScript("OnHide", ToggleResourceBar)
|
|
|
|
return druidAltMana
|
|
end
|
|
|
|
function UF:PostUpdateDruidAltMana(_, cur, max, event)
|
|
local frame = self.origParent or self:GetParent()
|
|
local db = frame.db
|
|
|
|
--if frame.USE_CLASSBAR and ((cur ~= max or (not db.classbar.autoHide)) and (event ~= "ElementDisable")) then
|
|
if frame.USE_CLASSBAR and ((cur ~= max or (not db.classbar.autoHide)) and (event ~= "ElementDisable")) then
|
|
if db.classbar.additionalPowerText then
|
|
local powerValue = frame.Power.value
|
|
local powerValueText = powerValue:GetText()
|
|
local powerValueParent = powerValue:GetParent()
|
|
local powerTextPosition = db.power.position
|
|
local color = ElvUF.colors.power[0]
|
|
color = E:RGBToHex(color[1], color[2], color[3])
|
|
|
|
--Attempt to remove |cFFXXXXXX color codes in order to determine if power text is really empty
|
|
if powerValueText then
|
|
local _, endIndex = find(powerValueText, "|cff")
|
|
if endIndex then
|
|
endIndex = endIndex + 7 --Add hex code
|
|
powerValueText = sub(powerValueText, endIndex)
|
|
powerValueText = gsub(powerValueText, "%s+", "")
|
|
end
|
|
end
|
|
|
|
self.text:ClearAllPoints()
|
|
if not frame.CLASSBAR_DETACHED then
|
|
self.text:SetParent(powerValueParent)
|
|
if (powerValueText and (powerValueText ~= "" and powerValueText ~= " ")) then
|
|
if find(powerTextPosition, "RIGHT") then
|
|
E:Point(self.text, "RIGHT", powerValue, "LEFT", 3, 0)
|
|
self.text:SetText(format(color.."%d%%|r |cffD7BEA5- |r", floor(cur / max * 100)))
|
|
elseif find(powerTextPosition, "LEFT") then
|
|
E:Point(self.text, "LEFT", powerValue, "RIGHT", -3, 0)
|
|
self.text:SetText(format("|cffD7BEA5 -|r"..color.." %d%%|r", floor(cur / max * 100)))
|
|
else
|
|
if select(4, powerValue:GetPoint()) <= 0 then
|
|
E:Point(self.text, "LEFT", powerValue, "RIGHT", -3, 0)
|
|
self.text:SetText(format(" |cffD7BEA5-|r"..color.." %d%%|r", floor(cur / max * 100)))
|
|
else
|
|
E:Point(self.text, "RIGHT", powerValue, "LEFT", 3, 0)
|
|
self.text:SetText(format(color.."%d%%|r |cffD7BEA5- |r", floor(cur / max * 100)))
|
|
end
|
|
end
|
|
else
|
|
E:Point(self.text, powerValue:GetPoint())
|
|
self.text:SetText(format(color.."%d%%|r", floor(cur / max * 100)))
|
|
end
|
|
else
|
|
self.text:SetParent(frame.RaisedElementParent)
|
|
E:Point(self.text, "CENTER", self)
|
|
self.text:SetText(format(color.."%d%%|r", floor(cur / max * 100)))
|
|
end
|
|
else --Text disabled
|
|
self.text:SetText()
|
|
end
|
|
self:Show()
|
|
else --Bar disabled
|
|
self.text:SetText()
|
|
self:Hide()
|
|
end
|
|
end
|
|
|
|
function UF:PostVisibilityDruidAltMana(enabled, stateChanged)
|
|
local frame = self.origParent or self:GetParent()
|
|
|
|
if stateChanged then
|
|
ToggleResourceBar(frame[frame.ClassBar])
|
|
UF:Configure_ClassBar(frame)
|
|
UF:Configure_HealthBar(frame)
|
|
UF:Configure_Power(frame)
|
|
UF:Configure_InfoPanel(frame)
|
|
end
|
|
end |