WoWInterface SVN bdGrid

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

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

--[[ Element: Monk Stagger Bar

 Handles updating and visibility of the monk's stagger bar.

 Widget

 Stagger - A StatusBar

 Sub-Widgets

 .bg - A Texture that functions as a background. It will inherit the color
       of the main StatusBar.

 Notes

 The default StatusBar texture will be applied if the UI widget doesn't have a
 status bar texture or color defined.

 In order to override the internal update define the 'OnUpdate' script on the
 widget in the layout

 Sub-Widgets Options

 .multiplier - Defines a multiplier, which is used to tint the background based
               on the main widgets R, G and B values. Defaults to 1 if not
               present.

 Examples

   local Stagger = CreateFrame('StatusBar', nil, self)
   Stagger:SetSize(120, 20)
   Stagger:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', 0, 0)

   -- Register with oUF
   self.Stagger = Stagger

 Hooks

 OverrideVisibility(self) - Used to completely override the internal visibility
                            function. Removing the table key entry will make
                            the element fall-back to its internal function
                            again.
 Override(self)           - Used to completely override the internal
                            update function. Removing the table key entry will
                            make the element fall-back to its internal function
                            again.
]]

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

-- percentages at which the bar should change color
local STAGGER_YELLOW_TRANSITION = STAGGER_YELLOW_TRANSITION
local STAGGER_RED_TRANSITION = STAGGER_RED_TRANSITION

-- table indices of bar colors
local GREEN_INDEX = 1;
local YELLOW_INDEX = 2;
local RED_INDEX = 3;

local STANCE_OF_THE_STURY_OX_ID = 23

local UnitHealthMax = UnitHealthMax
local UnitStagger = UnitStagger

local _, playerClass = UnitClass("player")

-- TODO: fix color in the power element
oUF.colors.power[BREWMASTER_POWER_BAR_NAME] = {
        {0.52, 1.0, 0.52},
        {1.0, 0.98, 0.72},
        {1.0, 0.42, 0.42},
}
local color

local Update = function(self, event, unit)
        if unit and unit ~= self.unit then return end
        local element = self.Stagger

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

        local maxHealth = UnitHealthMax("player")
        local stagger = UnitStagger("player")
        local staggerPercent = stagger / maxHealth

        element:SetMinMaxValues(0, maxHealth)
        element:SetValue(stagger)

        local rgb
        if(staggerPercent >= STAGGER_RED_TRANSITION) then
                rgb = color[RED_INDEX]
        elseif(staggerPercent > STAGGER_YELLOW_TRANSITION) then
                rgb = color[YELLOW_INDEX]
        else
                rgb = color[GREEN_INDEX]
        end

        local r, g, b = rgb[1], rgb[2], rgb[3]
        element:SetStatusBarColor(r, g, b)

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

        if(element.PostUpdate) then
                element:PostUpdate(maxHealth, stagger, staggerPercent, r, g, b)
        end
end

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

local Visibility = function(self, event, unit)
        if(STANCE_OF_THE_STURY_OX_ID ~= GetShapeshiftFormID() or UnitHasVehiclePlayerFrameUI("player")) then
                if self.Stagger:IsShown() then
                        self.Stagger:Hide()
                        self:UnregisterEvent('UNIT_AURA', Path)
                end
        elseif not self.Stagger:IsShown() then
                self.Stagger:Show()
                self:RegisterEvent('UNIT_AURA', Path)
                return Path(self, event, unit)
        end
end

local VisibilityPath = function(self, ...)
        return (self.Stagger.OverrideVisibility or Visibility)(self, ...)
end

local ForceUpdate = function(element)
        return VisibilityPath(element.__owner, "ForceUpdate", element.__owner.unit)
end

local Enable = function(self, unit)
        if(playerClass ~= "MONK") then return end

        local element = self.Stagger
        if(element) then
                element.__owner = self
                element.ForceUpdate = ForceUpdate
                element:Hide()

                color = self.colors.power[BREWMASTER_POWER_BAR_NAME]

                self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
                self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)

                if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
                        element:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
                end

                MonkStaggerBar.Show = MonkStaggerBar.Hide
                MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
                MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
                MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
                MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'

                return true
        end
end

local Disable = function(self)
        local element = self.Stagger
        if(element) then
                element:Hide()
                self:UnregisterEvent('UNIT_AURA', Path)
                self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
                self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)

                MonkStaggerBar.Show = nil
                MonkStaggerBar:Show()
                MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
                MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
                MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
                MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
        end
end

oUF:AddElement("Stagger", VisibilityPath, Enable, Disable)

Go to most recent revision | Compare with Previous | Blame