flickerstreak@122
|
1 --[[
|
flickerstreak@122
|
2 ReAction Button base class
|
flickerstreak@122
|
3 --]]
|
flickerstreak@122
|
4
|
flickerstreak@122
|
5 -- local imports
|
flickerstreak@175
|
6 local addonName, addonTable = ...
|
flickerstreak@175
|
7 local ReAction = addonTable.ReAction
|
flickerstreak@122
|
8 local L = ReAction.L
|
flickerstreak@183
|
9 local LKB = ReAction.LKB
|
flickerstreak@122
|
10 local _G = _G
|
flickerstreak@122
|
11 local CreateFrame = CreateFrame
|
flickerstreak@122
|
12 local GetBindingKey = GetBindingKey
|
flickerstreak@122
|
13 local format = string.format
|
flickerstreak@122
|
14
|
flickerstreak@122
|
15 -- private
|
flickerstreak@122
|
16 local trash = CreateFrame("Frame")
|
flickerstreak@122
|
17 local frameList = { }
|
flickerstreak@122
|
18 local idPools = { }
|
flickerstreak@122
|
19
|
flickerstreak@122
|
20 local function kb_onEnter( frame )
|
flickerstreak@183
|
21 LKB:Set(frame)
|
flickerstreak@122
|
22 end
|
flickerstreak@122
|
23
|
flickerstreak@122
|
24 -- Button class
|
flickerstreak@218
|
25 local buttonTypeID = "Button"
|
flickerstreak@218
|
26 local Button = {
|
flickerstreak@218
|
27 defaultBarConfig = {
|
flickerstreak@218
|
28 type = buttonTypeID,
|
flickerstreak@218
|
29 btnWidth = 36,
|
flickerstreak@218
|
30 btnHeight = 36,
|
flickerstreak@218
|
31 btnRows = 1,
|
flickerstreak@218
|
32 btnColumns = 12,
|
flickerstreak@218
|
33 spacing = 3
|
flickerstreak@218
|
34 },
|
flickerstreak@218
|
35 barType = L["Button Bar"]
|
flickerstreak@218
|
36 }
|
flickerstreak@122
|
37
|
flickerstreak@122
|
38 ReAction.Button = Button -- export to ReAction
|
flickerstreak@122
|
39
|
flickerstreak@129
|
40 function Button:New( name, config, bar, idx, inherits, buttonType )
|
flickerstreak@122
|
41 buttonType = buttonType or "CheckButton"
|
flickerstreak@122
|
42
|
flickerstreak@122
|
43 -- create new self
|
flickerstreak@122
|
44 self = setmetatable(
|
flickerstreak@122
|
45 {
|
flickerstreak@122
|
46 bar = bar,
|
flickerstreak@122
|
47 idx = idx,
|
flickerstreak@129
|
48 config = config,
|
flickerstreak@122
|
49 name = name,
|
flickerstreak@122
|
50 },
|
flickerstreak@122
|
51 { __index = self } )
|
flickerstreak@122
|
52
|
flickerstreak@122
|
53 -- have to recycle frames with the same name: CreateFrame() doesn't overwrite
|
flickerstreak@122
|
54 -- existing globals. Can't set to nil in the global because it's then tainted.
|
flickerstreak@122
|
55 -- Caller is responsible for ensuring global uniqueness of names.
|
flickerstreak@122
|
56 local f = name and frameList[name]
|
flickerstreak@122
|
57 if f then
|
flickerstreak@122
|
58 f:SetParent(bar:GetFrame())
|
flickerstreak@122
|
59 else
|
flickerstreak@122
|
60 f = CreateFrame(buttonType, name, bar:GetFrame(), inherits)
|
flickerstreak@122
|
61 if name then
|
flickerstreak@122
|
62 frameList[name] = f
|
flickerstreak@122
|
63 end
|
flickerstreak@122
|
64 end
|
flickerstreak@122
|
65
|
flickerstreak@122
|
66 self.frame = f
|
flickerstreak@122
|
67
|
flickerstreak@131
|
68 local frames = { }
|
flickerstreak@131
|
69 self.frames = frames
|
flickerstreak@131
|
70 frames.icon = _G[name.."Icon"]
|
flickerstreak@131
|
71 frames.flash = _G[name.."Flash"]
|
flickerstreak@131
|
72 frames.hotkey = _G[name.."HotKey"]
|
flickerstreak@131
|
73 frames.count = _G[name.."Count"]
|
flickerstreak@131
|
74 frames.name = _G[name.."Name"]
|
flickerstreak@131
|
75 frames.border = _G[name.."Border"]
|
flickerstreak@131
|
76 frames.cooldown = _G[name.."Cooldown"]
|
flickerstreak@131
|
77 frames.normalTexture = _G[name.."NormalTexture"]
|
flickerstreak@131
|
78
|
flickerstreak@122
|
79 if config then
|
flickerstreak@122
|
80 config.name = name
|
flickerstreak@122
|
81 end
|
flickerstreak@122
|
82
|
flickerstreak@122
|
83 -- install LibKeyBound handlers onto frame
|
flickerstreak@122
|
84 function f:GetActionName()
|
flickerstreak@122
|
85 return format("%s:%s", bar:GetName(), idx)
|
flickerstreak@122
|
86 end
|
flickerstreak@122
|
87
|
flickerstreak@122
|
88 local clickBinding = format("CLICK %s:LeftButton", name)
|
flickerstreak@122
|
89 function f:GetHotkey()
|
flickerstreak@183
|
90 return LKB:ToShortKey(GetBindingKey(clickBinding))
|
flickerstreak@122
|
91 end
|
flickerstreak@122
|
92
|
flickerstreak@122
|
93 return self
|
flickerstreak@122
|
94 end
|
flickerstreak@122
|
95
|
flickerstreak@122
|
96 function Button:Destroy()
|
flickerstreak@126
|
97 local f = self:GetFrame()
|
flickerstreak@132
|
98 f:UnregisterAllEvents()
|
flickerstreak@132
|
99 self:ReleaseActionID(self:GetActionID())
|
flickerstreak@126
|
100 if f then
|
flickerstreak@126
|
101 f:Hide()
|
flickerstreak@126
|
102 f:SetParent(trash)
|
flickerstreak@126
|
103 f:ClearAllPoints()
|
flickerstreak@126
|
104 end
|
flickerstreak@122
|
105 end
|
flickerstreak@122
|
106
|
flickerstreak@128
|
107 function Button:GetBar()
|
flickerstreak@128
|
108 return self.bar
|
flickerstreak@128
|
109 end
|
flickerstreak@128
|
110
|
flickerstreak@122
|
111 function Button:GetFrame()
|
flickerstreak@122
|
112 return self.frame
|
flickerstreak@122
|
113 end
|
flickerstreak@122
|
114
|
flickerstreak@122
|
115 function Button:GetName()
|
flickerstreak@122
|
116 return self.name
|
flickerstreak@122
|
117 end
|
flickerstreak@122
|
118
|
flickerstreak@218
|
119 function Button:GetDefaultBarConfig()
|
flickerstreak@218
|
120 return self.defaultBarConfig
|
flickerstreak@218
|
121 end
|
flickerstreak@218
|
122
|
flickerstreak@218
|
123 function Button:GetBarType()
|
flickerstreak@218
|
124 return self.barType
|
flickerstreak@218
|
125 end
|
flickerstreak@218
|
126
|
Flick@231
|
127 function Button:GetButtonTypeID()
|
Flick@231
|
128 return self.buttonTypeID
|
Flick@231
|
129 end
|
Flick@231
|
130
|
flickerstreak@122
|
131 function Button:GetConfig()
|
flickerstreak@122
|
132 return self.config
|
flickerstreak@122
|
133 end
|
flickerstreak@122
|
134
|
flickerstreak@122
|
135 function Button:GetActionID()
|
flickerstreak@122
|
136 -- derived classes should override this
|
flickerstreak@122
|
137 return nil
|
flickerstreak@122
|
138 end
|
flickerstreak@122
|
139
|
flickerstreak@122
|
140 function Button:SetActionIDPool( poolID, maxID )
|
flickerstreak@122
|
141 self.actionPoolID = poolID
|
flickerstreak@122
|
142 self.actionMaxID = maxID
|
flickerstreak@122
|
143 end
|
flickerstreak@122
|
144
|
flickerstreak@122
|
145 function Button:AcquireActionID( id, hint, unique )
|
flickerstreak@122
|
146 local poolID = self.actionPoolID
|
flickerstreak@122
|
147 local maxID = self.actionMaxID
|
flickerstreak@122
|
148 if not poolID or not maxID then
|
flickerstreak@122
|
149 error("AcquireActionID: must setup pool first with SetActionIDPool")
|
flickerstreak@122
|
150 end
|
flickerstreak@123
|
151 local pool = idPools[poolID]
|
flickerstreak@122
|
152 if not pool then
|
flickerstreak@122
|
153 pool = { nWraps = 0, useCount = { } }
|
flickerstreak@122
|
154 for i = 1, maxID do
|
flickerstreak@122
|
155 pool.useCount[i] = 0
|
flickerstreak@122
|
156 end
|
flickerstreak@123
|
157 idPools[poolID] = pool
|
flickerstreak@122
|
158 end
|
flickerstreak@122
|
159 local useCount = pool.useCount
|
flickerstreak@122
|
160 if id == nil then
|
flickerstreak@122
|
161 repeat
|
flickerstreak@126
|
162 local nWraps = pool.nWraps or 0
|
flickerstreak@126
|
163 if hint and (useCount[hint] == nil or useCount[hint] == nWraps) then
|
flickerstreak@122
|
164 id = hint
|
flickerstreak@122
|
165 else
|
flickerstreak@122
|
166 local start = hint or 1
|
flickerstreak@122
|
167 for i = start, maxID do
|
flickerstreak@122
|
168 if useCount[i] == nil or useCount[i] == nWraps then
|
flickerstreak@122
|
169 id = i
|
flickerstreak@122
|
170 break
|
flickerstreak@122
|
171 end
|
flickerstreak@122
|
172 end
|
flickerstreak@122
|
173 if not id then
|
flickerstreak@122
|
174 for i = 1, start do
|
flickerstreak@122
|
175 if useCount[i] == nil or useCount[i] == nWraps then
|
flickerstreak@122
|
176 id = i
|
flickerstreak@122
|
177 break
|
flickerstreak@122
|
178 end
|
flickerstreak@122
|
179 end
|
flickerstreak@122
|
180 end
|
flickerstreak@122
|
181 end
|
flickerstreak@122
|
182 if id == nil then
|
flickerstreak@122
|
183 if unique then
|
flickerstreak@122
|
184 return nil
|
flickerstreak@122
|
185 end
|
flickerstreak@122
|
186 pool.nWraps = nWraps + 1
|
flickerstreak@122
|
187 end
|
flickerstreak@126
|
188 until id ~= nil
|
flickerstreak@122
|
189 end
|
flickerstreak@122
|
190 useCount[id] = (useCount[id] or 0) + 1
|
flickerstreak@122
|
191 return id
|
flickerstreak@122
|
192 end
|
flickerstreak@122
|
193
|
flickerstreak@122
|
194 function Button:ReleaseActionID( id )
|
flickerstreak@122
|
195 local poolID = self.actionPoolID
|
flickerstreak@122
|
196 if not poolID then
|
flickerstreak@122
|
197 error("ReleaseActionID: must setup pool first with SetActionIDPool")
|
flickerstreak@122
|
198 end
|
flickerstreak@123
|
199 local pool = idPools[poolID]
|
flickerstreak@122
|
200 if pool and id and pool.useCount[id] then
|
flickerstreak@122
|
201 pool.useCount[id] = pool.useCount[id] - 1
|
flickerstreak@122
|
202 pool.nWraps = min(pool.useCount[id], pool.nWraps)
|
flickerstreak@122
|
203 end
|
flickerstreak@122
|
204 end
|
flickerstreak@122
|
205
|
flickerstreak@122
|
206 function Button:Refresh()
|
flickerstreak@129
|
207 local f = self:GetFrame()
|
flickerstreak@129
|
208 self.bar:PlaceButton( self, f:GetWidth(), f:GetHeight() )
|
flickerstreak@122
|
209 end
|
flickerstreak@122
|
210
|
flickerstreak@122
|
211 function Button:SetKeybindMode( mode )
|
flickerstreak@122
|
212 local f = self.frame
|
flickerstreak@122
|
213 if mode then
|
flickerstreak@122
|
214 self.oldOnEnter = f:GetScript("OnEnter")
|
flickerstreak@122
|
215 f:SetScript("OnEnter", kb_onEnter)
|
flickerstreak@124
|
216 elseif self.oldOnEnter then
|
flickerstreak@122
|
217 f:SetScript("OnEnter", self.oldOnEnter)
|
flickerstreak@122
|
218 self.oldOnEnter = nil
|
flickerstreak@122
|
219 end
|
flickerstreak@128
|
220 self:ShowGridTemp(mode)
|
flickerstreak@122
|
221 self:UpdateKeybindModeDisplay( mode )
|
flickerstreak@122
|
222 end
|
flickerstreak@122
|
223
|
flickerstreak@122
|
224 function Button:UpdateKeybindModeDisplay( mode )
|
flickerstreak@131
|
225 local border = self.frames.border or _G[format("%sBorder",tostring(self:GetName()))]
|
flickerstreak@131
|
226 if border then
|
flickerstreak@122
|
227 if mode then
|
flickerstreak@183
|
228 border:SetVertexColor(LKB:GetColorKeyBoundMode())
|
flickerstreak@131
|
229 border:Show()
|
flickerstreak@122
|
230 else
|
flickerstreak@131
|
231 border:Hide()
|
flickerstreak@122
|
232 end
|
flickerstreak@122
|
233 end
|
flickerstreak@122
|
234 end
|
flickerstreak@122
|
235
|
flickerstreak@122
|
236 function Button:UpdateHotkey( hotkey )
|
flickerstreak@131
|
237 hotkey = hotkey or self.frames.hotkey
|
flickerstreak@122
|
238 if not hotkey then
|
flickerstreak@129
|
239 hotkey = _G[self:GetName().."HotKey"]
|
flickerstreak@131
|
240 self.frames.hotkey = hotkey
|
flickerstreak@122
|
241 end
|
flickerstreak@122
|
242 if hotkey then
|
flickerstreak@122
|
243 local txt = self.frame:GetHotkey()
|
flickerstreak@122
|
244 hotkey:SetText( txt )
|
flickerstreak@122
|
245 if txt == nil or txt == "" then
|
flickerstreak@122
|
246 hotkey:Hide()
|
flickerstreak@122
|
247 else
|
flickerstreak@122
|
248 hotkey:Show()
|
flickerstreak@122
|
249 end
|
flickerstreak@122
|
250 end
|
flickerstreak@122
|
251 end
|
flickerstreak@122
|
252
|
flickerstreak@122
|
253 function Button:GetActionIDLabel( create )
|
flickerstreak@129
|
254 local f = self:GetFrame()
|
flickerstreak@122
|
255 if not f.actionIDLabel and create then
|
flickerstreak@122
|
256 local label = f:CreateFontString(nil,"OVERLAY","GameFontNormalLarge")
|
flickerstreak@122
|
257 label:SetAllPoints()
|
flickerstreak@122
|
258 label:SetJustifyH("CENTER")
|
flickerstreak@122
|
259 label:SetShadowColor(0,0,0,1)
|
flickerstreak@122
|
260 label:SetShadowOffset(2,-2)
|
flickerstreak@122
|
261 f.actionIDLabel = label -- store the label with the frame for recycling
|
flickerstreak@122
|
262 end
|
flickerstreak@122
|
263 return f.actionIDLabel
|
flickerstreak@122
|
264 end
|
flickerstreak@122
|
265
|
flickerstreak@122
|
266 function Button:UpdateActionIDLabel( show )
|
flickerstreak@122
|
267 local label = self:GetActionIDLabel( show )
|
flickerstreak@122
|
268 if label then
|
flickerstreak@122
|
269 if show then
|
flickerstreak@122
|
270 local id = self:GetActionID()
|
flickerstreak@122
|
271 if id then
|
flickerstreak@122
|
272 label:SetText(tostring(id))
|
flickerstreak@122
|
273 label:Show()
|
flickerstreak@122
|
274 return
|
flickerstreak@122
|
275 end
|
flickerstreak@122
|
276 end
|
flickerstreak@122
|
277 label:Hide()
|
flickerstreak@122
|
278 end
|
flickerstreak@122
|
279 end
|
flickerstreak@122
|
280
|
flickerstreak@122
|
281 function Button:SetNormalVertexColor( r, g, b, a )
|
flickerstreak@213
|
282 if ReAction.LBF then
|
flickerstreak@213
|
283 ReAction.LBF:SetNormalVertexColor(self:GetFrame(), r, g, b, a)
|
flickerstreak@122
|
284 else
|
flickerstreak@129
|
285 self:GetFrame():GetNormalTexture():SetVertexColor(r,g,b,a)
|
flickerstreak@122
|
286 end
|
flickerstreak@122
|
287 end
|
flickerstreak@122
|
288
|
flickerstreak@122
|
289 function Button:GetNormalVertexColor()
|
flickerstreak@213
|
290 if ReAction.LBF then
|
flickerstreak@213
|
291 return ReAction.LBF:GetNormalVertexColor(self:GetFrame())
|
flickerstreak@122
|
292 else
|
flickerstreak@129
|
293 return self:GetFrame():GetNormalTexture():GetVertexColor()
|
flickerstreak@122
|
294 end
|
flickerstreak@122
|
295 end
|
flickerstreak@122
|
296
|
flickerstreak@122
|
297 function Button:UpdateShowGrid()
|
flickerstreak@122
|
298 -- does nothing by default
|
flickerstreak@122
|
299 end
|
flickerstreak@128
|
300
|
flickerstreak@128
|
301 function Button:ShowGridTemp(show)
|
flickerstreak@128
|
302 -- does nothing by default
|
flickerstreak@128
|
303 end
|
flickerstreak@128
|
304
|
flickerstreak@128
|
305 function Button:ShowGrid(show)
|
flickerstreak@128
|
306 -- does nothing by default
|
flickerstreak@128
|
307 end
|