comparison PetActionButton.lua @ 257:920d17851a93 stable

Merge 1.1 beta 4 to stable
author Flick
date Tue, 12 Apr 2011 16:06:31 -0700
parents 65f2805957a0
children c918ff9ac787
comparison
equal deleted inserted replaced
210:b2b105747466 257:920d17851a93
1 local addonName, addonTable = ...
2 local ReAction = addonTable.ReAction
3 local L = ReAction.L
4 local _G = _G
5 local CreateFrame = CreateFrame
6 local format = string.format
7 local GetCVar = GetCVar
8 local InCombatLockdown = InCombatLockdown
9 local GetPetActionInfo = GetPetActionInfo
10 local GetPetActionSlotUsable = GetPetActionSlotUsable
11 local GetPetActionCooldown = GetPetActionCooldown
12 local AutoCastShine_AutoCastStart = AutoCastShine_AutoCastStart
13 local AutoCastShine_AutoCastStop = AutoCastShine_AutoCastStop
14 local SetDesaturation = SetDesaturation
15 local CooldownFrame_SetTimer = CooldownFrame_SetTimer
16 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
17
18 --
19 -- Secure snippets
20 -- These are run within the context of the bar's sandbox, as the
21 -- buttons themselves do not have their own sandbox.
22 --
23 local _onDragStart = -- function(self, button, kind, value, ...)
24 [[
25 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
26 return kind, value, ...
27 else
28 return "petaction", self:GetAttribute("action")
29 end
30 ]]
31
32 local _onReceiveDrag = -- function(self, button, kind, value, ...)
33 [[
34 if kind then -- pet spells on the cursor return nil from GetCursorInfo(), which is very strange
35 return kind, value, ...
36 end
37 return "petaction", self:GetAttribute("action")
38 ]]
39
40 --
41 -- private
42 --
43 local eventList = {
44 "PLAYER_CONTROL_LOST",
45 "PLAYER_CONTROL_GAINED",
46 "PLAYER_FARSIGHT_FOCUS_CHANGED",
47 "UNIT_PET",
48 "UNIT_FLAGS",
49 "UNIT_AURA",
50 "PET_BAR_UPDATE",
51 "PET_BAR_UPDATE_COOLDOWN",
52 "PET_BAR_UPDATE_USABLE",
53 "UPDATE_BINDINGS",
54 }
55
56 --
57 -- Pet Action Button class
58 --
59 local buttonTypeID = "PetAction"
60 local Super = ReAction.Button
61 local Pet = setmetatable(
62 {
63 defaultBarConfig = {
64 type = buttonTypeID,
65 btnWidth = 30,
66 btnHeight = 30,
67 btnRows = 1,
68 btnColumns = 10,
69 spacing = 8,
70 buttons = { }
71 },
72
73 barType = L["Pet Action Bar"],
74 buttonTypeID = buttonTypeID
75 },
76 { __index = Super } )
77
78 ReAction.Button.PetAction = Pet
79 ReAction:RegisterBarType(Pet)
80
81 function Pet:New( config, bar, idx, idHint )
82 local name = format("ReAction_%s_PetAction_%d",bar:GetName(),idx)
83
84 self = Super.New(self, name, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" )
85
86 local f = self:GetFrame()
87 if not f.autoCastTexture then
88 -- store autocast stuff with the frame for recycling
89 local tex = f:CreateTexture(nil,"OVERLAY")
90 tex:SetTexture([[Interface\Buttons\UI-AutoCastableOverlay]])
91 tex:SetHeight(58)
92 tex:SetWidth(58)
93 tex:SetPoint("CENTER")
94 f.autoCastTexture = tex
95 f.autoCastShine = CreateFrame("Frame",name.."Shine",f,"AutoCastShineTemplate") -- create after autocast texture so it's on top
96 -- move the cooldown around
97 local cd = self.frames.cooldown
98 cd:ClearAllPoints()
99 cd:SetWidth(33)
100 cd:SetHeight(33)
101 cd:SetPoint("CENTER", f, "CENTER", -2, -1)
102 -- resize to 30x30
103 f:SetHeight(30)
104 f:SetWidth(30)
105 local nt = _G[name.."NormalTexture"]
106 nt:SetHeight(54)
107 nt:SetWidth(54)
108 end
109 local barFrame = bar:GetFrame()
110
111 -- set up the base action ID
112 self:SetActionIDPool("pet",10)
113 config.actionID = self:AcquireActionID(config.actionID, idHint, true)
114
115 -- attribute setup
116 -- There's no secure way to do PetAutoCastToggle by actionID, so use
117 -- a click-through proxy to the Blizzard pet buttons for right-click
118 -- Note that technically this doesn't do PetStopAttack() when
119 -- IsPetAttackActive() is true: however that's only true when using
120 -- Eyes of the Beast and appears not to really do anything (at least
121 -- I can't find any difference)
122 f:SetAttribute("type","pet")
123 f:SetAttribute("type2","click")
124 f:SetAttribute("clickbutton2",_G["PetActionButton"..config.actionID])
125 f:SetAttribute("action",config.actionID)
126 f:SetAttribute("checkselfcast", true)
127 f:SetAttribute("checkfocuscast", true)
128
129 -- non secure scripts
130 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
131 f:SetScript("OnEnter", function(frame) self:OnEnter() end)
132 f:SetScript("OnLeave", function(frame) self:OnLeave() end)
133 f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end)
134 f:SetScript("PreClick", function(frame) self:PreClick() end)
135 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end)
136 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end)
137
138 -- secure handlers
139 barFrame:WrapScript(f, "OnDragStart", _onDragStart)
140 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag)
141
142 -- event registration
143 f:EnableMouse(true)
144 f:RegisterForDrag("LeftButton", "RightButton")
145 f:RegisterForClicks("AnyUp")
146 for _, evt in pairs(eventList) do
147 f:RegisterEvent(evt)
148 end
149
150 -- attach to skinner
151 bar:SkinButton(self,
152 {
153 AutoCast = f.autoCastShine,
154 AutoCastable = f.autoCastTexture
155 })
156
157 self:Refresh()
158 f:Show()
159
160 return self
161 end
162
163 function Pet:SetupBar(bar)
164 Super.SetupBar(self,bar)
165
166 -- auto show/hide when pet exists
167 bar:RegisterUnitWatch("pet",true)
168
169 self:UpdateButtonLock(bar)
170 end
171
172 function Pet:UpdateButtonLock(bar)
173 local f = bar:GetFrame()
174 f:SetAttribute("lockbuttons",bar.config.lockButtons)
175 f:SetAttribute("lockbuttonscombat",bar.config.lockButtonsCombat)
176 f:Execute(
177 [[
178 lockButtons = self:GetAttribute("lockbuttons")
179 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
180 ]])
181 end
182
183 function Pet:Refresh()
184 Super.Refresh(self)
185 self:Update()
186 self:UpdateHotkey()
187 end
188
189 function Pet:GetActionID()
190 return self.config.actionID
191 end
192
193 function Pet:SetActionID(id)
194 if not InCombatLockdown() then
195 if id < 0 or id > 10 then
196 ReAction:UserError(L["Pet action ID range is 1-10"])
197 return
198 end
199 self.config.actionID = id
200 f:SetAttribute("clickbutton2",_G["PetActionButton"..id])
201 f:SetAttribute("action",id)
202 self:Update()
203 self:UpdateHotkey()
204 end
205 end
206
207 function Pet:Update()
208 local action = self.config.actionID
209 local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(action)
210 local f = self:GetFrame()
211 local icon = self.frames.icon
212
213 if isToken then
214 icon:SetTexture(_G[texture])
215 self.tooltipName = _G[name]
216 else
217 icon:SetTexture(texture)
218 self.tooltipName = name
219 end
220
221 self.isToken = isToken
222 self.tooltipSubtext = subtext
223 f:SetChecked( isActive and 1 or 0 )
224
225 if autoCastAllowed then
226 f.autoCastTexture:Show()
227 else
228 f.autoCastTexture:Hide()
229 end
230
231 if autoCastEnabled then
232 AutoCastShine_AutoCastStart(f.autoCastShine)
233 else
234 AutoCastShine_AutoCastStop(f.autoCastShine)
235 end
236
237 if texture then
238 if GetPetActionSlotUsable(action) then
239 SetDesaturation(icon,nil)
240 else
241 SetDesaturation(icon,1)
242 end
243 icon:Show()
244 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
245 else
246 icon:Hide()
247 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
248 end
249
250 self:UpdateCooldown()
251 end
252
253 function Pet:UpdateCooldown()
254 CooldownFrame_SetTimer(self.frames.cooldown, GetPetActionCooldown(self.config.actionID))
255 end
256
257 function Pet:SetTooltip()
258 if self.tooltipName then
259 local f = self:GetFrame()
260 local uber = GetCVar("UberTooltips")
261 if self.isToken or (uber == "0") then
262 if uber == "0" then
263 GameTooltip:SetOwner(f, "ANCHOR_RIGHT")
264 else
265 GameTooltip_SetDefaultAnchor(GameTooltip, f)
266 end
267 GameTooltip:SetText(self.tooltipName)
268 if self.tooltipSubtext then
269 GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5)
270 end
271 GameTooltip:Show()
272 else
273 GameTooltip_SetDefaultAnchor(GameTooltip, f)
274 GameTooltip:SetPetAction(self.config.actionID)
275 end
276 else
277 GameTooltip:Hide()
278 end
279 end
280
281 function Pet:OnEvent(event, unit)
282 if event =="PET_BAR_UPDATE_COOLDOWN" then
283 self:UpdateCooldown()
284 elseif event == "UPDATE_BINDINGS" then
285 self:UpdateHotkey()
286 elseif event == "UNIT_PET" then
287 if unit == "player" then
288 self:Update()
289 end
290 elseif event == "UNIT_FLAGS" or event == "UNIT_AURA" then
291 if unit == "pet" then
292 self:Update()
293 end
294 else
295 self:Update()
296 end
297 end
298
299 function Pet:OnEnter()
300 self:SetTooltip()
301 end
302
303 function Pet:OnLeave()
304 GameTooltip:Hide()
305 end
306
307 function Pet:OnAttributeChanged(attr,value)
308 self:Update()
309 end
310
311 function Pet:PreClick()
312 self:GetFrame():SetChecked(0)
313 end
314
315 function Pet:OnDragStart()
316 self:SetChecked(0)
317 self:Update()
318 end
319
320 function Pet:OnReceiveDrag()
321 self:SetChecked(0)
322 self:Update()
323 end
324