Mercurial > wow > reaction
comparison classes/Button.lua @ 122:a2d2f23137c8
- Rearranged and consolidated some files in modules directory
- Added 'classes' directory, moved Bar and Overlay there
- Added Button, ActionButton, and GridProxy classes, not in use yet
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Mon, 23 Feb 2009 18:56:57 +0000 |
parents | |
children | 943eed2c7def |
comparison
equal
deleted
inserted
replaced
121:fb6c3a642ae3 | 122:a2d2f23137c8 |
---|---|
1 --[[ | |
2 ReAction Button base class | |
3 --]] | |
4 | |
5 -- local imports | |
6 local ReAction = ReAction | |
7 local L = ReAction.L | |
8 local _G = _G | |
9 local CreateFrame = CreateFrame | |
10 local GetBindingKey = GetBindingKey | |
11 local format = string.format | |
12 | |
13 ReAction:UpdateRevision("$Revision: 154 $") | |
14 | |
15 -- libraries | |
16 local KB = LibStub("LibKeyBound-1.0") | |
17 local LBF = LibStub("LibButtonFacade",true) -- optional | |
18 | |
19 -- private | |
20 local trash = CreateFrame("Frame") | |
21 local frameList = { } | |
22 local idPools = { } | |
23 | |
24 local function kb_onEnter( frame ) | |
25 KB:Set(frame) | |
26 end | |
27 | |
28 -- Button class | |
29 local Button = { } | |
30 | |
31 ReAction.Button = Button -- export to ReAction | |
32 | |
33 function Button:New( name, config, bar, idx, inherits, buttonType ) | |
34 buttonType = buttonType or "CheckButton" | |
35 | |
36 -- create new self | |
37 self = setmetatable( | |
38 { | |
39 bar = bar, | |
40 idx = idx, | |
41 config = config, | |
42 name = name, | |
43 }, | |
44 { __index = self } ) | |
45 | |
46 -- have to recycle frames with the same name: CreateFrame() doesn't overwrite | |
47 -- existing globals. Can't set to nil in the global because it's then tainted. | |
48 -- Caller is responsible for ensuring global uniqueness of names. | |
49 local f = name and frameList[name] | |
50 if f then | |
51 f:SetParent(bar:GetFrame()) | |
52 else | |
53 f = CreateFrame(buttonType, name, bar:GetFrame(), inherits) | |
54 if name then | |
55 frameList[name] = f | |
56 end | |
57 end | |
58 | |
59 self.frame = f | |
60 | |
61 if config then | |
62 config.name = name | |
63 end | |
64 | |
65 -- install LibKeyBound handlers onto frame | |
66 function f:GetActionName() | |
67 return format("%s:%s", bar:GetName(), idx) | |
68 end | |
69 | |
70 local clickBinding = format("CLICK %s:LeftButton", name) | |
71 function f:GetHotkey() | |
72 return KB:ToShortKey(GetBindingKey(clickBinding)) | |
73 end | |
74 | |
75 return self | |
76 end | |
77 | |
78 function Button:Destroy() | |
79 local f = self.frame | |
80 gridProxy:RemoveGridFrame(f) | |
81 f:Hide() | |
82 f:SetParent(trash) | |
83 f:ClearAllPoints() | |
84 end | |
85 | |
86 function Button:GetFrame() | |
87 return self.frame | |
88 end | |
89 | |
90 function Button:GetName() | |
91 return self.name | |
92 end | |
93 | |
94 function Button:GetConfig() | |
95 return self.config | |
96 end | |
97 | |
98 function Button:GetActionID() | |
99 -- derived classes should override this | |
100 return nil | |
101 end | |
102 | |
103 function Button:SetActionIDPool( poolID, maxID ) | |
104 self.actionPoolID = poolID | |
105 self.actionMaxID = maxID | |
106 end | |
107 | |
108 function Button:AcquireActionID( id, hint, unique ) | |
109 local poolID = self.actionPoolID | |
110 local maxID = self.actionMaxID | |
111 if not poolID or not maxID then | |
112 error("AcquireActionID: must setup pool first with SetActionIDPool") | |
113 end | |
114 local pool = pools[poolID] | |
115 if not pool then | |
116 pool = { nWraps = 0, useCount = { } } | |
117 for i = 1, maxID do | |
118 pool.useCount[i] = 0 | |
119 end | |
120 pools[poolID] = pool | |
121 end | |
122 local useCount = pool.useCount | |
123 if id == nil then | |
124 repeat | |
125 local nWraps = pool.nWraps | |
126 if useCount[hint] == nil or useCount[hint] == nWraps then | |
127 id = hint | |
128 else | |
129 local start = hint or 1 | |
130 for i = start, maxID do | |
131 if useCount[i] == nil or useCount[i] == nWraps then | |
132 id = i | |
133 break | |
134 end | |
135 end | |
136 if not id then | |
137 for i = 1, start do | |
138 if useCount[i] == nil or useCount[i] == nWraps then | |
139 id = i | |
140 break | |
141 end | |
142 end | |
143 end | |
144 end | |
145 if id == nil then | |
146 if unique then | |
147 return nil | |
148 end | |
149 pool.nWraps = nWraps + 1 | |
150 end | |
151 until id | |
152 end | |
153 useCount[id] = (useCount[id] or 0) + 1 | |
154 return id | |
155 end | |
156 | |
157 function Button:ReleaseActionID( id ) | |
158 local poolID = self.actionPoolID | |
159 if not poolID then | |
160 error("ReleaseActionID: must setup pool first with SetActionIDPool") | |
161 end | |
162 local pool = pools[poolID] | |
163 if pool and id and pool.useCount[id] then | |
164 pool.useCount[id] = pool.useCount[id] - 1 | |
165 pool.nWraps = min(pool.useCount[id], pool.nWraps) | |
166 end | |
167 end | |
168 | |
169 function Button:Refresh() | |
170 self.bar:PlaceButton( self, self.frame:GetWidth(), self.frame:GetHeight() ) | |
171 end | |
172 | |
173 function Button:SetKeybindMode( mode ) | |
174 local f = self.frame | |
175 if mode then | |
176 self.oldOnEnter = f:GetScript("OnEnter") | |
177 f:SetScript("OnEnter", kb_onEnter) | |
178 else | |
179 f:SetScript("OnEnter", self.oldOnEnter) | |
180 self.oldOnEnter = nil | |
181 end | |
182 self:UpdateKeybindModeDisplay( mode ) | |
183 end | |
184 | |
185 function Button:UpdateKeybindModeDisplay( mode ) | |
186 self.border = self.border or _G[format("%sBorder",tostring(self:GetName()))] | |
187 if self.border then | |
188 if mode then | |
189 self.border:SetVertexColor(KB:GetColorKeyBoundMode()) | |
190 self.border:Show() | |
191 else | |
192 self.border:Hide() | |
193 end | |
194 end | |
195 end | |
196 | |
197 function Button:UpdateHotkey( hotkey ) | |
198 hotkey = hotkey or self.hotkey | |
199 if not hotkey then | |
200 hotkey = _G[format("%sHotKey", tostring(self:GetName()))] | |
201 self.hotkey = hotkey | |
202 end | |
203 if hotkey then | |
204 local txt = self.frame:GetHotkey() | |
205 hotkey:SetText( txt ) | |
206 if txt == nil or txt == "" then | |
207 hotkey:Hide() | |
208 else | |
209 hotkey:Show() | |
210 end | |
211 end | |
212 end | |
213 | |
214 function Button:GetActionIDLabel( create ) | |
215 local f = self.frame | |
216 if not f.actionIDLabel and create then | |
217 local label = f:CreateFontString(nil,"OVERLAY","GameFontNormalLarge") | |
218 label:SetAllPoints() | |
219 label:SetJustifyH("CENTER") | |
220 label:SetShadowColor(0,0,0,1) | |
221 label:SetShadowOffset(2,-2) | |
222 f.actionIDLabel = label -- store the label with the frame for recycling | |
223 end | |
224 return f.actionIDLabel | |
225 end | |
226 | |
227 function Button:UpdateActionIDLabel( show ) | |
228 local label = self:GetActionIDLabel( show ) | |
229 if label then | |
230 if show then | |
231 local id = self:GetActionID() | |
232 if id then | |
233 label:SetText(tostring(id)) | |
234 label:Show() | |
235 return | |
236 end | |
237 end | |
238 label:Hide() | |
239 end | |
240 end | |
241 | |
242 function Button:SetNormalVertexColor( r, g, b, a ) | |
243 if LBF then | |
244 LBF:SetNormalVertexColor(self.frame, r, g, b, a) | |
245 else | |
246 self.frame:GetNormalTexture():SetVertexColor(r,g,b,a) | |
247 end | |
248 end | |
249 | |
250 function Button:GetNormalVertexColor() | |
251 if LBF then | |
252 return LBF:GetNormalVertexColor(self.frame) | |
253 else | |
254 return self.frame:GetNormalTexture():GetVertexColor() | |
255 end | |
256 end | |
257 | |
258 function Button:ShowGrid( show ) | |
259 if not InCombatLockdown() then | |
260 local f = self.frame | |
261 local count = f:GetAttribute("showgrid") | |
262 if show then | |
263 count = count + 1 | |
264 else | |
265 count = count - 1 | |
266 end | |
267 if count < 0 then | |
268 count = 0 | |
269 end | |
270 f:SetAttribute("showgrid",count) | |
271 self:UpdateShowGrid() | |
272 end | |
273 end | |
274 | |
275 function Button:UpdateShowGrid() | |
276 -- does nothing by default | |
277 end |