WoWInterface SVN Eui

[/] [Eui/] [lib/] [oUF/] [elements/] [power.lua] - Rev 2

Compare with Previous | Blame | View Log

local parent, ns = ...
local oUF = ns.oUF

oUF.colors.power = {}
for power, color in next, PowerBarColor do
        if(type(power) == 'string') then
                oUF.colors.power[power] = {color.r, color.g, color.b}
        end
end

local Update = function(self, event, unit)
        if(self.unit ~= unit) then return end
        local power = self.Power

        if(power.PreUpdate) then power:PreUpdate(unit) end

        local min, max = UnitPower(unit), UnitPowerMax(unit)
        local disconnected = not UnitIsConnected(unit)
        power:SetMinMaxValues(0, max)

        if(disconnected) then
                power:SetValue(max)
        else
                power:SetValue(min)
        end

        power.disconnected = disconnected
        power.unit = unit

        local r, g, b, t
        if(power.colorTapping and UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit)) then
                t = self.colors.tapped
        elseif(power.colorDisconnected and not UnitIsConnected(unit)) then
                t = self.colors.disconnected
        elseif(power.colorHappiness and UnitIsUnit(unit, "pet") and GetPetHappiness()) then
                t = self.colors.happiness[GetPetHappiness()]
        elseif(power.colorPower) then
                local ptype, ptoken, altR, altG, altB  = UnitPowerType(unit)

                t = self.colors.power[ptoken]
                if(not t and altR) then
                        r, g, b = altR, altG, altB
                end
        elseif(power.colorClass and UnitIsPlayer(unit)) or
                (power.colorClassNPC and not UnitIsPlayer(unit)) or
                (power.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
                local _, class = UnitClass(unit)
                t = self.colors.class[class]
        elseif(power.colorReaction and UnitReaction(unit, 'player')) then
                t = self.colors.reaction[UnitReaction(unit, "player")]
        elseif(power.colorSmooth) then
                r, g, b = self.ColorGradient(min / max, unpack(power.smoothGradient or self.colors.smooth))
        end

        if(t) then
                r, g, b = t[1], t[2], t[3]
        end

        if(b) then
                power:SetStatusBarColor(r, g, b)

                local bg = power.bg
                if(bg) then
                        local mu = bg.multiplier or 1
                        bg:SetVertexColor(r * mu, g * mu, b * mu)
                end
        end

        if(power.PostUpdate) then
                return power:PostUpdate(unit, min, max)
        end
end

local OnPowerUpdate
do
        local UnitPower = UnitPower
        OnPowerUpdate = function(self)
                if(self.disconnected) then return end
                local power = UnitPower(self.unit)

                if(power ~= self.min) then
                        self.min = power

                        return (self.Update or Update) (self:GetParent(), 'OnPowerUpdate', self.unit)
                end
        end
end

local Enable = function(self, unit)
        local power = self.Power
        if(power) then
                local Update = power.Update or Update
                if(power.frequentUpdates and (unit == 'player' or unit == 'pet')) then
                        -- TODO 1.5: We should do this regardless of frequentUpdates.
                        if(power:GetParent() ~= self) then
                                return oUF.error('Element [%s] is incorrectly parented on [%s]. Expected self, got something else.', 'Power', unit)
                        end

                        power:SetScript("OnUpdate", OnPowerUpdate)
                else
                        self:RegisterEvent("UNIT_MANA", Update)
                        self:RegisterEvent("UNIT_RAGE", Update)
                        self:RegisterEvent("UNIT_FOCUS", Update)
                        self:RegisterEvent("UNIT_ENERGY", Update)
                        self:RegisterEvent("UNIT_RUNIC_POWER", Update)
                end
                self:RegisterEvent("UNIT_MAXMANA", Update)
                self:RegisterEvent("UNIT_MAXRAGE", Update)
                self:RegisterEvent("UNIT_MAXFOCUS", Update)
                self:RegisterEvent("UNIT_MAXENERGY", Update)
                self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
                self:RegisterEvent("UNIT_MAXRUNIC_POWER", Update)

                self:RegisterEvent('UNIT_HAPPINESS', Update)
                -- For tapping.
                self:RegisterEvent('UNIT_FACTION', Update)

                if(not power:GetStatusBarTexture()) then
                        power:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
                end

                return true
        end
end

local Disable = function(self)
        local power = self.Power
        if(power) then
                local Update = power.Update or Update
                if(power:GetScript'OnUpdate') then
                        power:SetScript("OnUpdate", nil)
                else
                        self:UnregisterEvent("UNIT_MANA", Update)
                        self:UnregisterEvent("UNIT_RAGE", Update)
                        self:UnregisterEvent("UNIT_FOCUS", Update)
                        self:UnregisterEvent("UNIT_ENERGY", Update)
                        self:UnregisterEvent("UNIT_RUNIC_POWER", Update)
                end
                self:UnregisterEvent("UNIT_MAXMANA", Update)
                self:UnregisterEvent("UNIT_MAXRAGE", Update)
                self:UnregisterEvent("UNIT_MAXFOCUS", Update)
                self:UnregisterEvent("UNIT_MAXENERGY", Update)
                self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
                self:UnregisterEvent("UNIT_MAXRUNIC_POWER", Update)

                self:UnregisterEvent('UNIT_HAPPINESS', Update)
                self:UnregisterEvent('UNIT_FACTION', Update)
        end
end

oUF:AddElement('Power', Update, Enable, Disable)

Compare with Previous | Blame