Mercurial > wow > reaction
comparison lib/LibKeyBound-1.0/LibKeyBound-1.0.lua @ 88:fc83b3f5b322
Added keybindings using LibKeyBound-1.0, with modifications for Override bindings instead of standard bindings.
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Sun, 31 Aug 2008 06:02:18 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 87:3499ac7c3a9b | 88:fc83b3f5b322 |
|---|---|
| 1 --[[ | |
| 2 Name: LibKeyBound-1.0 | |
| 3 Revision: $Rev: 76300 $ | |
| 4 Author(s): Gello, Maul, Toadkiller, Tuller | |
| 5 Website: http://www.wowace.com/wiki/LibKeyBound-1.0 | |
| 6 Documentation: http://www.wowace.com/wiki/LibKeyBound-1.0 | |
| 7 SVN: http://svn.wowace.com/wowace/trunk/LibKeyBound-1.0 | |
| 8 Description: An intuitive keybindings system: mouseover frame, click keys or buttons. | |
| 9 Dependencies: CallbackHandler-1.0 | |
| 10 --]] | |
| 11 | |
| 12 local MAJOR = "LibKeyBound-1.0" | |
| 13 local MINOR = "$Revision: 76300 $" | |
| 14 | |
| 15 --[[ | |
| 16 LibKeyBound-1.0 | |
| 17 ClickBinder by Gello and TrinityBinder by Maul -> keyBound by Tuller -> LibKeyBound library by Toadkiller | |
| 18 | |
| 19 Functions needed to implement | |
| 20 button:GetHotkey() - returns the current hotkey assigned to the given button | |
| 21 | |
| 22 Functions to implement if using a custom keybindings system: | |
| 23 button:SetKey(key) - binds the given key to the given button | |
| 24 button:FreeKey(key) - unbinds the given key from all other buttons | |
| 25 button:ClearBindings() - removes all keys bound to the given button | |
| 26 button:GetBindings() - returns a string listing all bindings of the given button | |
| 27 button:GetActionName() - what we're binding to, used for printing | |
| 28 --]] | |
| 29 | |
| 30 local LibKeyBound, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | |
| 31 | |
| 32 if not LibKeyBound then return end -- no upgrade needed | |
| 33 | |
| 34 local _G = _G | |
| 35 | |
| 36 -- CallbackHandler | |
| 37 LibKeyBound.events = LibKeyBound.events or _G.LibStub("CallbackHandler-1.0"):New(LibKeyBound) | |
| 38 | |
| 39 local L = LibKeyBoundLocale10 | |
| 40 LibKeyBound.L = L | |
| 41 -- ToDo delete global LibKeyBoundLocale10 at some point | |
| 42 LibKeyBound.Binder = LibKeyBound.Binder or {} | |
| 43 | |
| 44 -- #NODOC | |
| 45 function LibKeyBound:Initialize() | |
| 46 do | |
| 47 local f = CreateFrame("Frame", "KeyboundDialog", UIParent) | |
| 48 f:SetFrameStrata("DIALOG") | |
| 49 f:SetToplevel(true); f:EnableMouse(true) | |
| 50 f:SetWidth(360); f:SetHeight(140) | |
| 51 f:SetBackdrop{ | |
| 52 bgFile="Interface\\DialogFrame\\UI-DialogBox-Background" , | |
| 53 edgeFile="Interface\\DialogFrame\\UI-DialogBox-Border", | |
| 54 tile = true, | |
| 55 insets = {left = 11, right = 12, top = 12, bottom = 11}, | |
| 56 tileSize = 32, | |
| 57 edgeSize = 32, | |
| 58 } | |
| 59 f:SetPoint("TOP", 0, -24) | |
| 60 f:Hide() | |
| 61 | |
| 62 local tr = f:CreateTitleRegion() | |
| 63 tr:SetAllPoints(f) | |
| 64 f:SetClampedToScreen(true) | |
| 65 | |
| 66 local text = f:CreateFontString("ARTWORK") | |
| 67 text:SetFontObject("GameFontHighlight") | |
| 68 text:SetPoint("TOP", 0, -16) | |
| 69 text:SetWidth(252); text:SetHeight(0) | |
| 70 text:SetText(format(L.BindingsHelp, GetBindingText("ESCAPE", "KEY_"))) | |
| 71 | |
| 72 -- Per character bindings checkbox | |
| 73 local perChar = CreateFrame("CheckButton", "KeyboundDialogCheck", f, "OptionsCheckButtonTemplate") | |
| 74 getglobal(perChar:GetName() .. "Text"):SetText(CHARACTER_SPECIFIC_KEYBINDINGS) | |
| 75 | |
| 76 perChar:SetScript("OnShow", function(self) | |
| 77 self:SetChecked(GetCurrentBindingSet() == 2) | |
| 78 end) | |
| 79 | |
| 80 local current | |
| 81 perChar:SetScript("OnClick", function(self) | |
| 82 current = (perChar:GetChecked() and 2) or 1 | |
| 83 LoadBindings(current) | |
| 84 end) | |
| 85 | |
| 86 -- local added | |
| 87 f:SetScript("OnShow", function(self) | |
| 88 -- if (not added) then | |
| 89 -- UISpecialFrames[#UISpecialFrames + 1] = self:GetName() | |
| 90 -- added = true | |
| 91 -- end | |
| 92 -- PlaySound("igCharacterInfoOpen") | |
| 93 end) | |
| 94 f:SetScript("OnHide", function(self) | |
| 95 -- PlaySound("igCharacterInfoClose") | |
| 96 end) | |
| 97 | |
| 98 -- Okay bindings checkbox | |
| 99 local okayBindings = CreateFrame("CheckButton", "KeyboundDialogOkay", f, "OptionsButtonTemplate") | |
| 100 getglobal(okayBindings:GetName() .. "Text"):SetText(OKAY) | |
| 101 okayBindings:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -12, 14) | |
| 102 | |
| 103 okayBindings:SetScript("OnClick", function(self) | |
| 104 current = (perChar:GetChecked() and 2) or 1 | |
| 105 if InCombatLockdown() then | |
| 106 self:RegisterEvent("PLAYER_REGEN_ENABLED") | |
| 107 else | |
| 108 -- DEFAULT_CHAT_FRAME:AddMessage("okayBindings " .. tostring(current)) | |
| 109 SaveBindings(current) | |
| 110 LibKeyBound:Deactivate() | |
| 111 end | |
| 112 end) | |
| 113 | |
| 114 okayBindings:SetScript("OnHide", function(self) | |
| 115 current = (perChar:GetChecked() and 2) or 1 | |
| 116 if InCombatLockdown() then | |
| 117 self:RegisterEvent("PLAYER_REGEN_ENABLED") | |
| 118 else | |
| 119 SaveBindings(current) | |
| 120 end | |
| 121 end) | |
| 122 | |
| 123 okayBindings:SetScript("OnEvent", function(self, event) | |
| 124 -- DEFAULT_CHAT_FRAME:AddMessage("okayBindings delayed " .. tostring(current)) | |
| 125 SaveBindings(current) | |
| 126 self:UnregisterEvent(event) | |
| 127 LibKeyBound:Deactivate() | |
| 128 end) | |
| 129 | |
| 130 -- Cancel bindings checkbox | |
| 131 local cancelBindings = CreateFrame("CheckButton", "KeyboundDialogCancel", f, "OptionsButtonTemplate") | |
| 132 getglobal(cancelBindings:GetName() .. "Text"):SetText(CANCEL) | |
| 133 cancelBindings:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 12, 14) | |
| 134 | |
| 135 cancelBindings:SetScript("OnClick", function(self) | |
| 136 if InCombatLockdown() then | |
| 137 self:RegisterEvent("PLAYER_REGEN_ENABLED") | |
| 138 else | |
| 139 -- DEFAULT_CHAT_FRAME:AddMessage("cancelBindings ") | |
| 140 LoadBindings(GetCurrentBindingSet()) | |
| 141 LibKeyBound:Deactivate() | |
| 142 end | |
| 143 end) | |
| 144 | |
| 145 cancelBindings:SetScript("OnEvent", function(self, event) | |
| 146 -- DEFAULT_CHAT_FRAME:AddMessage("cancelBindings delayed ") | |
| 147 LoadBindings(GetCurrentBindingSet()) | |
| 148 self:UnregisterEvent(event) | |
| 149 LibKeyBound:Deactivate() | |
| 150 end) | |
| 151 | |
| 152 perChar:SetPoint("BOTTOMLEFT", cancelBindings, "TOPLEFT", 0, 4) | |
| 153 | |
| 154 self.dialog = f | |
| 155 end | |
| 156 | |
| 157 SlashCmdList["LibKeyBoundSlashCOMMAND"] = function() self:Toggle() end | |
| 158 SLASH_LibKeyBoundSlashCOMMAND1 = "/libkeybound" | |
| 159 SLASH_LibKeyBoundSlashCOMMAND2 = "/kb" | |
| 160 SLASH_LibKeyBoundSlashCOMMAND3 = "/lkb" | |
| 161 | |
| 162 LibKeyBound.initialized = true | |
| 163 end | |
| 164 | |
| 165 | |
| 166 -- Default color to indicate bindable frames in your mod. | |
| 167 LibKeyBound.colorKeyBoundMode = LibKeyBound.colorKeyBoundMode or { 0, 1, 1, 0.5 } | |
| 168 | |
| 169 --[[ | |
| 170 LibKeyBound:SetColorKeyBoundMode([r][, g][, b][, a]) | |
| 171 --]] | |
| 172 --[[ | |
| 173 Arguments: | |
| 174 number - red, default 0 | |
| 175 number - green, default 0 | |
| 176 number - blue, default 0 | |
| 177 number - alpha, default 1 | |
| 178 | |
| 179 Example: | |
| 180 if (MyMod.keyBoundMode) then | |
| 181 overlayFrame:SetBackdropColor(LibKeyBound:GetColorKeyBoundMode()) | |
| 182 end | |
| 183 ... | |
| 184 local r, g, b, a = LibKeyBound:GetColorKeyBoundMode() | |
| 185 | |
| 186 Notes: | |
| 187 * Returns the color to use on your participating buttons during KeyBound Mode | |
| 188 * Values are unpacked and ready to use as color arguments | |
| 189 --]] | |
| 190 function LibKeyBound:SetColorKeyBoundMode(r, g, b, a) | |
| 191 r, g, b, a = r or 0, g or 0, b or 0, a or 1 | |
| 192 LibKeyBound.colorKeyBoundMode[1] = r | |
| 193 LibKeyBound.colorKeyBoundMode[2] = g | |
| 194 LibKeyBound.colorKeyBoundMode[3] = b | |
| 195 LibKeyBound.colorKeyBoundMode[4] = a | |
| 196 LibKeyBound.events:Fire("LIBKEYBOUND_MODE_COLOR_CHANGED") | |
| 197 end | |
| 198 | |
| 199 --[[ | |
| 200 Returns: | |
| 201 * number - red | |
| 202 * number - green | |
| 203 * number - blue | |
| 204 * number - alpha | |
| 205 | |
| 206 Example: | |
| 207 if (MyMod.keyBoundMode) then | |
| 208 overlayFrame:SetBackdropColor(LibKeyBound:GetColorKeyBoundMode()) | |
| 209 end | |
| 210 ... | |
| 211 local r, g, b, a = LibKeyBound:GetColorKeyBoundMode() | |
| 212 | |
| 213 Notes: | |
| 214 * Returns the color to use on your participating buttons during KeyBound Mode | |
| 215 * Values are unpacked and ready to use as color arguments | |
| 216 --]] | |
| 217 function LibKeyBound:GetColorKeyBoundMode() | |
| 218 return unpack(LibKeyBound.colorKeyBoundMode) | |
| 219 end | |
| 220 | |
| 221 | |
| 222 function LibKeyBound:PLAYER_REGEN_ENABLED() | |
| 223 if self.enabled then | |
| 224 UIErrorsFrame:AddMessage(L.CombatBindingsEnabled, 1, 0.3, 0.3, 1, UIERRORS_HOLD_TIME) | |
| 225 self.dialog:Hide() | |
| 226 end | |
| 227 end | |
| 228 | |
| 229 function LibKeyBound:PLAYER_REGEN_DISABLED() | |
| 230 if self.enabled then | |
| 231 self:Set(nil) | |
| 232 UIErrorsFrame:AddMessage(L.CombatBindingsDisabled, 1, 0.3, 0.3, 1, UIERRORS_HOLD_TIME) | |
| 233 self.dialog:Show() | |
| 234 end | |
| 235 end | |
| 236 | |
| 237 | |
| 238 --[[ | |
| 239 Notes: | |
| 240 * Switches KeyBound Mode between on and off | |
| 241 | |
| 242 Example: | |
| 243 local LibKeyBound = LibStub("LibKeyBound-1.0") | |
| 244 LibKeyBound:Toggle() | |
| 245 --]] | |
| 246 function LibKeyBound:Toggle() | |
| 247 if (LibKeyBound:IsShown()) then | |
| 248 LibKeyBound:Deactivate() | |
| 249 else | |
| 250 LibKeyBound:Activate() | |
| 251 end | |
| 252 end | |
| 253 | |
| 254 | |
| 255 --[[ | |
| 256 Notes: | |
| 257 * Switches KeyBound Mode to on | |
| 258 | |
| 259 Example: | |
| 260 local LibKeyBound = LibStub("LibKeyBound-1.0") | |
| 261 LibKeyBound:Activate() | |
| 262 --]] | |
| 263 function LibKeyBound:Activate() | |
| 264 if not self:IsShown() then | |
| 265 if InCombatLockdown() then | |
| 266 UIErrorsFrame:AddMessage(L.CannotBindInCombat, 1, 0.3, 0.3, 1, UIERRORS_HOLD_TIME) | |
| 267 else | |
| 268 self.enabled = true | |
| 269 if not self.frame then | |
| 270 self.frame = LibKeyBound.Binder:Create() | |
| 271 end | |
| 272 self:Set(nil) | |
| 273 self.dialog:Show() | |
| 274 self.events:Fire("LIBKEYBOUND_ENABLED") | |
| 275 end | |
| 276 end | |
| 277 end | |
| 278 | |
| 279 | |
| 280 --[[ | |
| 281 Notes: | |
| 282 * Switches KeyBound Mode to off | |
| 283 | |
| 284 Example: | |
| 285 local LibKeyBound = LibStub("LibKeyBound-1.0") | |
| 286 LibKeyBound:Deactivate() | |
| 287 --]] | |
| 288 function LibKeyBound:Deactivate() | |
| 289 if self:IsShown() then | |
| 290 self.enabled = nil | |
| 291 self:Set(nil) | |
| 292 self.dialog:Hide() | |
| 293 | |
| 294 self.events:Fire("LIBKEYBOUND_DISABLED") | |
| 295 end | |
| 296 end | |
| 297 | |
| 298 | |
| 299 --[[ | |
| 300 Returns: | |
| 301 boolean - true if KeyBound Mode is currently on | |
| 302 | |
| 303 Example: | |
| 304 local LibKeyBound = LibStub("LibKeyBound-1.0") | |
| 305 local isKeyBoundMode = LibKeyBound:IsShown() | |
| 306 if (isKeyBoundMode) then | |
| 307 -- Do something | |
| 308 else | |
| 309 -- Do another thing | |
| 310 end | |
| 311 | |
| 312 Notes: | |
| 313 * Is KeyBound Mode currently on | |
| 314 --]] | |
| 315 function LibKeyBound:IsShown() | |
| 316 return self.enabled | |
| 317 end | |
| 318 | |
| 319 | |
| 320 --[[ | |
| 321 Arguments: | |
| 322 table - the button frame | |
| 323 | |
| 324 Example: | |
| 325 local button = this | |
| 326 LibKeyBound:Set(button) | |
| 327 | |
| 328 Notes: | |
| 329 * Sets up button for keybinding | |
| 330 * Call this in your OnEnter script for the button | |
| 331 * Current bindings are shown in the tooltip | |
| 332 * Primary binding is shown in green in the button text | |
| 333 --]] | |
| 334 function LibKeyBound:Set(button) | |
| 335 local bindFrame = self.frame | |
| 336 | |
| 337 if button and self:IsShown() and not InCombatLockdown() then | |
| 338 bindFrame.button = button | |
| 339 bindFrame:SetAllPoints(button) | |
| 340 | |
| 341 bindFrame.text:SetFontObject("GameFontNormalLarge") | |
| 342 bindFrame.text:SetText(button:GetHotkey()) | |
| 343 if bindFrame.text:GetStringWidth() > bindFrame:GetWidth() then | |
| 344 bindFrame.text:SetFontObject("GameFontNormal") | |
| 345 end | |
| 346 bindFrame:Show() | |
| 347 bindFrame:OnEnter() | |
| 348 elseif bindFrame then | |
| 349 bindFrame.button = nil | |
| 350 bindFrame:ClearAllPoints() | |
| 351 bindFrame:Hide() | |
| 352 end | |
| 353 end | |
| 354 | |
| 355 | |
| 356 --[[ | |
| 357 Arguments: | |
| 358 string - the keyString to shorten | |
| 359 | |
| 360 Returns: | |
| 361 string - the shortened displayString | |
| 362 | |
| 363 Example: | |
| 364 local key1 = GetBindingKey(button:GetName()) | |
| 365 local displayKey = LibKeyBound:ToShortKey(key1) | |
| 366 return displayKey | |
| 367 | |
| 368 Notes: | |
| 369 * Shortens the key text (returned from GetBindingKey etc.) | |
| 370 * Result is suitable for display on a button | |
| 371 * Can be used for your button:GetHotkey() return value | |
| 372 --]] | |
| 373 function LibKeyBound:ToShortKey(key) | |
| 374 if key then | |
| 375 key = key:upper() | |
| 376 key = key:gsub(" ", "") | |
| 377 key = key:gsub("ALT%-", L["Alt"]) | |
| 378 key = key:gsub("CTRL%-", L["Ctrl"]) | |
| 379 key = key:gsub("SHIFT%-", L["Shift"]) | |
| 380 key = key:gsub("NUMPAD", L["NumPad"]) | |
| 381 | |
| 382 key = key:gsub("PLUS", "%+") | |
| 383 key = key:gsub("MINUS", "%-") | |
| 384 key = key:gsub("MULTIPLY", "%*") | |
| 385 key = key:gsub("DIVIDE", "%/") | |
| 386 | |
| 387 key = key:gsub("BACKSPACE", L["Backspace"]) | |
| 388 key = key:gsub("BUTTON3", L["Button3"]) | |
| 389 key = key:gsub("BUTTON4", L["Button4"]) | |
| 390 key = key:gsub("BUTTON5", L["Button5"]) | |
| 391 key = key:gsub("CAPSLOCK", L["Capslock"]) | |
| 392 key = key:gsub("CLEAR", L["Clear"]) | |
| 393 key = key:gsub("DELETE", L["Delete"]) | |
| 394 key = key:gsub("END", L["End"]) | |
| 395 key = key:gsub("HOME", L["Home"]) | |
| 396 key = key:gsub("INSERT", L["Insert"]) | |
| 397 key = key:gsub("MOUSEWHEELDOWN", L["Mouse Wheel Down"]) | |
| 398 key = key:gsub("MOUSEWHEELUP", L["Mouse Wheel Up"]) | |
| 399 key = key:gsub("NUMLOCK", L["Num Lock"]) | |
| 400 key = key:gsub("PAGEDOWN", L["Page Down"]) | |
| 401 key = key:gsub("PAGEUP", L["Page Up"]) | |
| 402 key = key:gsub("SCROLLLOCK", L["Scroll Lock"]) | |
| 403 key = key:gsub("SPACEBAR", L["Spacebar"]) | |
| 404 key = key:gsub("TAB", L["Tab"]) | |
| 405 | |
| 406 key = key:gsub("DOWNARROW", L["Down Arrow"]) | |
| 407 key = key:gsub("LEFTARROW", L["Left Arrow"]) | |
| 408 key = key:gsub("RIGHTARROW", L["Right Arrow"]) | |
| 409 key = key:gsub("UPARROW", L["Up Arrow"]) | |
| 410 | |
| 411 return key | |
| 412 end | |
| 413 end | |
| 414 | |
| 415 | |
| 416 --[[ Binder Widget ]]-- | |
| 417 | |
| 418 function LibKeyBound.Binder:Create() | |
| 419 local binder = CreateFrame("Button") | |
| 420 binder:RegisterForClicks("anyUp") | |
| 421 binder:SetFrameStrata("DIALOG") | |
| 422 binder:EnableKeyboard(true) | |
| 423 binder:EnableMouseWheel(true) | |
| 424 | |
| 425 for k,v in pairs(self) do | |
| 426 binder[k] = v | |
| 427 end | |
| 428 | |
| 429 local bg = binder:CreateTexture() | |
| 430 bg:SetTexture(0, 0, 0, 0.5) | |
| 431 bg:SetAllPoints(binder) | |
| 432 | |
| 433 local text = binder:CreateFontString("OVERLAY") | |
| 434 text:SetFontObject("GameFontNormalLarge") | |
| 435 text:SetTextColor(0, 1, 0) | |
| 436 text:SetAllPoints(binder) | |
| 437 binder.text = text | |
| 438 | |
| 439 binder:SetScript("OnClick", self.OnKeyDown) | |
| 440 binder:SetScript("OnKeyDown", self.OnKeyDown) | |
| 441 binder:SetScript("OnMouseWheel", self.OnMouseWheel) | |
| 442 binder:SetScript("OnEnter", self.OnEnter) | |
| 443 binder:SetScript("OnLeave", self.OnLeave) | |
| 444 binder:SetScript("OnHide", self.OnHide) | |
| 445 binder:Hide() | |
| 446 | |
| 447 return binder | |
| 448 end | |
| 449 | |
| 450 function LibKeyBound.Binder:OnHide() | |
| 451 LibKeyBound:Set(nil) | |
| 452 end | |
| 453 | |
| 454 function LibKeyBound.Binder:OnKeyDown(key) | |
| 455 local button = self.button | |
| 456 if not button then return end | |
| 457 | |
| 458 if (key == "UNKNOWN" or key == "LSHIFT" or key == "RSHIFT" or | |
| 459 key == "LCTRL" or key == "RCTRL" or key == "LALT" or key == "RALT" or | |
| 460 key == "LeftButton" or key == "RightButton") then | |
| 461 return | |
| 462 end | |
| 463 | |
| 464 local screenshotKey = GetBindingKey("SCREENSHOT") | |
| 465 if screenshotKey and key == screenshotKey then | |
| 466 Screenshot() | |
| 467 return | |
| 468 end | |
| 469 | |
| 470 local openChatKey = GetBindingKey("OPENCHAT") | |
| 471 if openChatKey and key == openChatKey then | |
| 472 ChatFrameEditBox:Show() | |
| 473 return | |
| 474 end | |
| 475 | |
| 476 if key == "MiddleButton" then | |
| 477 key = "BUTTON3" | |
| 478 elseif key == "Button4" then | |
| 479 key = "BUTTON4" | |
| 480 elseif key == "Button5" then | |
| 481 key = "BUTTON5" | |
| 482 end | |
| 483 | |
| 484 if key == "ESCAPE" then | |
| 485 self:ClearBindings(button) | |
| 486 LibKeyBound:Set(button) | |
| 487 return | |
| 488 end | |
| 489 | |
| 490 if IsShiftKeyDown() then | |
| 491 key = "SHIFT-" .. key | |
| 492 end | |
| 493 if IsControlKeyDown() then | |
| 494 key = "CTRL-" .. key | |
| 495 end | |
| 496 if IsAltKeyDown() then | |
| 497 key = "ALT-" .. key | |
| 498 end | |
| 499 | |
| 500 if MouseIsOver(button) then | |
| 501 self:SetKey(button, key) | |
| 502 LibKeyBound:Set(button) | |
| 503 end | |
| 504 end | |
| 505 | |
| 506 function LibKeyBound.Binder:OnMouseWheel(arg1) | |
| 507 if arg1 > 0 then | |
| 508 self:OnKeyDown("MOUSEWHEELUP") | |
| 509 else | |
| 510 self:OnKeyDown("MOUSEWHEELDOWN") | |
| 511 end | |
| 512 end | |
| 513 | |
| 514 function LibKeyBound.Binder:OnEnter() | |
| 515 local button = self.button | |
| 516 if button and not InCombatLockdown() then | |
| 517 if self:GetRight() >= (GetScreenWidth() / 2) then | |
| 518 GameTooltip:SetOwner(self, "ANCHOR_LEFT") | |
| 519 else | |
| 520 GameTooltip:SetOwner(self, "ANCHOR_RIGHT") | |
| 521 end | |
| 522 | |
| 523 if button.GetActionName then | |
| 524 GameTooltip:SetText(button:GetActionName(), 1, 1, 1) | |
| 525 else | |
| 526 GameTooltip:SetText(button:GetName(), 1, 1, 1) | |
| 527 end | |
| 528 | |
| 529 local bindings = self:GetBindings(button) | |
| 530 if bindings then | |
| 531 GameTooltip:AddLine(bindings, 0, 1, 0) | |
| 532 GameTooltip:AddLine(L.ClearTip) | |
| 533 else | |
| 534 GameTooltip:AddLine(L.NoKeysBoundTip, 0, 1, 0) | |
| 535 end | |
| 536 GameTooltip:Show() | |
| 537 else | |
| 538 GameTooltip:Hide() | |
| 539 end | |
| 540 end | |
| 541 | |
| 542 function LibKeyBound.Binder:OnLeave() | |
| 543 LibKeyBound:Set(nil) | |
| 544 GameTooltip:Hide() | |
| 545 end | |
| 546 | |
| 547 | |
| 548 --[[ Update Functions ]]-- | |
| 549 | |
| 550 function LibKeyBound.Binder:ToBinding(button) | |
| 551 return format("CLICK %s:LeftButton", button:GetName()) | |
| 552 end | |
| 553 | |
| 554 function LibKeyBound.Binder:FreeKey(button, key) | |
| 555 local msg | |
| 556 if button.FreeKey then | |
| 557 local action = button:FreeKey(key) | |
| 558 if button:FreeKey(key) then | |
| 559 msg = format(L.UnboundKey, GetBindingText(key, "KEY_"), action) | |
| 560 end | |
| 561 else | |
| 562 local action = GetBindingAction(key) | |
| 563 if action and action ~= "" and action ~= self:ToBinding(button) then | |
| 564 msg = format(L.UnboundKey, GetBindingText(key, "KEY_"), action) | |
| 565 end | |
| 566 end | |
| 567 | |
| 568 if msg then | |
| 569 UIErrorsFrame:AddMessage(msg, 1, 0.82, 0, 1, UIERRORS_HOLD_TIME) | |
| 570 end | |
| 571 end | |
| 572 | |
| 573 function LibKeyBound.Binder:SetKey(button, key) | |
| 574 if InCombatLockdown() then | |
| 575 UIErrorsFrame:AddMessage(L.CannotBindInCombat, 1, 0.3, 0.3, 1, UIERRORS_HOLD_TIME) | |
| 576 else | |
| 577 self:FreeKey(button, key) | |
| 578 | |
| 579 if button.SetKey then | |
| 580 button:SetKey(key) | |
| 581 else | |
| 582 SetBindingClick(key, button:GetName(), "LeftButton") | |
| 583 end | |
| 584 | |
| 585 local msg | |
| 586 if button.GetActionName then | |
| 587 msg = format(L.BoundKey, GetBindingText(key, "KEY_"), button:GetActionName()) | |
| 588 else | |
| 589 msg = format(L.BoundKey, GetBindingText(key, "KEY_"), button:GetName()) | |
| 590 end | |
| 591 UIErrorsFrame:AddMessage(msg, 1, 1, 1, 1, UIERRORS_HOLD_TIME) | |
| 592 end | |
| 593 end | |
| 594 | |
| 595 function LibKeyBound.Binder:ClearBindings(button) | |
| 596 if InCombatLockdown() then | |
| 597 UIErrorsFrame:AddMessage(L.CannotBindInCombat, 1, 0.3, 0.3, 1, UIERRORS_HOLD_TIME) | |
| 598 else | |
| 599 if button.ClearBindings then | |
| 600 button:ClearBindings() | |
| 601 else | |
| 602 local binding = self:ToBinding(button) | |
| 603 while (GetBindingKey(binding)) do | |
| 604 SetBinding(GetBindingKey(binding), nil) | |
| 605 end | |
| 606 end | |
| 607 | |
| 608 local msg | |
| 609 if button.GetActionName then | |
| 610 msg = format(L.ClearedBindings, button:GetActionName()) | |
| 611 else | |
| 612 msg = format(L.ClearedBindings, button:GetName()) | |
| 613 end | |
| 614 UIErrorsFrame:AddMessage(msg, 1, 1, 1, 1, UIERRORS_HOLD_TIME) | |
| 615 end | |
| 616 end | |
| 617 | |
| 618 function LibKeyBound.Binder:GetBindings(button) | |
| 619 if button.GetBindings then | |
| 620 return button:GetBindings() | |
| 621 end | |
| 622 | |
| 623 local keys | |
| 624 local binding = self:ToBinding(button) | |
| 625 for i = 1, select("#", GetBindingKey(binding)) do | |
| 626 local hotKey = select(i, GetBindingKey(binding)) | |
| 627 if keys then | |
| 628 keys = keys .. ", " .. GetBindingText(hotKey, "KEY_") | |
| 629 else | |
| 630 keys = GetBindingText(hotKey, "KEY_") | |
| 631 end | |
| 632 end | |
| 633 | |
| 634 return keys | |
| 635 end | |
| 636 | |
| 637 LibKeyBound.EventButton = LibKeyBound.EventButton or CreateFrame("Frame") | |
| 638 do | |
| 639 local EventButton = LibKeyBound.EventButton | |
| 640 EventButton:UnregisterAllEvents() | |
| 641 EventButton:SetScript("OnEvent", function(self, event, addon) | |
| 642 if (event == "PLAYER_REGEN_DISABLED") then | |
| 643 LibKeyBound:PLAYER_REGEN_DISABLED() | |
| 644 elseif (event == "PLAYER_REGEN_ENABLED") then | |
| 645 LibKeyBound:PLAYER_REGEN_ENABLED() | |
| 646 elseif (event == "PLAYER_LOGIN" and not LibKeyBound.initialized) then | |
| 647 LibKeyBound:Initialize() | |
| 648 EventButton:UnregisterEvent("PLAYER_LOGIN") | |
| 649 end | |
| 650 end) | |
| 651 | |
| 652 if IsLoggedIn() and not LibKeyBound.initialized then | |
| 653 LibKeyBound:Initialize() | |
| 654 elseif not LibKeyBound.initialized then | |
| 655 EventButton:RegisterEvent("PLAYER_LOGIN") | |
| 656 end | |
| 657 EventButton:RegisterEvent("PLAYER_REGEN_ENABLED") | |
| 658 EventButton:RegisterEvent("PLAYER_REGEN_DISABLED") | |
| 659 end |
