diff classes/ReAction_PetActionDisplay.lua @ 7:f920db5fc6b1

version 0.3
author Flick <flickerstreak@gmail.com>
date Tue, 20 Mar 2007 21:25:29 +0000
parents
children c05fd3e18b4f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/classes/ReAction_PetActionDisplay.lua	Tue Mar 20 21:25:29 2007 +0000
@@ -0,0 +1,322 @@
+-- The ReAction.PetActionDisplay mixin defines 'regular' action button display functionality
+-- and is an implementation of the ReAction.IDisplay and ReAction.ActionType.IDisplay interfaces.
+--
+-- This Mixin assumes that it has been mixed in with a ReAction-derived class which implements
+-- the ReAction.IActionType and ReAction.IColorScheme interfaces.
+--
+-- This mixin uses properties of self.config to define display elements:
+--
+-- self.config = {
+--   keyBindLoc = "POSITION",       -- keybind anchor location
+--   showKeyBind = true/false,      -- show keybind labels
+--   showGrid = true/false,         -- always show empty buttons
+-- }
+--
+
+local AceOO = AceLibrary("AceOO-2.0")
+
+ReAction.PetActionDisplay = AceOO.Mixin {
+  -- ReAction.IDisplay interface
+  "SetupDisplay",
+  "UpdateDisplay",
+  "TempShow",
+  "GetActionFrame",
+  "GetBaseButtonSize",
+  "DisplayID",
+  "DisplayHotkey",
+
+  -- ReAction.PetActionType.IDisplay interface
+  "DisplayAutoCast",
+  "DisplayAutoCastable",
+  "DisplayInUse",
+  "DisplayUsable",
+  "DisplayIcon",
+  "DisplayCooldown",
+
+  -- Event handlers
+  "PreClick",
+  "PostClick",
+  "OnDragStart",
+  "OnReceiveDrag",
+  "OnEnter",
+  "OnLeave",
+
+  -- internal functions
+  "ApplyLayout",
+  "ApplyStyle",
+  "DisplayVisibility",
+}
+
+local RAPAD = ReAction.PetActionDisplay
+
+
+-- private constants
+local _G = getfenv(0)
+
+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
+
+
+-----------------------------------
+-- Interface Implementation Methods
+-----------------------------------
+function RAPAD:SetupDisplay( name )
+  -- create the button widget
+  local b = CreateFrame("CheckButton", name, nil, "ActionButtonTemplate, SecureActionButtonTemplate")
+  b:EnableMouse()
+  b:RegisterForDrag("LeftButton", "RightButton")
+  b:RegisterForClicks("AnyUp")
+  b:SetScript("PreClick",      function(arg1) self:PreClick(arg1) end)
+  b:SetScript("PostClick",     function(arg1) self:PostClick(arg1) end)
+  b:SetScript("OnDragStart",   function(arg1) self:OnDragStart(arg1) end)
+  b:SetScript("OnReceiveDrag", function() self:OnReceiveDrag() end)
+  b:SetScript("OnEnter",       function() self:OnEnter() end)
+  b:SetScript("OnLeave",       function() self:OnLeave() end)
+
+
+  b:SetWidth(30)
+  b:SetHeight(30)
+  
+  local tx = b:GetNormalTexture()
+  tx:ClearAllPoints()
+  tx:SetWidth(54)
+  tx:SetHeight(54)
+  tx:SetPoint("CENTER",0,-1)
+
+  local autoCastable = b:CreateTexture(nil, "OVERLAY")
+  autoCastable:SetTexture("Interface\\Buttons\\UI-AutoCastableOverlay")
+  autoCastable:SetWidth(58)
+  autoCastable:SetHeight(58)
+  autoCastable:SetPoint("CENTER")
+  autoCastable:Hide()
+
+  local autoCast = CreateFrame("Model",nil,b)
+  autoCast:SetModel("Interface\\Buttons\\UI-AutoCastButton.mdx")
+  autoCast:SetScale(1.2)
+  autoCast:SetAllPoints()
+  autoCast:SetSequence(0)
+  autoCast:SetSequenceTime(0,0)
+  autoCast:SetFrameStrata("HIGH") -- Otherwise it won't appear on top of the icon for some reason
+  autoCast:Hide()
+
+
+  local cd = _G[name.."Cooldown"]
+	cd:SetScale(1);
+	cd:ClearAllPoints();
+	cd:SetWidth(33);
+	cd:SetHeight(33);
+	cd:SetPoint("CENTER", -2, -1);
+
+  -- store references to the various sub-frames of ActionButtonTemplate so we don't have to look it up all the time
+  self.frames      = {
+    button         = b,
+    autoCastable   = autoCastable, --_G[name.."AutoCastable"],
+    autoCast       = autoCast, --_G[name.."AutoCast"],
+    hotkey         = _G[name.."HotKey"],
+    cooldown       = cd,
+    icon           = _G[name.."Icon"],
+    normalTexture  = tx, --_G[name.."NormalTexture2"],
+    actionID       = nil,    -- defer creating actionID font string until it's actually requested
+  }
+
+  self.tmpShow_ = 0
+end
+
+function RAPAD:UpdateDisplay()
+  self:ApplyLayout()
+  self:ApplyStyle()
+  self:DisplayVisibility()
+  -- refresh the action ID display
+  if ReAction.showIDs_ then
+    self:DisplayID(self:GetID())
+  end
+end
+
+function RAPAD:TempShow( visible )
+  visible = visible and true or false -- force data integrity
+  self.showTmp_ = max(0, (self.showTmp_ or 0) + (visible and 1 or -1))
+  self:DisplayVisibility()
+end
+
+function RAPAD:GetActionFrame()
+  return self.frames.button
+end
+
+function RAPAD:GetBaseButtonSize()
+  return 30
+end
+
+function RAPAD:DisplayID( id )
+  local f = self.frames.actionID
+  if id then
+    if not f then
+      -- create the actionID label
+      f = self.frames.button:CreateFontString(nil,"ARTWORK","NumberFontNormalSmall")
+      f:SetPoint("BOTTOMLEFT")
+      f:SetTextColor( tcolor(actionIDColor) )
+      self.frames.actionID = f
+    end
+    f:SetText(tostring(id))
+    f:Show()
+  elseif f then
+    f:Hide()
+  end
+end
+
+function RAPAD:DisplayHotkey(txt)
+  self.frames.hotkey:SetText(string.upper(txt or ""))
+end
+
+function RAPAD:DisplayInUse( inUse )
+  self.frames.button:SetChecked( inUse and 1 or 0 )
+end
+
+function RAPAD:DisplayUsable( usable )
+  SetDesaturation(self.frames.icon, (not usable) and 1 or nil) -- argument is backward
+  self.frames.hotkey:SetTextColor(self:GetHotkeyColor(usable, false, false, self.frames.hotkey:GetText()) )
+end
+
+function RAPAD:DisplayAutoCast( show )
+  if show then 
+    self.frames.autoCast:Show()
+  else
+    self.frames.autoCast:Hide()
+  end
+end
+
+function RAPAD:DisplayAutoCastable( show )
+  if show then 
+    self.frames.autoCastable:Show()
+  else
+    self.frames.autoCastable:Hide()
+  end
+end
+
+function RAPAD:DisplayIcon( texture )
+  local f = self.frames.button
+  local icon = self.frames.icon
+  if texture then
+    icon:SetTexture(texture)
+    icon:Show()
+    f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
+  else
+    f:SetScript("OnUpdate",nil)
+    icon:Hide()
+    f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
+  end
+  self:DisplayVisibility()
+end
+
+function RAPAD:DisplayCooldown( start, duration, enable )
+  CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enable)
+end
+
+
+
+
+
+
+----------------------
+-- Event Handlers
+----------------------
+function RAPAD:PreClick()
+  -- not sure why we have to do this
+  self.frames.button:SetChecked(0)
+end
+
+function RAPAD:PostClick()
+  self:UpdateAction()
+end
+
+function RAPAD:OnDragStart()
+  if LOCK_ACTIONBAR ~= "1" or IsShiftKeyDown() then
+    self:PickupAction()
+  end
+end
+
+function RAPAD:OnReceiveDrag()
+  self:PlaceAction()
+end
+
+function RAPAD:OnEnter()
+  self:SetTooltip() -- from ReAction base class
+end
+
+function RAPAD:OnLeave()
+  self:ClearTooltip() -- from ReAction base class
+end
+
+
+
+----------------------
+-- Internal methods
+----------------------
+
+local function placeLabel( label, anchor )
+  local top = string.match(anchor,"TOP")
+  local bottom = string.match(anchor, "BOTTOM")
+  label:ClearAllPoints()
+  label:SetWidth(40)
+  label:SetPoint(top or bottom,0,top and 2 or -2)
+  local j
+  if string.match(anchor,"LEFT") then
+    j = "LEFT"
+  elseif string.match(anchor,"RIGHT") then
+    j = "RIGHT"
+  else
+    j = "CENTER"
+  end
+  label:SetJustifyH(j)
+end
+
+
+function RAPAD:ApplyLayout()
+  local f = self.frames
+
+  if self.config.keyBindLoc then
+    placeLabel(f.hotkey, self.config.keyBindLoc)
+  end
+
+  if self.config.showKeyBind then
+    f.hotkey:Show()
+  else
+    f.hotkey:Hide()
+  end
+
+  if self.config.showBorder then
+    f.normalTexture:SetAlpha(1)
+  else
+    f.normalTexture:SetAlpha(0)
+  end
+end
+
+function RAPAD:ApplyStyle()
+
+end
+
+function RAPAD:DisplayVisibility()
+  local b = self.frames.button
+
+  -- can't hide/show in combat
+  if not InCombatLockdown() then
+    if b:GetAttribute("statehidden") then
+      b:Hide()
+    elseif not self:IsActionEmpty() then
+      b:GetNormalTexture():SetAlpha(1.0)
+      b:Show()
+    elseif self.showTmp_ and self.showTmp_ > 0 or self.config.showGrid then
+      b:GetNormalTexture():SetAlpha(0.5)
+      self.frames.cooldown:Hide()
+      b:Show()
+    else
+      b:Hide()
+    end
+  end
+end
+