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:SetWidth(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