view classes/StanceButton.lua @ 169:8cc187143acd

Strip out obsolete revision tracking
author Flick <flickerstreak@gmail.com>
date Tue, 19 Oct 2010 17:20:16 +0000
parents 0de0e64a970f
children df68b5a40490
line wrap: on
line source
local ReAction = ReAction
local L = ReAction.L
local _G = _G
local CreateFrame = CreateFrame
local format = string.format
local GetCVar = GetCVar
local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
local CooldownFrame_SetTimer = CooldownFrame_SetTimer
local InCombatLockdown = InCombatLockdown
local GetNumShapeshiftForms = GetNumShapeshiftForms
local GetShapeshiftFormInfo = GetShapeshiftFormInfo
local IsUsableSpell = IsUsableSpell
local GetSpellInfo = GetSpellInfo

--
-- private
--
local playerClass = select(2,UnitClass("player"))

local aspects = {
  -- All rank one, so that the usable check works
  GetSpellInfo(13163), -- monkey
  GetSpellInfo(13165), -- hawk
  GetSpellInfo(5118),  -- cheetah
  GetSpellInfo(34074), -- viper
  GetSpellInfo(13161), -- beast
  GetSpellInfo(13159), -- pack
  GetSpellInfo(20043), -- wild
  GetSpellInfo(61846), -- dragonhawk
}

local aspectLinks = { }

local eventList = {
  "PLAYER_REGEN_ENABLED",
  "PLAYER_ENTERING_WORLD",
  "UPDATE_SHAPESHIFT_FORM",
  "UPDATE_SHAPESHIFT_FORMS",
  "UPDATE_SHAPESHIFT_USABLE",
  "UPDATE_SHAPESHIFT_COOLDOWN",
  "UPDATE_BINDINGS",
}

local eventListHunter = {
  "PLAYER_REGEN_ENABLED",
  "PLAYER_ENTERING_WORLD",
  "SPELL_UPDATE_COOLDOWN",
  "SPELL_UPDATE_USABLE",
  "UNIT_AURA",
  "SPELLS_CHANGED",
  "UPDATE_BINDINGS",
}

if playerClass == "HUNTER" then
  eventList = eventListHunter
end

--
-- Stance Button class
--
local Super = ReAction.Button
local Stance = setmetatable( { }, { __index = Super } )
ReAction.Button.Stance = Stance

function Stance:New( idx, moduleConfig, bar, idHint )
  local name = format("ReAction_%s_Stance_%d",bar:GetName(),idx)
 
  self = Super.New(self, name, moduleConfig.buttons[bar:GetName()][idx], bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" )
  self.moduleConfig = moduleConfig
  self.hunterIdx = 1

  local f = self:GetFrame()
  local barFrame = bar:GetFrame()
  local config = self:GetConfig()

  -- set up the base stance ID
  self:SetActionIDPool("stance",8)
  config.stanceID = self:AcquireActionID(config.stanceID, idHint, true)

  -- attribute setup
  f:SetAttribute("type","spell")

  -- non secure scripts
  f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
  f:SetScript("OnEnter", function(frame) self:OnEnter() end)
  f:SetScript("OnLeave", function(frame) self:OnLeave() end)
  f:SetScript("PreClick", function(frame, ...) self:PreClick(...) end)

  -- secure handlers
  -- (none)

  -- event registration
  f:EnableMouse(true)
  f:RegisterForClicks("AnyUp")
  for _, evt in pairs(eventList) do
    f:RegisterEvent(evt)
  end

  -- attach to skinner
  bar:SkinButton(self)

  -- initial display
  if ReAction:GetConfigMode() then
    self:GetFrame():Show()
  end

  self:Refresh()

  return self
end

function Stance:GetModuleConfig()
  -- this is the Stance module config structure,
  -- not the config structure of the bar itself
  return self.moduleConfig
end

function Stance:GetActionID()
  return self.config.stanceID
end

function Stance:UpdateAction()
  if InCombatLockdown() then
    self.updatePending = true
  else
    self.updatePending = false
    local idx = self:GetActionID()
    local f = self:GetFrame()
    local c = self:GetModuleConfig()
    if playerClass == "HUNTER" then
      if c.showHunterAspects then
        -- re-map the index in the case of "hide monkey/hawk"
        if c.hideMonkeyHawk then
          local usable, outOfMana = IsUsableSpell(aspects[8])
          if usable or outOfMana then
            idx = idx + 2
            if idx > 8 then
              f:Hide()
              return
            end
          end
        end
        self.hunterIdx = idx
        -- cache the highest rank spellID
        if not aspectLinks[aspects[idx]] then
          aspectLinks[aspects[idx]] = GetSpellLink(aspects[idx],"")
        end
        local usable, outOfMana = IsUsableSpell(aspects[idx])
        if usable or outOfMana then
          f:SetAttribute("spell",aspects[idx])
          f:Show()
          self:Update()
        else
          -- haven't learned this spell yet
          f:Hide()
        end
      else
        f:Hide()
      end
    elseif idx > GetNumShapeshiftForms() or
       playerClass == "PALADIN" and c.hidePaladinAuras or
       playerClass == "DEATHKNIGHT" and c.hideDKPresences then
      f:Hide()
    else
      f:SetAttribute("spell", select(2,GetShapeshiftFormInfo(idx)))
      f:Show()
      self:Update()
    end
  end
end

function Stance:Refresh()
  Super.Refresh(self)
  self:UpdateHotkey()
  self:UpdateAction()
end

function Stance:Update()
  local texture, isActive, isCastable
  if playerClass == "HUNTER" then
    local name, rank
    local spell = aspects[self.hunterIdx]
    name, rank, texture = GetSpellInfo(spell)
    isCastable = IsUsableSpell(spell)
    for i = 1, 40 do
      local buff = UnitBuff("player",i,true)
      if not buff then break end
      if buff == spell then
        isActive = true
        texture = "Interface\\Icons\\Spell_Nature_WispSplode"
        break
      end
    end
  else
    local _
    texture, _, isActive, isCastable = GetShapeshiftFormInfo(self:GetActionID())
  end
  
  local icon = self.frames.icon
  icon:SetTexture(texture)
  self:GetFrame():SetChecked( isActive and 1 or 0 )
  if isCastable then
    self.frames.hotkey:Show()
    icon:SetVertexColor(1.0, 1.0, 1.0)
  else
    icon:SetVertexColor(0.4, 0.4, 0.4)
  end

  self:UpdateCooldown()
end

function Stance:UpdateCooldown()
  local start, duration, enabled
  if playerClass == "HUNTER" then
    local spell = aspects[self.hunterIdx]
    if spell then
      start, duration, enabled = GetSpellCooldown(spell)
    end
  else
    start, duration, enabled = GetShapeshiftFormCooldown(self:GetActionID())
  end
  if start then
    CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enabled)
  end
end

function Stance:SetTooltip()
  if GetCVar("UberTooltips") == "1" then
    GameTooltip_SetDefaultAnchor(GameTooltip, self:GetFrame())
  else
    GameTooltip:SetOwner(self:GetFrame(), "ANCHOR_RIGHT")
  end
  if playerClass == "HUNTER" then
    local aspect = aspects[self.hunterIdx]
    if aspect and aspectLinks[aspect] then
      GameTooltip:SetHyperlink(aspectLinks[aspect])
    end
  else
    GameTooltip:SetShapeshift(self:GetActionID())
  end
end

function Stance:OnEnter()
  self:SetTooltip()
end

function Stance:OnLeave()
  GameTooltip:Hide()
end

function Stance:PreClick()
  local f = self:GetFrame()
  f:SetChecked( not f:GetChecked() )
end

function Stance:OnEvent(event, arg)
  if event == "PLAYER_REGEN_ENABLED" then
    if self.updatePending then
      self:UpdateAction()
    end
  elseif event == "UPDATE_SHAPESHIFT_COOLDOWN" then
    self:UpdateCooldown()
  elseif event == "UPDATE_SHAPESHIFT_FORMS" or
         event == "SPELLS_CHANGED" then
    aspectLinks = { } -- force repopulate of the spellIDs
    self:UpdateAction()
  elseif event == "UNIT_AURA" then
    if arg == "player" then
      self:Update()
    end
  elseif event == "UPDATE_BINDINGS" then
    self:UpdateHotkey()
  else
    self:Update()
  end
end

function Stance:ShowGridTemp(show)
  if show then
    self:GetFrame():Show()
  else
    self:UpdateAction()
  end
end