commit from backup
This commit is contained in:
194
Libraries/oUF/elements/additionalpower.lua
Normal file
194
Libraries/oUF/elements/additionalpower.lua
Normal file
@@ -0,0 +1,194 @@
|
||||
--[[ Element: Additional Power Bar
|
||||
Handles updating and visibility of a status bar displaying the player's
|
||||
alternate/additional power, such as Mana for Balance druids.
|
||||
|
||||
Widget
|
||||
|
||||
AdditionalPower - A StatusBar to represent current caster mana.
|
||||
|
||||
Sub-Widgets
|
||||
|
||||
.bg - A Texture which 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.
|
||||
|
||||
Options
|
||||
|
||||
.colorClass - Use `self.colors.class[class]` to color the bar.
|
||||
.colorSmooth - Use `self.colors.smooth` to color the bar with a smooth
|
||||
gradient based on the players current mana percentage.
|
||||
.colorPower - Use `self.colors.power[token]` to color the bar. This will
|
||||
always use MANA as token.
|
||||
|
||||
Sub-Widget 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
|
||||
|
||||
-- Position and size
|
||||
local AdditionalPower = CreateFrame("StatusBar", nil, self)
|
||||
AdditionalPower:SetSize(20, 20)
|
||||
AdditionalPower:SetPoint('TOP')
|
||||
AdditionalPower:SetPoint('LEFT')
|
||||
AdditionalPower:SetPoint('RIGHT')
|
||||
|
||||
-- Add a background
|
||||
local Background = AdditionalPower:CreateTexture(nil, 'BACKGROUND')
|
||||
Background:SetAllPoints(AdditionalPower)
|
||||
Background:SetTexture(1, 1, 1, .5)
|
||||
|
||||
-- Register it with oUF
|
||||
self.AdditionalPower = AdditionalPower
|
||||
self.AdditionalPower.bg = Background
|
||||
|
||||
Hooks
|
||||
|
||||
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 _, ns = ...
|
||||
local oUF = ns.oUF
|
||||
|
||||
local playerClass = select(2, UnitClass('player'))
|
||||
|
||||
local ADDITIONAL_POWER_BAR_NAME = ADDITIONAL_POWER_BAR_NAME
|
||||
local ADDITIONAL_POWER_BAR_INDEX = ADDITIONAL_POWER_BAR_INDEX
|
||||
|
||||
local function Update(self, event, unit, powertype)
|
||||
if(unit ~= 'player' or (powertype and powertype ~= ADDITIONAL_POWER_BAR_NAME)) then return end
|
||||
|
||||
local element = self.AdditionalPower
|
||||
if(element.PreUpdate) then element:PreUpdate(unit) end
|
||||
|
||||
local cur = UnitPower('player', ADDITIONAL_POWER_BAR_INDEX)
|
||||
local max = UnitPowerMax('player', ADDITIONAL_POWER_BAR_INDEX)
|
||||
element:SetMinMaxValues(0, max)
|
||||
element:SetValue(cur)
|
||||
|
||||
local r, g, b, t
|
||||
if(element.colorClass) then
|
||||
t = self.colors.class[playerClass]
|
||||
elseif(element.colorSmooth) then
|
||||
r, g, b = self.ColorGradient(cur, max, unpack(element.smoothGradient or self.colors.smooth))
|
||||
elseif(element.colorPower) then
|
||||
t = self.colors.power[ADDITIONAL_POWER_BAR_NAME]
|
||||
end
|
||||
|
||||
if(t) then
|
||||
r, g, b = t[1], t[2], t[3]
|
||||
end
|
||||
|
||||
if(b) then
|
||||
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
|
||||
end
|
||||
|
||||
if(element.PostUpdate) then
|
||||
return element:PostUpdate(unit, cur, max, event)
|
||||
end
|
||||
end
|
||||
|
||||
local function Path(self, ...)
|
||||
return (self.AdditionalPower.Override or Update) (self, ...)
|
||||
end
|
||||
|
||||
local function ElementEnable(self)
|
||||
self:RegisterEvent('UNIT_POWER_FREQUENT', Path)
|
||||
self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
|
||||
self:RegisterEvent('UNIT_MAXPOWER', Path)
|
||||
|
||||
self.AdditionalPower:Show()
|
||||
|
||||
if self.AdditionalPower.PostUpdateVisibility then
|
||||
self.AdditionalPower:PostUpdateVisibility(true, not self.AdditionalPower.isEnabled)
|
||||
end
|
||||
|
||||
self.AdditionalPower.isEnabled = true
|
||||
|
||||
Path(self, 'ElementEnable', 'player', ADDITIONAL_POWER_BAR_NAME)
|
||||
end
|
||||
|
||||
local function ElementDisable(self)
|
||||
self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
|
||||
self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
|
||||
self:UnregisterEvent('UNIT_MAXPOWER', Path)
|
||||
|
||||
self.AdditionalPower:Hide()
|
||||
|
||||
if self.AdditionalPower.PostUpdateVisibility then
|
||||
self.AdditionalPower:PostUpdateVisibility(false, self.AdditionalPower.isEnabled)
|
||||
end
|
||||
|
||||
self.AdditionalPower.isEnabled = nil
|
||||
|
||||
Path(self, 'ElementDisable', 'player', ADDITIONAL_POWER_BAR_NAME)
|
||||
end
|
||||
|
||||
local function Visibility(self, event, unit)
|
||||
local shouldEnable
|
||||
|
||||
if(not UnitHasVehicleUI('player')) then
|
||||
if(UnitPowerMax(unit, ADDITIONAL_POWER_BAR_INDEX) ~= 0) then
|
||||
if(ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass]) then
|
||||
local powerType = UnitPowerType(unit)
|
||||
shouldEnable = ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass][powerType]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(shouldEnable) then
|
||||
ElementEnable(self)
|
||||
else
|
||||
ElementDisable(self)
|
||||
end
|
||||
end
|
||||
|
||||
local VisibilityPath = function(self, ...)
|
||||
return (self.AdditionalPower.OverrideVisibility or Visibility) (self, ...)
|
||||
end
|
||||
|
||||
local function ForceUpdate(element)
|
||||
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
|
||||
end
|
||||
|
||||
local Enable = function(self, unit)
|
||||
local element = self.AdditionalPower
|
||||
if(element and unit == 'player') then
|
||||
element.__owner = self
|
||||
element.ForceUpdate = ForceUpdate
|
||||
|
||||
self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
|
||||
|
||||
if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
|
||||
element:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local Disable = function(self)
|
||||
local element = self.AdditionalPower
|
||||
if(element) then
|
||||
ElementDisable(self)
|
||||
|
||||
self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
|
||||
end
|
||||
end
|
||||
|
||||
oUF:AddElement('AdditionalPower', VisibilityPath, Enable, Disable)
|
||||
Reference in New Issue
Block a user