WoWInterface SVN SoopUI

[/] [trunk/] [3.0.0rc1/] [SoopUI/] [Libs/] [oUF/] [elements/] [classicons.lua] - Rev 7

Compare with Previous | Blame | View Log

--[[ Element: Class Icons
 Toggles the visibility of icons depending on the player's class and
 specialization.

 Widget

 ClassIcons - An array consisting of five UI Textures.

 Notes

 Monk    - Harmony Orbs
 Paladin - Holy Power
 Priest  - Shadow Orbs
 Warlock - Soul Shards

 Examples

   local ClassIcons = {}
   for index = 1, 5 do
      local Icon = self:CreateTexture(nil, 'BACKGROUND')
   
      -- Position and size.
      Icon:SetSize(16, 16)
      Icon:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', index * Icon:GetWidth(), 0)
   
      ClassIcons[index] = Icon
   end
   
   -- Register with oUF
   self.ClassIcons = ClassIcons
]]

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

local PlayerClass = select(2, UnitClass'player')

-- Holds the class specific stuff.
local ClassPowerType, ClassPowerTypes
local ClassPowerEnable, ClassPowerDisable
local RequireSpec, RequireSpell

local UpdateTexture = function(element)
        local red, green, blue, desaturated
        if(PlayerClass == 'MONK') then
                red, green, blue = 0, 1, .59
                desaturated = true
        elseif(PlayerClass == 'WARLOCK') then
                red, green, blue = 1, .5, 1
                desaturated = true
        elseif(PlayerClass == 'PRIEST') then
                red, green, blue = 1, 1, 1
        elseif(PlayerClass == 'PALADIN') then
                red, green, blue = 1, .96, .41
                desaturated = true
        end

        for i=1, 5 do
                if(element[i].SetDesaturated) then
                        element[i]:SetDesaturated(desaturated)
                end

                element[i]:SetVertexColor(red, green, blue)
        end
end

local ToggleVehicle = function(self, state)
        local element = self.ClassIcons
        for i=1, 5 do
                element[i]:Hide()
        end

        (element.UpdateTexture or UpdateTexture) (element)

        if(state) then
                ClassPowerDisable(self)
        else
                ClassPowerEnable(self)
        end
end

local Update = function(self, event, unit, powerType)
        local element = self.ClassIcons
        local hasVehicle = UnitHasVehicleUI('player')
        if(element.__inVehicle ~= hasVehicle) then
                element.__inVehicle = hasVehicle
                ToggleVehicle(self, hasVehicle)

                -- Continue the update if we left a vehicle.
                if(hasVehicle) then return end
        end

        if((unit and unit ~= 'player') or (powerType and not ClassPowerTypes[powerType])) then
                return
        end

        if(element.PreUpdate) then
                element:PreUpdate()
        end

        local cur = UnitPower('player', ClassPowerType)
        local max = UnitPowerMax('player', ClassPowerType)

        for i=1, max do
                if(i <= cur) then
                        element[i]:Show()
                else
                        element[i]:Hide()
                end
        end

        local oldMax = element.__max
        if(max ~= element.__max) then
                if(max < element.__max) then
                        for i=max + 1, element.__max do
                                element[i]:Hide()
                        end
                end

                element.__max = max
        end

        if(element.PostUpdate) then
                return element:PostUpdate(cur, max, oldMax ~= max)
        end
end

local Path = function(self, ...)
        return (self.ClassIcons.Override or Update) (self, ...)
end

local Visibility = function(self, event, unit)
        local element = self.ClassIcons
        if(
                (RequireSpec and RequireSpec ~= GetSpecialization())
                or (RequireSpell and not IsPlayerSpell(RequireSpell))) then
                for i=1, 5 do
                        element[i]:Hide()
                end
                ClassPowerDisable(self)
        else
                ClassPowerEnable(self)
                return Path(self, 'UpdateVisibility')
        end
end

local ForceUpdate = function(element)
        return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end

do
        local _ClassPowerEnable = function(self)
                self:RegisterEvent('UNIT_DISPLAYPOWER', Update)
                self:RegisterEvent('UNIT_POWER_FREQUENT', Update)
        end

        local _ClassPowerDisable = function(self)
                self:UnregisterEvent('UNIT_DISPLAYPOWER', Update)
                self:UnregisterEvent('UNIT_POWER_FREQUENT', Update)
        end

        if(PlayerClass == 'MONK') then
                ClassPowerType = SPELL_POWER_CHI
                ClassPowerTypes = {
                        ['CHI'] = true,
                        ['DARK_FORCE'] = true,
                }

                ClassPowerEnable = _ClassPowerEnable
                ClassPowerDisable = _ClassPowerDisable
        elseif(PlayerClass == 'PALADIN') then
                ClassPowerType = SPELL_POWER_HOLY_POWER
                ClassPowerTypes = {
                        HOLY_POWER = true,
                }

                ClassPowerEnable = _ClassPowerEnable
                ClassPowerDisable = _ClassPowerDisable
        elseif(PlayerClass == 'PRIEST') then
                ClassPowerType = SPELL_POWER_SHADOW_ORBS
                ClassPowerTypes = {
                        SHADOW_ORBS = true,
                }
                RequireSpec = SPEC_PRIEST_SHADOW

                ClassPowerEnable = function(self)
                        self:RegisterEvent('PLAYER_TALENT_UPDATE', Visibility, true)
                        return _ClassPowerEnable(self)
                end

                ClassPowerDisable = function(self)
                        self:UnregisterEvent('PLAYER_TALENT_UPDATE', Visibility)
                        return _ClassPowerDisable(self)
                end
        elseif(PlayerClass == 'WARLOCK') then
                ClassPowerType = SPELL_POWER_SOUL_SHARDS
                ClassPowerTypes = {
                        SOUL_SHARDS = true,
                }
                RequireSpell = WARLOCK_SOULBURN

                ClassPowerEnable = function(self)
                        self:RegisterEvent('SPELLS_CHANGED', Visibility, true)
                        return _ClassPowerEnable(self)
                end

                ClassPowerDisable = function(self)
                        self:UnregisterEvent('SPELLS_CHANGED', Visibility)
                        return _ClassPowerDisable(self)
                end
        end
end

local Enable = function(self, unit)
        local element = self.ClassIcons
        if(not element) then return end

        element.__owner = self
        element.__max = 0
        element.ForceUpdate = ForceUpdate

        if(ClassPowerEnable) then
                ClassPowerEnable(self)

                for i=1, 5 do
                        local icon = element[i]
                        if(icon:IsObjectType'Texture' and not icon:GetTexture()) then
                                icon:SetTexCoord(0.45703125, 0.60546875, 0.44531250, 0.73437500)
                                icon:SetTexture([[Interface\PlayerFrame\Priest-ShadowUI]])
                        end
                end

                (element.UpdateTexture or UpdateTexture) (element)

                return true
        end
end

local Disable = function(self)
        local element = self.ClassIcons
        if(not element) then return end

        ClassPowerDisable(self)
end

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

Compare with Previous | Blame