Quantcast
WoWInterface: SVN - bdGrid - Rev 2 - /trunk/lib/oUF/elements/range.lua

WoWInterface SVN bdGrid

[/] [trunk/] [lib/] [oUF/] [elements/] [range.lua] - Rev 2

Go to most recent revision | Compare with Previous | Blame | View Log

--[[ Element: Range Fader

 Widget

 Range - A table containing opacity values.

 Options

 .outsideAlpha - Opacity when the unit is out of range. Values 0 (fully
                 transparent) - 1 (fully opaque).
 .insideAlpha  - Opacity when the unit is within range. Values 0 (fully
                 transparent) - 1 (fully opaque).

 Examples

   -- Register with oUF
   self.Range = {
      insideAlpha = 1,
      outsideAlpha = 1/2,
   }

 Hooks

]]

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

local _FRAMES = {}
local OnRangeFrame

local UnitInRange, UnitIsConnected = UnitInRange, UnitIsConnected

-- updating of range.
local timer = 0
local OnRangeUpdate = function(self, elapsed)
        timer = timer + elapsed

        if(timer >= .20) then
                for _, object in next, _FRAMES do
                        if(object:IsShown()) then
                                local range = object.Range
                                if(UnitIsConnected(object.unit)) then
                                        local inRange, checkedRange = UnitInRange(object.unit)
                                        if(checkedRange and not inRange) then
                                                if(range.Override) then
                                                        --[[ .Override(self, status)

                                                         A function used to override the calls to :SetAlpha().

                                                         Arguments

                                                         self   - The unit object.
                                                         status - The range status of the unit. Either `inside` or
                                                                  `outside`.
                                                        ]]
                                                        range.Override(object, 'outside')
                                                else
                                                        object:SetAlpha(range.outsideAlpha)
                                                end
                                        else
                                                if(range.Override) then
                                                        range.Override(object, 'inside')
                                                elseif(object:GetAlpha() ~= range.insideAlpha) then
                                                        object:SetAlpha(range.insideAlpha)
                                                end
                                        end
                                else
                                        if(range.Override) then
                                                range.Override(object, 'offline')
                                        elseif(object:GetAlpha() ~= range.insideAlpha) then
                                                object:SetAlpha(range.insideAlpha)
                                        end
                                end
                        end
                end

                timer = 0
        end
end

local Enable = function(self)
        local range = self.Range
        if(range and range.insideAlpha and range.outsideAlpha) then
                table.insert(_FRAMES, self)

                if(not OnRangeFrame) then
                        OnRangeFrame = CreateFrame"Frame"
                        OnRangeFrame:SetScript("OnUpdate", OnRangeUpdate)
                end

                OnRangeFrame:Show()

                return true
        end
end

local Disable = function(self)
        local range = self.Range
        if(range) then
                for k, frame in next, _FRAMES do
                        if(frame == self) then
                                table.remove(_FRAMES, k)
                                break
                        end
                end
                self:SetAlpha(1)

                if(#_FRAMES == 0) then
                        OnRangeFrame:Hide()
                end
        end
end

oUF:AddElement('Range', nil, Enable, Disable)

Go to most recent revision | Compare with Previous | Blame