view classes/ReAction_PetActionType.lua @ 15:0ea4c8ab1991

Removed redundant setting of config.id in PetActionType
author Flick <flickerstreak@gmail.com>
date Thu, 22 Mar 2007 21:07:53 +0000
parents f920db5fc6b1
children
line wrap: on
line source
-- The ReAction.PetActionType mixin defines Pet action button functionality 
-- and is an implementation of the ReAction.IActionType interface.
--
-- The Mixin assumes that it is being mixed in with a ReAction-derived class
-- which implements the ReAction.IDisplay and ReAction.PetActionType.IDisplay interfaces.

local AceOO = AceLibrary("AceOO-2.0")

ReAction.PetActionType = AceOO.Mixin {
  -- ReAction.IDisplay interface
  "SetID",
  "GetID",
  "SetupAction",
  "UpdateAction",
  "PickupAction",
  "PlaceAction",
  "IsActionEmpty",
  "UpdateTooltip",

  -- Event handlers
  "PLAYER_ENTERING_WORLD",
  "PLAYER_CONTROL_LOST",
  "PLAYER_CONTROL_GAINED",
  "PLAYER_FARSIGHT_FOCUS_CHANGED",
  "UNIT_PET",
  "UNIT_FLAGS",
  "UNIT_AURA",
  "PET_BAR_UPDATE",
  "PET_BAR_UPDATE_COOLDOWN",
  "PET_BAR_SHOWGRID",
  "PET_BAR_HIDEGRID",

  -- Internal functions
  "UpdateCooldown",
}

local RAPAT = ReAction.PetActionType

-- Required display elements
RAPAT.IDisplay = AceOO.Interface {
  DisplayAutoCast     = "function", -- DisplayAutoCast(bool)
  DisplayAutoCastable = "function", -- DisplayAutoCastable(bool)
  DisplayIcon         = "function", -- DisplayIcon(texture), Display the icon texture (nil for empty slot)
  DisplayCooldown     = "function", -- DisplayCooldown(start, duration, enable), display cooldown timer
  DisplayInUse        = "function", -- DisplayInUse(bool), display whether the action is in use
  DisplayUsable       = "function", -- DisplayUsable(bool), display whether the action can be used now
}


-- private constants
local actionIDColor = { r=1.00,  g=0.82,  b=0.00,  a=1.00 } -- gold

-- private functions
-- extract and return color fields from a table, to be fed into SetVertexColor()/SetTextColor()
local function tcolor(c)
  return c.r, c.g, c.b, c.a
end

---------------------------------------
-- ReAction.IActionType interface implementation
---------------------------------------
function RAPAT:SetID( id )  -- paging not supported
  id = tonumber(id)  -- force data integrity
  if id then
    local f = self:GetActionFrame()
    f:SetAttribute("action",id)
    -- the following is the goofy hack to work around Blizzard not exporting the pet functions securely
    f:SetAttribute("clickbutton2",getglobal("PetActionButton"..id))
  end
end

function RAPAT:GetID()
  return SecureButton_GetModifiedAttribute(self:GetActionFrame(), "action", button)
end

function RAPAT:SetupAction()
  local b = self:GetActionFrame()
  -- Blizzard didn't support TogglePetAutocast functionality in
  -- SecureButton_OnClick(), so we have to spoof it
  -- by delegating right-clicks to the hidden default action buttons
  b:SetAttribute("type", "pet")
  b:SetAttribute("type2", "click") 

  -- shift-clicking to drag locked buttons off
	b:SetAttribute("checkselfcast", true)
	b:SetAttribute("useparent-unit", true)
	
	self:RegisterEvent("PLAYER_ENTERING_WORLD")
	self:RegisterEvent("PLAYER_CONTROL_LOST");
	self:RegisterEvent("PLAYER_CONTROL_GAINED");
	self:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED");
	self:RegisterEvent("UNIT_PET");
	self:RegisterEvent("UNIT_FLAGS");
	self:RegisterEvent("UNIT_AURA");
	self:RegisterEvent("PET_BAR_UPDATE");
	self:RegisterEvent("PET_BAR_UPDATE_COOLDOWN");
	self:RegisterEvent("PET_BAR_SHOWGRID");
	self:RegisterEvent("PET_BAR_HIDEGRID");
  
  self:UpdateAction()
end

function RAPAT:UpdateAction()
  local id = self:GetID()
  if id then
    local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(id);
    self:DisplayIcon( isToken and getglobal(texture) or texture )
    self:DisplayInUse( isActive )
    self:DisplayAutoCastable( autoCastAllowed )
    self:DisplayAutoCast( autoCastEnabled )
    self:DisplayCooldown( GetPetActionCooldown(id) )
    self:DisplayUsable(GetPetActionsUsable())
    -- If it's a 'token' save away the tooltip name for updateTooltip
    self.isToken = isToken
    if isToken then
      self.tooltipName = getglobal(name)
      self.tooltipSubtext = subtext
    end
  end
end

function RAPAT:PickupAction()
  PickupPetAction(self:GetID())
  self:UpdateAction()
end

function RAPAT:PlaceAction()
  if not InCombatLockdown() then
    PlacePetAction(self:GetID())
  end
  self:UpdateAction()
end

function RAPAT:IsActionEmpty()
  local id = self:GetID()
  return not(id and GetPetActionInfo(id))
end

function RAPAT:UpdateTooltip()
  local id = self:GetID()
	if GameTooltip:IsOwned(self:GetActionFrame()) and id then
    if self.isToken then
      GameTooltip:SetText(self.tooltipName, 1.0, 1.0, 1.0)
      if ( self.tooltipSubtext ) then
        GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5);
      end
      GameTooltip:Show();
    else
      if GameTooltip:SetPetAction(id) then
    		self.tooltipTime = TOOLTIP_UPDATE_TIME
      end
    end
	else
		self.tooltipTime = nil
	end
end


-----------------------------
-- Event Handling
-----------------------------
function RAPAT:PLAYER_ENTERING_WORLD()
  self:UpdateAction()
end

function RAPAT:PLAYER_CONTROL_LOST()
  self:UpdateAction()
end

function RAPAT:PLAYER_CONTROL_GAINED()
  self:UpdateAction()
end

function RAPAT:PLAYER_FARSIGHT_FOCUS_CHANGED()
  self:UpdateAction()
end

function RAPAT:UNIT_PET(unit)
  if unit == "player" then
    self:UpdateAction()
  end
end

function RAPAT:UNIT_FLAGS(unit)
  if unit == "pet" then
    self:UpdateAction()
  end
end

function RAPAT:UNIT_AURA(unit)
  if unit == "pet" then
    self:UpdateAction()
  end
end

function RAPAT:PET_BAR_UPDATE()
  self:UpdateAction()
end

function RAPAT:PET_BAR_UPDATE_COOLDOWN()
  self:UpdateCooldown()
end

function RAPAT:PET_BAR_SHOWGRID()
  self:TempShow(true)
end

function RAPAT:PET_BAR_HIDEGRID()
  self:TempShow(false)
end


-------------------------------------
-- Internal functions
-------------------------------------
function RAPAT:UpdateCooldown()
  local id = self:GetID()
  if id then
    self:DisplayCooldown( GetPetActionCooldown(id) )
  end
end