168 lines
3.8 KiB
Lua
168 lines
3.8 KiB
Lua
|
--[[ Element: Totem Indicator
|
||
|
|
||
|
Handles updating and visibility of Shaman totems, Druid mushrooms and Death
|
||
|
Knight ghouls.
|
||
|
|
||
|
Widget
|
||
|
|
||
|
Totems - A table to hold sub-widgets.
|
||
|
|
||
|
Sub-Widgets
|
||
|
|
||
|
Totem - Any UI widget.
|
||
|
.Icon - A Texture representing the totem icon.
|
||
|
.Cooldown - A Cooldown representing the duration of the totem.
|
||
|
|
||
|
Notes
|
||
|
|
||
|
OnEnter and OnLeave will be set to display the default Tooltip, if the
|
||
|
`Totem` widget is mouse enabled.
|
||
|
|
||
|
Options
|
||
|
|
||
|
:UpdateTooltip - The function that should populate the tooltip, when the
|
||
|
`Totem` widget is hovered. A default function, which calls
|
||
|
`:SetTotem(id)`, will be used if none is defined.
|
||
|
|
||
|
Examples
|
||
|
|
||
|
local Totems = {}
|
||
|
for index = 1, MAX_TOTEMS do
|
||
|
-- Position and size of the totem indicator
|
||
|
local Totem = CreateFrame('Button', nil, self)
|
||
|
Totem:SetSize(40, 40)
|
||
|
Totem:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', index * Totem:GetWidth(), 0)
|
||
|
|
||
|
local Icon = Totem:CreateTexture(nil, "OVERLAY")
|
||
|
Icon:SetAllPoints()
|
||
|
|
||
|
local Cooldown = CreateFrame("Cooldown", nil, Totem, "CooldownFrameTemplate")
|
||
|
Cooldown:SetAllPoints()
|
||
|
|
||
|
Totem.Icon = Icon
|
||
|
Totem.Cooldown = Cooldown
|
||
|
|
||
|
Totems[index] = Totem
|
||
|
end
|
||
|
|
||
|
-- Register with oUF
|
||
|
self.Totems = Totems
|
||
|
|
||
|
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 parent, ns = ...
|
||
|
local oUF = ns.oUF
|
||
|
|
||
|
local UpdateTooltip = function(self)
|
||
|
GameTooltip:SetTotem(self:GetID())
|
||
|
end
|
||
|
|
||
|
local OnEnter = function(self)
|
||
|
if(not self:IsVisible()) then return end
|
||
|
|
||
|
GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
|
||
|
self:UpdateTooltip()
|
||
|
end
|
||
|
|
||
|
local OnLeave = function()
|
||
|
GameTooltip:Hide()
|
||
|
end
|
||
|
|
||
|
local UpdateTotem = function(self, event, slot)
|
||
|
local totems = self.Totems
|
||
|
if(slot > #totems) then return end
|
||
|
|
||
|
if(totems.PreUpdate) then totems:PreUpdate(slot) end
|
||
|
|
||
|
local totem = totems[slot]
|
||
|
local haveTotem, name, start, duration, icon = GetTotemInfo(slot)
|
||
|
if(haveTotem and duration > 0) then
|
||
|
if(totem.Icon) then
|
||
|
totem.Icon:SetTexture(icon)
|
||
|
end
|
||
|
|
||
|
if(totem.Cooldown) then
|
||
|
totem.Cooldown:SetCooldown(start, duration)
|
||
|
end
|
||
|
|
||
|
totem:Show()
|
||
|
else
|
||
|
totem:Hide()
|
||
|
end
|
||
|
|
||
|
if(totems.PostUpdate) then
|
||
|
return totems:PostUpdate(slot, haveTotem, name, start, duration, icon)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local Path = function(self, ...)
|
||
|
return (self.Totems.Override or UpdateTotem) (self, ...)
|
||
|
end
|
||
|
|
||
|
local Update = function(self, event)
|
||
|
for i = 1, #self.Totems do
|
||
|
Path(self, event, i)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local ForceUpdate = function(element)
|
||
|
return Update(element.__owner, 'ForceUpdate')
|
||
|
end
|
||
|
|
||
|
local Enable = function(self)
|
||
|
local totems = self.Totems
|
||
|
|
||
|
if(totems) then
|
||
|
totems.__owner = self
|
||
|
totems.ForceUpdate = ForceUpdate
|
||
|
|
||
|
for i = 1, #totems do
|
||
|
local totem = totems[i]
|
||
|
|
||
|
totem:SetID(i)
|
||
|
|
||
|
if(totem:IsMouseEnabled()) then
|
||
|
totem:SetScript('OnEnter', OnEnter)
|
||
|
totem:SetScript('OnLeave', OnLeave)
|
||
|
|
||
|
if(not totem.UpdateTooltip) then
|
||
|
totem.UpdateTooltip = UpdateTooltip
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:RegisterEvent('PLAYER_TOTEM_UPDATE', Path, true)
|
||
|
|
||
|
TotemFrame:UnregisterEvent"PLAYER_TOTEM_UPDATE"
|
||
|
TotemFrame:UnregisterEvent"PLAYER_ENTERING_WORLD"
|
||
|
TotemFrame:UnregisterEvent"UPDATE_SHAPESHIFT_FORM"
|
||
|
TotemFrame:UnregisterEvent"PLAYER_TALENT_UPDATE"
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local Disable = function(self)
|
||
|
local totems = self.Totems
|
||
|
|
||
|
if(totems) then
|
||
|
for i = 1, #totems do
|
||
|
totems[i]:Hide()
|
||
|
end
|
||
|
|
||
|
TotemFrame:RegisterEvent"PLAYER_TOTEM_UPDATE"
|
||
|
TotemFrame:RegisterEvent"PLAYER_ENTERING_WORLD"
|
||
|
TotemFrame:RegisterEvent"UPDATE_SHAPESHIFT_FORM"
|
||
|
TotemFrame:RegisterEvent"PLAYER_TALENT_UPDATE"
|
||
|
|
||
|
self:UnregisterEvent('PLAYER_TOTEM_UPDATE', Path)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
oUF:AddElement("Totems", Update, Enable, Disable)
|