--[[----------------------------------------------------------------------- oUF: Stardust - a layout for the oUF framework Copyright (c) 2016 Andrew Mordecai <armordecai@protonmail.ch> This code is released under the zlib license; see LICENSE for details. -------------------------------------------------------------------------]] local _, Stardust = ... --------------------------- -- General utility functions --------------------------- local function abbrev(n) if n > 1000000000 then return format("%.0fb", n / 1000000000) elseif n > 10000000 then return format("%.0fm", n / 1000000) elseif n > 1000000 then return format("%.1fm", n / 1000000) elseif n > 10000 then return format("%.0fk", n / 1000) elseif n > 1000 then return format("%.1fk", n / 1000) else return n end end --------------------------- -- Health --------------------------- function Stardust.PostUpdateHealth(self, unit, cur, max) self:SetValue(max - cur) self.value:SetText(cur < max and abbrev(-max + cur) or "") self.bg:SetVertexColor(0.15, 0.15, 0.15) end --------------------------- -- Power -- DruidMana -- DemonicFury --------------------------- function Stardust.PostUpdatePower(self, unit, cur, max) self:SetShown(max > 0) self.value:SetText(abbrev(cur)) end --------------------------- -- ClassIcons --------------------------- function Stardust.ResizeClassIcons(element) local COUNT = element.__max local SPACING = 3 local widthTotal = ((Stardust.config.width - SPACING - SPACING) * 0.6) - (COUNT * SPACING) local widthEach = floor(widthTotal / COUNT + 0.5) for i = 1, COUNT do element[i]:SetWidth(widthEach) end end function Stardust.PostUpdateClassIcons(element, cur, max, maxChanged, event) if maxChanged then Stardust.ResizeClassIcons(element) end end --------------------------- -- CPoints -- BurningEmbers --------------------------- function Stardust.PostUpdateCPoints(element, cur) -- The number of combo points isn't dynamic, so they only need to be resized once per frame. element.PostUpdate = nil Stardust.ResizeClassIcons(element) end --------------------------- -- Runes --------------------------- function Stardust.PostUpdateRuneType(element, rune, index, alt) local r, g, b = rune:GetStatusBarColor() rune.bg:SetVertexColor(r * 0.35, g * 0.35, b * 0.35) end function Stardust.PostUpdateRune(element, rune, index, start, duration, ready) -- The number of runes isn't dynamic, so they only need to be resized once per frame. element.PostUpdateRune = nil Stardust.ResizeClassIcons(element) end --------------------------- -- Totems -- Partly adapted from oUF_Phanx --------------------------- local function OnUpdateTotem(bar, elapsed) local t = bar.duration - elapsed if t > 0 then bar.duration = t bar:SetValue(t) else bar:SetValue(0) end end function Stardust.PostUpdateTotem(element, index, _, name, start, duration) local bar = element[index] bar.duration, bar.max = duration, duration if duration > 0 then bar:SetMinMaxValues(0, duration) bar:SetScript("OnUpdate", OnUpdateTotem) else bar:SetScript("OnUpdate", nil) bar:SetValue(0) end end function Stardust.PreUpdateTotems(element, index) -- The number of totems isn't dynamic, so they only need to be resized once per frame. element.PreUpdate = nil Stardust.ResizeClassIcons(element) end --------------------------- -- Status icons --------------------------- function Stardust.PostUpdateStatusIcon(self) if not self:IsShown() then return end local icons, x = self.__owner.StatusIcons, 2 for i = 1, #icons do local icon = icons[i] if icon == self then break elseif icon:IsShown() and icon:GetTexture() then x = x + icon:GetWidth() end end self:SetPoint("LEFT", self.__owner.Health, "TOPLEFT", x + self.offsetX, 0 + self.offsetY) end local updatingCombatOrResting function Stardust.PostUpdateCombat(self) if not updatingCombatOrResting then updatingCombatOrResting = true self.__owner.Resting:ForceUpdate() updatingCombatOrResting = nil end end function Stardust.PostUpdateResting(self) if not updatingCombatOrResting then updatingCombatOrResting = true self.__owner.Combat:ForceUpdate() updatingCombatOrResting = nil end end --------------------------- -- Glow --------------------------- local GLOW_SEGMENTS = { { "TOPLEFT", 0, 1/3, 0, 1/3, -1, 1 }, { "TOPRIGHT", 2/3, 1, 0, 1/3, 1, 1 }, { "BOTTOMRIGHT", 2/3, 1, 2/3, 1, 1, -1 }, { "BOTTOMLEFT", 0, 1/3, 2/3, 1, -1, -1 }, { "TOP", 1/3, 2/3, 0, 1/3, 0, 1 }, { "RIGHT", 2/3, 1, 1/3, 2/3, 1, 0 }, { "BOTTOM", 1/3, 2/3, 2/3, 1, 0, -1 }, { "LEFT", 0, 1/3, 1/3, 2/3, -1, 0 }, } local function SetGlowColor(self, r, g, b, a) for i = 1, #self.Glow do self.Glow[i]:SetVertexColor(r, g, b, a) end end local function SetGlowSize(self, size, offset) local Glow = self.Glow for i = 1, #Glow do Glow[i]:SetSize(size, size) end local d = offset or floor(size * 2 / 3 + 0.5) Glow[1]:SetPoint("TOPLEFT", -d, d) Glow[2]:SetPoint("TOPRIGHT", d, d) Glow[3]:SetPoint("BOTTOMRIGHT", d, -d) Glow[4]:SetPoint("BOTTOMLEFT", -d, -d) --[[ Glow[5]:SetShown(Glow[2]:GetLeft() > Glow[1]:GetRight()) Glow[6]:SetShown(Glow[2]:GetBottom() > Glow[3]:GetTop()) Glow[7]:SetShown(Glow[3]:GetLeft() > Glow[4]:GetLeft()) Glow[8]:SetShown(Glow[1]:GetBottom() > Glow[4]:GetTop()) ]] end function Stardust.CreateGlow(self) local Glow = {} for i = 1, #GLOW_SEGMENTS do local seg = GLOW_SEGMENTS[i] local tex = self:CreateTexture(nil, "BACKGROUND") tex:SetTexture("Interface\\AddOns\\oUF_Stardust\\textures\\glow") tex:SetTexCoord(seg[2], seg[3], seg[4], seg[5]) tex:SetVertexColor(0, 0, 0) Glow[i] = tex end -- TOP Glow[5]:SetPoint("LEFT", Glow[1], "RIGHT") Glow[5]:SetPoint("RIGHT", Glow[2], "LEFT") -- RIGHT Glow[6]:SetPoint("TOP", Glow[2], "BOTTOM") Glow[6]:SetPoint("BOTTOM", Glow[3], "TOP") -- BOTTOM Glow[7]:SetPoint("LEFT", Glow[4], "RIGHT") Glow[7]:SetPoint("RIGHT", Glow[3], "LEFT") -- LEFT Glow[8]:SetPoint("TOP", Glow[1], "BOTTOM") Glow[8]:SetPoint("BOTTOM", Glow[4], "TOP") self.Glow = Glow self.SetBackdropBorderColor = SetGlowColor self.SetGlowColor = SetGlowColor self.SetGlowSize = SetGlowSize return Glow end