annotate classes/ReAction_PetActionDisplay.lua @ 8:c05fd3e18b4f

Version 0.31
author Flick <flickerstreak@gmail.com>
date Tue, 20 Mar 2007 21:33:59 +0000
parents f920db5fc6b1
children f3a7bfebc283
rev   line source
flickerstreak@7 1 -- The ReAction.PetActionDisplay mixin defines 'regular' action button display functionality
flickerstreak@7 2 -- and is an implementation of the ReAction.IDisplay and ReAction.ActionType.IDisplay interfaces.
flickerstreak@7 3 --
flickerstreak@7 4 -- This Mixin assumes that it has been mixed in with a ReAction-derived class which implements
flickerstreak@7 5 -- the ReAction.IActionType and ReAction.IColorScheme interfaces.
flickerstreak@7 6 --
flickerstreak@7 7 -- This mixin uses properties of self.config to define display elements:
flickerstreak@7 8 --
flickerstreak@7 9 -- self.config = {
flickerstreak@7 10 -- keyBindLoc = "POSITION", -- keybind anchor location
flickerstreak@7 11 -- showKeyBind = true/false, -- show keybind labels
flickerstreak@7 12 -- showGrid = true/false, -- always show empty buttons
flickerstreak@7 13 -- }
flickerstreak@7 14 --
flickerstreak@7 15
flickerstreak@7 16 local AceOO = AceLibrary("AceOO-2.0")
flickerstreak@7 17
flickerstreak@7 18 ReAction.PetActionDisplay = AceOO.Mixin {
flickerstreak@7 19 -- ReAction.IDisplay interface
flickerstreak@7 20 "SetupDisplay",
flickerstreak@7 21 "UpdateDisplay",
flickerstreak@7 22 "TempShow",
flickerstreak@7 23 "GetActionFrame",
flickerstreak@7 24 "GetBaseButtonSize",
flickerstreak@7 25 "DisplayID",
flickerstreak@7 26 "DisplayHotkey",
flickerstreak@7 27
flickerstreak@7 28 -- ReAction.PetActionType.IDisplay interface
flickerstreak@7 29 "DisplayAutoCast",
flickerstreak@7 30 "DisplayAutoCastable",
flickerstreak@7 31 "DisplayInUse",
flickerstreak@7 32 "DisplayUsable",
flickerstreak@7 33 "DisplayIcon",
flickerstreak@7 34 "DisplayCooldown",
flickerstreak@7 35
flickerstreak@7 36 -- Event handlers
flickerstreak@7 37 "PreClick",
flickerstreak@7 38 "PostClick",
flickerstreak@7 39 "OnDragStart",
flickerstreak@7 40 "OnReceiveDrag",
flickerstreak@7 41 "OnEnter",
flickerstreak@7 42 "OnLeave",
flickerstreak@7 43
flickerstreak@7 44 -- internal functions
flickerstreak@7 45 "ApplyLayout",
flickerstreak@7 46 "ApplyStyle",
flickerstreak@7 47 "DisplayVisibility",
flickerstreak@7 48 }
flickerstreak@7 49
flickerstreak@7 50 local RAPAD = ReAction.PetActionDisplay
flickerstreak@7 51
flickerstreak@7 52
flickerstreak@7 53 -- private constants
flickerstreak@7 54 local _G = getfenv(0)
flickerstreak@7 55
flickerstreak@7 56 local actionIDColor = { r=1.00, g=0.82, b=0.00, a=1.00 } -- gold
flickerstreak@7 57
flickerstreak@7 58
flickerstreak@7 59 -- private functions
flickerstreak@7 60 -- extract and return color fields from a table, to be fed into SetVertexColor()/SetTextColor()
flickerstreak@7 61 local function tcolor(c)
flickerstreak@7 62 return c.r, c.g, c.b, c.a
flickerstreak@7 63 end
flickerstreak@7 64
flickerstreak@7 65
flickerstreak@7 66 -----------------------------------
flickerstreak@7 67 -- Interface Implementation Methods
flickerstreak@7 68 -----------------------------------
flickerstreak@7 69 function RAPAD:SetupDisplay( name )
flickerstreak@7 70 -- create the button widget
flickerstreak@7 71 local b = CreateFrame("CheckButton", name, nil, "ActionButtonTemplate, SecureActionButtonTemplate")
flickerstreak@7 72 b:EnableMouse()
flickerstreak@7 73 b:RegisterForDrag("LeftButton", "RightButton")
flickerstreak@7 74 b:RegisterForClicks("AnyUp")
flickerstreak@7 75 b:SetScript("PreClick", function(arg1) self:PreClick(arg1) end)
flickerstreak@7 76 b:SetScript("PostClick", function(arg1) self:PostClick(arg1) end)
flickerstreak@7 77 b:SetScript("OnDragStart", function(arg1) self:OnDragStart(arg1) end)
flickerstreak@7 78 b:SetScript("OnReceiveDrag", function() self:OnReceiveDrag() end)
flickerstreak@7 79 b:SetScript("OnEnter", function() self:OnEnter() end)
flickerstreak@7 80 b:SetScript("OnLeave", function() self:OnLeave() end)
flickerstreak@7 81
flickerstreak@7 82
flickerstreak@7 83 b:SetWidth(30)
flickerstreak@7 84 b:SetHeight(30)
flickerstreak@7 85
flickerstreak@7 86 local tx = b:GetNormalTexture()
flickerstreak@7 87 tx:ClearAllPoints()
flickerstreak@7 88 tx:SetWidth(54)
flickerstreak@7 89 tx:SetHeight(54)
flickerstreak@7 90 tx:SetPoint("CENTER",0,-1)
flickerstreak@7 91
flickerstreak@7 92 local autoCastable = b:CreateTexture(nil, "OVERLAY")
flickerstreak@7 93 autoCastable:SetTexture("Interface\\Buttons\\UI-AutoCastableOverlay")
flickerstreak@7 94 autoCastable:SetWidth(58)
flickerstreak@7 95 autoCastable:SetHeight(58)
flickerstreak@7 96 autoCastable:SetPoint("CENTER")
flickerstreak@7 97 autoCastable:Hide()
flickerstreak@7 98
flickerstreak@7 99 local autoCast = CreateFrame("Model",nil,b)
flickerstreak@7 100 autoCast:SetModel("Interface\\Buttons\\UI-AutoCastButton.mdx")
flickerstreak@7 101 autoCast:SetScale(1.2)
flickerstreak@7 102 autoCast:SetAllPoints()
flickerstreak@7 103 autoCast:SetSequence(0)
flickerstreak@7 104 autoCast:SetSequenceTime(0,0)
flickerstreak@7 105 autoCast:SetFrameStrata("HIGH") -- Otherwise it won't appear on top of the icon for some reason
flickerstreak@7 106 autoCast:Hide()
flickerstreak@7 107
flickerstreak@7 108
flickerstreak@7 109 local cd = _G[name.."Cooldown"]
flickerstreak@7 110 cd:SetScale(1);
flickerstreak@7 111 cd:ClearAllPoints();
flickerstreak@7 112 cd:SetWidth(33);
flickerstreak@7 113 cd:SetHeight(33);
flickerstreak@7 114 cd:SetPoint("CENTER", -2, -1);
flickerstreak@7 115
flickerstreak@7 116 -- store references to the various sub-frames of ActionButtonTemplate so we don't have to look it up all the time
flickerstreak@7 117 self.frames = {
flickerstreak@7 118 button = b,
flickerstreak@7 119 autoCastable = autoCastable, --_G[name.."AutoCastable"],
flickerstreak@7 120 autoCast = autoCast, --_G[name.."AutoCast"],
flickerstreak@7 121 hotkey = _G[name.."HotKey"],
flickerstreak@7 122 cooldown = cd,
flickerstreak@7 123 icon = _G[name.."Icon"],
flickerstreak@7 124 normalTexture = tx, --_G[name.."NormalTexture2"],
flickerstreak@7 125 actionID = nil, -- defer creating actionID font string until it's actually requested
flickerstreak@7 126 }
flickerstreak@7 127
flickerstreak@7 128 self.tmpShow_ = 0
flickerstreak@7 129 end
flickerstreak@7 130
flickerstreak@7 131 function RAPAD:UpdateDisplay()
flickerstreak@7 132 self:ApplyLayout()
flickerstreak@7 133 self:ApplyStyle()
flickerstreak@7 134 self:DisplayVisibility()
flickerstreak@7 135 -- refresh the action ID display
flickerstreak@7 136 if ReAction.showIDs_ then
flickerstreak@8 137 self:DisplayID(true)
flickerstreak@7 138 end
flickerstreak@7 139 end
flickerstreak@7 140
flickerstreak@7 141 function RAPAD:TempShow( visible )
flickerstreak@7 142 visible = visible and true or false -- force data integrity
flickerstreak@7 143 self.showTmp_ = max(0, (self.showTmp_ or 0) + (visible and 1 or -1))
flickerstreak@7 144 self:DisplayVisibility()
flickerstreak@7 145 end
flickerstreak@7 146
flickerstreak@7 147 function RAPAD:GetActionFrame()
flickerstreak@7 148 return self.frames.button
flickerstreak@7 149 end
flickerstreak@7 150
flickerstreak@7 151 function RAPAD:GetBaseButtonSize()
flickerstreak@7 152 return 30
flickerstreak@7 153 end
flickerstreak@7 154
flickerstreak@8 155 function RAPAD:DisplayID( show )
flickerstreak@7 156 local f = self.frames.actionID
flickerstreak@8 157 if show then
flickerstreak@7 158 if not f then
flickerstreak@7 159 -- create the actionID label
flickerstreak@7 160 f = self.frames.button:CreateFontString(nil,"ARTWORK","NumberFontNormalSmall")
flickerstreak@7 161 f:SetPoint("BOTTOMLEFT")
flickerstreak@7 162 f:SetTextColor( tcolor(actionIDColor) )
flickerstreak@7 163 self.frames.actionID = f
flickerstreak@7 164 end
flickerstreak@8 165 f:SetText(tostring(self:GetID()))
flickerstreak@7 166 f:Show()
flickerstreak@7 167 elseif f then
flickerstreak@7 168 f:Hide()
flickerstreak@7 169 end
flickerstreak@7 170 end
flickerstreak@7 171
flickerstreak@7 172 function RAPAD:DisplayHotkey(txt)
flickerstreak@7 173 self.frames.hotkey:SetText(string.upper(txt or ""))
flickerstreak@7 174 end
flickerstreak@7 175
flickerstreak@7 176 function RAPAD:DisplayInUse( inUse )
flickerstreak@7 177 self.frames.button:SetChecked( inUse and 1 or 0 )
flickerstreak@7 178 end
flickerstreak@7 179
flickerstreak@7 180 function RAPAD:DisplayUsable( usable )
flickerstreak@7 181 SetDesaturation(self.frames.icon, (not usable) and 1 or nil) -- argument is backward
flickerstreak@7 182 self.frames.hotkey:SetTextColor(self:GetHotkeyColor(usable, false, false, self.frames.hotkey:GetText()) )
flickerstreak@7 183 end
flickerstreak@7 184
flickerstreak@7 185 function RAPAD:DisplayAutoCast( show )
flickerstreak@7 186 if show then
flickerstreak@7 187 self.frames.autoCast:Show()
flickerstreak@7 188 else
flickerstreak@7 189 self.frames.autoCast:Hide()
flickerstreak@7 190 end
flickerstreak@7 191 end
flickerstreak@7 192
flickerstreak@7 193 function RAPAD:DisplayAutoCastable( show )
flickerstreak@7 194 if show then
flickerstreak@7 195 self.frames.autoCastable:Show()
flickerstreak@7 196 else
flickerstreak@7 197 self.frames.autoCastable:Hide()
flickerstreak@7 198 end
flickerstreak@7 199 end
flickerstreak@7 200
flickerstreak@7 201 function RAPAD:DisplayIcon( texture )
flickerstreak@7 202 local f = self.frames.button
flickerstreak@7 203 local icon = self.frames.icon
flickerstreak@7 204 if texture then
flickerstreak@7 205 icon:SetTexture(texture)
flickerstreak@7 206 icon:Show()
flickerstreak@7 207 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
flickerstreak@7 208 else
flickerstreak@7 209 f:SetScript("OnUpdate",nil)
flickerstreak@7 210 icon:Hide()
flickerstreak@7 211 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
flickerstreak@7 212 end
flickerstreak@7 213 self:DisplayVisibility()
flickerstreak@7 214 end
flickerstreak@7 215
flickerstreak@7 216 function RAPAD:DisplayCooldown( start, duration, enable )
flickerstreak@7 217 CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enable)
flickerstreak@7 218 end
flickerstreak@7 219
flickerstreak@7 220
flickerstreak@7 221
flickerstreak@7 222
flickerstreak@7 223
flickerstreak@7 224
flickerstreak@7 225 ----------------------
flickerstreak@7 226 -- Event Handlers
flickerstreak@7 227 ----------------------
flickerstreak@7 228 function RAPAD:PreClick()
flickerstreak@7 229 -- not sure why we have to do this
flickerstreak@7 230 self.frames.button:SetChecked(0)
flickerstreak@7 231 end
flickerstreak@7 232
flickerstreak@7 233 function RAPAD:PostClick()
flickerstreak@7 234 self:UpdateAction()
flickerstreak@7 235 end
flickerstreak@7 236
flickerstreak@7 237 function RAPAD:OnDragStart()
flickerstreak@7 238 if LOCK_ACTIONBAR ~= "1" or IsShiftKeyDown() then
flickerstreak@7 239 self:PickupAction()
flickerstreak@7 240 end
flickerstreak@7 241 end
flickerstreak@7 242
flickerstreak@7 243 function RAPAD:OnReceiveDrag()
flickerstreak@7 244 self:PlaceAction()
flickerstreak@7 245 end
flickerstreak@7 246
flickerstreak@7 247 function RAPAD:OnEnter()
flickerstreak@7 248 self:SetTooltip() -- from ReAction base class
flickerstreak@7 249 end
flickerstreak@7 250
flickerstreak@7 251 function RAPAD:OnLeave()
flickerstreak@7 252 self:ClearTooltip() -- from ReAction base class
flickerstreak@7 253 end
flickerstreak@7 254
flickerstreak@7 255
flickerstreak@7 256
flickerstreak@7 257 ----------------------
flickerstreak@7 258 -- Internal methods
flickerstreak@7 259 ----------------------
flickerstreak@7 260
flickerstreak@7 261 local function placeLabel( label, anchor )
flickerstreak@7 262 local top = string.match(anchor,"TOP")
flickerstreak@7 263 local bottom = string.match(anchor, "BOTTOM")
flickerstreak@7 264 label:ClearAllPoints()
flickerstreak@7 265 label:SetWidth(40)
flickerstreak@7 266 label:SetPoint(top or bottom,0,top and 2 or -2)
flickerstreak@7 267 local j
flickerstreak@7 268 if string.match(anchor,"LEFT") then
flickerstreak@7 269 j = "LEFT"
flickerstreak@7 270 elseif string.match(anchor,"RIGHT") then
flickerstreak@7 271 j = "RIGHT"
flickerstreak@7 272 else
flickerstreak@7 273 j = "CENTER"
flickerstreak@7 274 end
flickerstreak@7 275 label:SetJustifyH(j)
flickerstreak@7 276 end
flickerstreak@7 277
flickerstreak@7 278
flickerstreak@7 279 function RAPAD:ApplyLayout()
flickerstreak@7 280 local f = self.frames
flickerstreak@7 281
flickerstreak@7 282 if self.config.keyBindLoc then
flickerstreak@7 283 placeLabel(f.hotkey, self.config.keyBindLoc)
flickerstreak@7 284 end
flickerstreak@7 285
flickerstreak@7 286 if self.config.showKeyBind then
flickerstreak@7 287 f.hotkey:Show()
flickerstreak@7 288 else
flickerstreak@7 289 f.hotkey:Hide()
flickerstreak@7 290 end
flickerstreak@7 291
flickerstreak@7 292 if self.config.showBorder then
flickerstreak@7 293 f.normalTexture:SetAlpha(1)
flickerstreak@7 294 else
flickerstreak@7 295 f.normalTexture:SetAlpha(0)
flickerstreak@7 296 end
flickerstreak@7 297 end
flickerstreak@7 298
flickerstreak@7 299 function RAPAD:ApplyStyle()
flickerstreak@7 300
flickerstreak@7 301 end
flickerstreak@7 302
flickerstreak@7 303 function RAPAD:DisplayVisibility()
flickerstreak@7 304 local b = self.frames.button
flickerstreak@7 305
flickerstreak@7 306 -- can't hide/show in combat
flickerstreak@7 307 if not InCombatLockdown() then
flickerstreak@7 308 if b:GetAttribute("statehidden") then
flickerstreak@7 309 b:Hide()
flickerstreak@7 310 elseif not self:IsActionEmpty() then
flickerstreak@7 311 b:GetNormalTexture():SetAlpha(1.0)
flickerstreak@7 312 b:Show()
flickerstreak@7 313 elseif self.showTmp_ and self.showTmp_ > 0 or self.config.showGrid then
flickerstreak@7 314 b:GetNormalTexture():SetAlpha(0.5)
flickerstreak@7 315 self.frames.cooldown:Hide()
flickerstreak@7 316 b:Show()
flickerstreak@7 317 else
flickerstreak@7 318 b:Hide()
flickerstreak@7 319 end
flickerstreak@7 320 end
flickerstreak@7 321 end
flickerstreak@7 322