Mercurial > wow > reaction
comparison libs/ReBound-1.0/ReBound-1.0.lua @ 17:639282f3a0e0
More cleanup of main.lua, ReBound-1.0.lua
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Fri, 23 Mar 2007 19:28:30 +0000 |
parents | 2735edcf9ab7 |
children |
comparison
equal
deleted
inserted
replaced
16:832aab6fed49 | 17:639282f3a0e0 |
---|---|
1 --[[ | 1 --[[ |
2 Name: ReBound-1.0 | 2 Name: ReBound-1.0 |
3 Revision: $Rev: 2 $ | 3 Revision: $Rev: 3 $ |
4 Author: Flick | 4 Author: Flick |
5 Website: | 5 Website: |
6 Documentation: | 6 Documentation: |
7 SVN: | 7 SVN: |
8 Description: A library to assist with click-binding | 8 Description: A library to assist with click-binding |
9 License: MIT | 9 License: MIT |
10 Dependencies: AceLibrary, AceEvent-2.0, AceLocale-2.2, AceOO-2.0 | 10 Dependencies: AceLibrary, AceEvent-2.0, AceLocale-2.2, AceOO-2.0, AceConsole-2.0 |
11 ]] | 11 ]] |
12 | 12 |
13 | 13 |
14 local version_major, version_minor = "ReBound-1.0", "$Rev: 2 $" | 14 local version_major, version_minor = "ReBound-1.0", "$Rev: 3 $" |
15 | 15 |
16 if not AceLibrary then error(version_major .. " requires AceLibrary.") end | 16 if not AceLibrary then error(version_major .. " requires AceLibrary.") end |
17 if not AceLibrary:IsNewVersion(version_major, version_minor) then return end | 17 if not AceLibrary:IsNewVersion(version_major, version_minor) then return end |
18 if not AceLibrary:HasInstance("AceEvent-2.0") then error(version_major .. " requires AceEvent-2.0.") end | 18 for _, lib in pairs({ "AceEvent-2.0", "AceLocale-2.2", "AceOO-2.0", "AceConsole-2.0" }) do |
19 if not AceLibrary:HasInstance("AceLocale-2.2") then error(version_major .. " requires AceLocale-2.2.") end | 19 if not AceLibrary:HasInstance(lib) then error(version_major .. " requires "..lib) end |
20 if not AceLibrary:HasInstance("AceOO-2.0") then error(version_major .. " requires AceOO-2.0.") end | 20 end |
21 | 21 |
22 local L = AceLibrary("AceLocale-2.2"):new("ReBound") | 22 local L = AceLibrary("AceLocale-2.2"):new("ReBound") |
23 | 23 |
24 -- localization | |
25 L:RegisterTranslations( "enUS", function() | |
26 return { | |
27 ["none"] = true, | |
28 ["Click"] = true, | |
29 ["Right-click"] = true, | |
30 ["Shift-click"] = true, | |
31 ["Shift-right-click"] = true, | |
32 ["Right Click"] = true, | |
33 ["to select for binding"] = true, | |
34 ["to select for alternate (right-click) binding"] = true, | |
35 ["to clear binding"] = true, | |
36 ["to clear alternate (right-click) binding"] = true, | |
37 ["Press a key to assign binding"] = true, | |
38 ["is now unbound"] = true, | |
39 } | |
40 end ) | |
41 | |
42 | |
43 | |
44 local kbValidate = AceLibrary("AceConsole-2.0").keybindingValidateFunc | |
45 | |
24 local colorGreen = "|cff00ff00" | 46 local colorGreen = "|cff00ff00" |
47 local colorOrange = "|cffffcc00" | |
25 local colorOff = "|r" | 48 local colorOff = "|r" |
26 | 49 |
27 local mouseButtonConvert = { | 50 local mouseButtonConvert = { |
28 LeftButton = "BUTTON1", | 51 LeftButton = "BUTTON1", |
29 RightButton = "BUTTON2", | 52 RightButton = "BUTTON2", |
30 MiddleButton = "BUTTON3", | 53 MiddleButton = "BUTTON3", |
31 Button4 = "BUTTON4", | 54 Button4 = "BUTTON4", |
32 Button5 = "BUTTON5" | 55 Button5 = "BUTTON5" |
33 } | 56 } |
34 | 57 |
35 --local BINDING_PENDING = { } -- a constant | 58 -- TODO: localize |
36 | 59 local keybindAbbreviations = { |
37 -- localization | 60 [KEY_BACKSPACE] = "BkSp", |
38 L:RegisterTranslations( "enUS", function() | 61 [KEY_BUTTON3] = "M-3", |
39 return { | 62 [KEY_BUTTON4] = "M-4", |
40 ["none"] = true, | 63 [KEY_BUTTON5] = "M-5", |
41 ["Right-click"] = true, | 64 [KEY_DOWN] = "Down", |
42 ["Right Click"] = true, | 65 [KEY_ESCAPE] = "Esc", |
43 ["Click to select for binding"] = true, | 66 [KEY_INSERT] = "Ins", |
44 ["Shift-click to clear binding"] = true, | 67 [KEY_LEFT] = "Left", |
45 ["Press a key to assign binding"] = true, | 68 [KEY_MOUSEWHEELDOWN] = "M-Down", |
46 ["is now unbound"] = true, | 69 [KEY_MOUSEWHEELUP] = "M-Up", |
47 } | 70 [KEY_NUMLOCK] = "NumLk", |
48 end ) | 71 [KEY_NUMPAD0] = "Np0", |
72 [KEY_NUMPAD1] = "Np1", | |
73 [KEY_NUMPAD2] = "Np2", | |
74 [KEY_NUMPAD3] = "Np3", | |
75 [KEY_NUMPAD4] = "Np4", | |
76 [KEY_NUMPAD5] = "Np5", | |
77 [KEY_NUMPAD6] = "Np6", | |
78 [KEY_NUMPAD7] = "Np7", | |
79 [KEY_NUMPAD8] = "Np8", | |
80 [KEY_NUMPAD9] = "Np9", | |
81 [KEY_NUMPADDECIMAL] = "Np.", | |
82 [KEY_NUMPADDIVIDE] = "Np/", | |
83 [KEY_NUMPADMINUS] = "Np-", | |
84 [KEY_NUMPADMULTIPLY] = "Np*", | |
85 [KEY_NUMPADPLUS] = "Np+", | |
86 [KEY_PAGEDOWN] = "PgDn", | |
87 [KEY_PAGEUP] = "PgUp", | |
88 [KEY_PRINTSCREEN] = "PrScr", | |
89 [KEY_RIGHT] = "Right", | |
90 [KEY_SCROLLLOCK] = "ScrLk", | |
91 [KEY_SPACE] = "Sp", | |
92 [KEY_UP] = "Up", | |
93 } | |
49 | 94 |
50 | 95 |
51 local ReBound = AceLibrary("AceOO-2.0").Class("AceEvent-2.0") | 96 local ReBound = AceLibrary("AceOO-2.0").Class("AceEvent-2.0") |
52 | 97 |
53 --[[ | 98 --[[ |
69 | 114 |
70 --[[ | 115 --[[ |
71 Calls to new() which share ids will return an existing object with that id, similar | 116 Calls to new() which share ids will return an existing object with that id, similar |
72 to AceLocale-2.2. | 117 to AceLocale-2.2. |
73 ]] | 118 ]] |
119 ReBound.instances = { } | |
74 local super_new = ReBound.new | 120 local super_new = ReBound.new |
75 function ReBound:new( id ) | 121 function ReBound:new( id ) |
76 self.instances = self.instances or { } | 122 local instances = self.instances |
77 if self.instances[id] then | 123 instances[id] = instances[id] or super_new(self,id) |
78 return self.instances[id] | 124 return instances[id] |
79 else | |
80 local i = super_new(self,id) | |
81 self.instances[id] = i | |
82 return i | |
83 end | |
84 end | 125 end |
85 | 126 |
86 | 127 |
87 --[[ | 128 --[[ |
88 Class object constructor | 129 Class object constructor |
89 | 130 |
90 arguments: | 131 arguments: |
91 id : the ID that will be provided in events. This can be absolutely | 132 id : the ID that will be provided in events. This can be absolutely |
92 anything, but a string is recommended. | 133 anything, but a string is recommended. |
93 ]] | 134 ]] |
94 local super_init = ReBound.prototype.init | 135 local super_init = ReBound.super.prototype.init |
95 function ReBound.prototype:init( id ) | 136 function ReBound.prototype:init( id ) |
96 super_init(self) | 137 super_init(self) |
97 | 138 |
98 self.id = id | 139 self.id = id |
99 self.frames = { } | 140 self.frames = { } |
107 --[[ | 148 --[[ |
108 Arguments: | 149 Arguments: |
109 key: A string representation of a key, suitable for passing to SetBinding. | 150 key: A string representation of a key, suitable for passing to SetBinding. |
110 target: The frame with an OnClick handler to which the click-binding should be attached | 151 target: The frame with an OnClick handler to which the click-binding should be attached |
111 [button]: The mouse button to emulate. Default is "LeftButton". | 152 [button]: The mouse button to emulate. Default is "LeftButton". |
153 [silent]: boolean - whether to suppress messages about keys being unbound. | |
112 | 154 |
113 Returns: | 155 Returns: |
114 nothing. | 156 nothing. |
115 | 157 |
116 Notes: | 158 Notes: |
117 This does not save the bindings. | 159 This does not save the bindings. |
118 ]] | 160 ]] |
119 function ReBound.prototype:SetBinding( key, target, button ) | 161 function ReBound.prototype:SetBinding( key, target, button ) |
120 if not key then error("ReBound:SetBinding() requires a key argument.") end | 162 if not key then error("ReBound:SetBinding() requires a key argument.") end |
121 if not target then error("ReBound:SetBinding() requires a binding target argument") end | 163 if not target then error("ReBound:SetBinding() requires a binding target argument") end |
164 if key and not kbValidate(key) then error("ReBound:SetBinding(): invalid key code "..tostring(key)) end | |
165 | |
122 button = button or "LeftButton" | 166 button = button or "LeftButton" |
123 | 167 |
124 -- prevent setting a binding that's already set | 168 -- prevent setting a binding that's already set |
125 local current = { self:GetBinding(target,button) } | 169 local current = { self:GetBinding(target,button) } |
126 for _, b in pairs(current) do | 170 for _, b in pairs(current) do |
129 end | 173 end |
130 end | 174 end |
131 | 175 |
132 -- clear the old binding for the key. This isn't strictly necessary, but it allows us to collect | 176 -- clear the old binding for the key. This isn't strictly necessary, but it allows us to collect |
133 -- notification of the unbinding in one place (ClearBinding). | 177 -- notification of the unbinding in one place (ClearBinding). |
134 self:ClearBinding( key ) | 178 self:ClearBinding( key, nil, nil, silent ) |
135 | 179 |
136 -- clear the old binding for the target and button (silently) | 180 -- clear the old binding for the target and button (silently) |
137 self:ClearBinding( nil, target, button, true ) | 181 self:ClearBinding( nil, target, button, true ) |
138 | 182 |
139 -- set the new binding | 183 -- set the new binding |
212 return GetBindingKey("CLICK "..target:GetName()..":"..button) | 256 return GetBindingKey("CLICK "..target:GetName()..":"..button) |
213 end | 257 end |
214 | 258 |
215 | 259 |
216 --[[ | 260 --[[ |
261 Gets the localized, abbreviated key cap text for the primary binding on a target. | |
262 Abbreviations are more aggressive than the standard Blizzard abbreviation | |
263 (which just shortens modifier keys) | |
264 | |
265 Arguments: | |
266 target: target frame to query | |
267 [abbrev]: boolean flag to abbreviate the result | |
268 [button]: mouse button to emulate ("LeftButton", "RightButton") | |
269 | |
270 Returns: | |
271 abbreviated, localized key label | |
272 ]] | |
273 function ReBound.prototype:GetBindingText( target, abbrev, button ) | |
274 local key = self:GetBinding(target,button) | |
275 local txt = key and GetBindingText(key, "KEY_", abbrev and 1) or "" | |
276 | |
277 if txt and abbrev then | |
278 -- further abbreviate some key names | |
279 txt = string.gsub(txt, "[^%-]+$", keybindAbbreviations) | |
280 -- the above does not handle "num pad -" | |
281 txt = string.gsub(txt, KEY_NUMPADMINUS, keybindAbbreviations) | |
282 end | |
283 return txt | |
284 end | |
285 | |
286 | |
287 --[[ | |
217 Publishes permanent binding notification events. | 288 Publishes permanent binding notification events. |
218 ]] | 289 ]] |
219 local function PublishBindings(self) | 290 local function PublishBindings(self) |
220 for _, key in ipairs(self.pending) do | 291 for _, key in ipairs(self.pending) do |
221 local action = GetBindingAction(key) | 292 local action = GetBindingAction(key) |
306 | 377 |
307 | 378 |
308 --[[ | 379 --[[ |
309 Shows all the registered click binding frames. | 380 Shows all the registered click binding frames. |
310 ]] | 381 ]] |
311 function ReBound.prototype:ShowFrames() | 382 function ReBound.prototype:ShowRegisteredFrames() |
312 if InCombatLockdown() then | 383 if InCombatLockdown() then |
313 -- can't set bindings while in combat, so don't bother showing them | 384 -- can't set bindings while in combat, so don't bother showing them |
314 UIErrorsFrame:AddMessage(ERR_NOT_IN_COMBAT) | 385 UIErrorsFrame:AddMessage(ERR_NOT_IN_COMBAT) |
315 else | 386 else |
316 for _, f in pairs(self.frames) do | 387 for _, f in pairs(self.frames) do |
321 | 392 |
322 | 393 |
323 --[[ | 394 --[[ |
324 Hides all the registered click binding frames. | 395 Hides all the registered click binding frames. |
325 ]] | 396 ]] |
326 function ReBound.prototype:HideFrames() | 397 function ReBound.prototype:HideRegisteredFrames() |
327 -- because these frames aren't protected, there's no restriction | 398 -- because these frames aren't protected, there's no restriction |
328 -- on hiding them while in combat. | 399 -- on hiding them while in combat. |
329 for _, f in pairs(self.frames) do | 400 for _, f in pairs(self.frames) do |
330 f:Hide() | 401 f:Hide() |
331 end | 402 end |
343 local binding2 = self.ReBound:GetBinding(target,"RightButton") | 414 local binding2 = self.ReBound:GetBinding(target,"RightButton") |
344 if binding2 then | 415 if binding2 then |
345 GameTooltip:AddDoubleLine(L["Right-click"]..":", colorGreen.."("..binding2..")"..colorOff) | 416 GameTooltip:AddDoubleLine(L["Right-click"]..":", colorGreen.."("..binding2..")"..colorOff) |
346 end | 417 end |
347 -- line 3: instructions | 418 -- line 3: instructions |
348 GameTooltip:AddLine(L["Click to select for binding"]) | 419 GameTooltip:AddLine(colorGreen..L["Click"]..colorOff.." "..L["to select for binding"]) |
349 GameTooltip:AddLine(L["Shift-click to clear binding"]) | 420 GameTooltip:AddLine(colorGreen..L["Shift-click"]..colorOff.." "..L["to clear binding"]) |
421 GameTooltip:AddLine("") | |
422 GameTooltip:AddLine(colorOrange..L["Right-click"]..colorOff.." "..L["to select for alternate (right-click) binding"]) | |
423 GameTooltip:AddLine(colorOrange..L["Shift-right-click"]..colorOff.." "..L["to clear alternate (right-click) binding"]) | |
350 GameTooltip:Show() | 424 GameTooltip:Show() |
351 end | 425 end |
352 | 426 |
353 local function ShowTooltip2( self ) | 427 local function ShowTooltip2( self ) |
354 if GameTooltip:IsOwned(self) then | 428 if GameTooltip:IsOwned(self) then |