Mercurial > wow > skeletonkey
comparison SkeletonKey/BindingsFrame.lua @ 52:81a7c71c4483
- fixed safety override
- fixed pet journal drag/drop
- fixed confirmation cancel button
| author | Nenue |
|---|---|
| date | Fri, 19 Aug 2016 10:46:36 -0400 |
| parents | 1aba8a6fd4a9 |
| children | 9eebce04e69b |
comparison
equal
deleted
inserted
replaced
| 51:d0ee4553061a | 52:81a7c71c4483 |
|---|---|
| 1 -- KrakTool | 1 -- KrakTool |
| 2 -- BindingsFrame.lua | 2 -- BindingsFrame.lua |
| 3 -- Created: 7/28/2016 3:39 PM | 3 -- Created: 7/28/2016 3:39 PM |
| 4 -- %file-revision% | 4 -- %file-revision% |
| 5 -- Code piecing the interface together | 5 -- Handles the arrangement of and interaction with the SkeletonKey frame |
| 6 | 6 --[=[ |
| 7 local kb, print = LibStub("LibKraken").register(KeyBinder, 'KeySlot') | 7 -- some useful texture paths |
| 8 [[Interface\PaperDollInfoFrame\UI-GearManager-Undo]] | |
| 9 [[Interface\PetPaperDollFrame\UI-PetHappiness]] | |
| 10 [[Interface\RAIDFRAME\ReadyCheck-Waiting]] | |
| 11 [[Interface\RAIDFRAME\ReadyCheck-Read]] | |
| 12 [[Interface\RAIDFRAME\ReadyCheck-NotReady]] | |
| 13 [[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]] | |
| 14 [[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]] | |
| 15 [[Interface\UI-TutorialFrame-QuestGiver\UI-TutorialFrame-QuestGray]] | |
| 16 --]=] | |
| 17 | |
| 18 local kb, print = LibStub("LibKraken").register(KeyBinder, 'BindingsUI') | |
| 19 local L = kb.L | |
| 8 local BINDS_PER_ROW = 2 | 20 local BINDS_PER_ROW = 2 |
| 9 local BINDING_TYPE_SPECIALIZATION = 3 | 21 local BINDING_TYPE_SPECIALIZATION = 3 |
| 10 local BINDING_TYPE_CHARACTER = 2 | 22 local BINDING_TYPE_CHARACTER = 2 |
| 11 local BINDING_TYPE_GLOBAL = 1 | 23 local BINDING_TYPE_GLOBAL = 1 |
| 12 local BUTTON_HSPACING = 128 | 24 local BUTTON_HSPACING = 128 |
| 30 [BINDING_TYPE_SPECIALIZATION] = {0, 1, 1}, | 42 [BINDING_TYPE_SPECIALIZATION] = {0, 1, 1}, |
| 31 [BINDING_TYPE_CHARACTER] = {0, 1, 0}, | 43 [BINDING_TYPE_CHARACTER] = {0, 1, 0}, |
| 32 [BINDING_TYPE_GLOBAL] = {0, 1, 1} | 44 [BINDING_TYPE_GLOBAL] = {0, 1, 1} |
| 33 } | 45 } |
| 34 | 46 |
| 35 --[=[ | 47 local match, strupper = string.match, string.upper |
| 36 -- some useful texture paths | 48 local tremove, tinsert, ipairs, pairs, unpack = table.remove, table.insert, ipairs, pairs, unpack |
| 37 [[Interface\PaperDollInfoFrame\UI-GearManager-Undo]] | 49 local tonumber, tostring = tonumber, tostring |
| 38 [[Interface\PetPaperDollFrame\UI-PetHappiness]] | 50 local GetCursorInfo, ClearCursor, ResetCursor = GetCursorInfo, ClearCursor, ResetCursor |
| 39 [[Interface\RAIDFRAME\ReadyCheck-Waiting]] | 51 local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown |
| 40 [[Interface\RAIDFRAME\ReadyCheck-Read]] | 52 local GetBindingAction, GetBindingKey, GetCurrentBindingSet = GetBindingAction, GetBindingKey, GetCurrentBindingSet |
| 41 [[Interface\RAIDFRAME\ReadyCheck-NotReady]] | 53 local SetBinding, SaveBindings = SetBinding, SaveBindings |
| 42 [[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]] | 54 |
| 43 [[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]] | 55 kb.ProcessInput = function(key) |
| 44 [[Interface\UI-TutorialFrame-QuestGiver\UI-TutorialFrame-QuestGray]] | |
| 45 --]=] | |
| 46 local lastFolder | |
| 47 local addT = function(frame, key, folder, name) | |
| 48 folder = folder or lastFolder | |
| 49 frame[key] = frame:CreateTexture() | |
| 50 frame[key]:SetTexture('Interface\\' .. folder .. '\\' .. name) | |
| 51 frame[key]:SetPoint('TOPLEFT') | |
| 52 lastFolder = folder | |
| 53 end | |
| 54 | |
| 55 local restingAlpha = 0.7 | |
| 56 local fadeTime, fadeDelay = .30, 0.15 | |
| 57 local saveButton | |
| 58 | |
| 59 local KeyButton_OnKeyDown = function(self, key) | |
| 60 kb.saveTarget.border:SetColorTexture(1,1,1,1) | |
| 61 end | |
| 62 local KeyButton_OnKeyUp = function(self, key) | |
| 63 kb.UpdateSlot(kb.saveTarget) | |
| 64 if key == 'ESCAPE' then | 56 if key == 'ESCAPE' then |
| 65 kb.DeactivateSlot(kb.saveTarget) | 57 kb.DeactivateSlot(kb.saveTarget) |
| 66 kb.ui() | 58 kb.ui() |
| 67 return | 59 return |
| 68 end | 60 end |
| 69 if key:match('[RL]SHIFT') or key:match('[RL]ALT') or key:match('[RL]CTRL') then | 61 |
| 62 if (match(key, '[RL]SHIFT') or match(key, '[RL]ALT') or match(key, '[RL]CTRL')) then | |
| 70 return | 63 return |
| 71 elseif kb.saveTarget then | 64 end |
| 65 | |
| 66 if kb.saveTarget then | |
| 72 if kb.SaveSlot(kb.saveTarget, key) then | 67 if kb.SaveSlot(kb.saveTarget, key) then |
| 73 if not (kb.db.stickyMode or kb.db.hoverInput) then | 68 if not (kb.db.stickyMode or kb.db.hoverInput) then |
| 74 kb.DeactivateSlot(kb.saveTarget) | 69 kb.DeactivateSlot(kb.saveTarget) |
| 75 end | 70 end |
| 76 kb.ui() | 71 end |
| 77 end | 72 kb.ui() |
| 78 end | 73 end |
| 74 end | |
| 75 | |
| 76 local lastFolder | |
| 77 local restingAlpha = 0.7 | |
| 78 local fadeTime, fadeDelay = .30, 0.15 | |
| 79 local saveButton | |
| 80 | |
| 81 local KeyButton_OnKeyDown = function(self, key) | |
| 82 local st = kb.saveTarget | |
| 83 kb.ProcessInput(key) | |
| 84 end | |
| 85 local KeyButton_OnKeyUp = function(self, key) | |
| 86 local st = kb.saveTarget | |
| 79 end | 87 end |
| 80 | 88 |
| 81 local KeyButton_OnClick = function(self, click) | 89 local KeyButton_OnClick = function(self, click) |
| 82 print(self:GetName(), 'OnMouseDown', click) | 90 print(self:GetName(), 'OnMouseDown', click) |
| 83 local cursorType = GetCursorInfo() | 91 local cursorType = GetCursorInfo() |
| 95 end | 103 end |
| 96 end | 104 end |
| 97 elseif click == 'RightButton' then | 105 elseif click == 'RightButton' then |
| 98 kb.ReleaseSlot(self) | 106 kb.ReleaseSlot(self) |
| 99 kb.ui() | 107 kb.ui() |
| 100 elseif kb.saveTarget then | 108 else |
| 101 if kb.SaveSlot(kb.saveTarget, string.upper(click)) then | 109 kb.ProcessInput(strupper(click)) |
| 102 if not (kb.db.stickyMode or kb.db.hoverInput) then | |
| 103 kb.DeactivateSlot(kb.saveTarget) | |
| 104 end | |
| 105 kb.ui() | |
| 106 end | |
| 107 end | 110 end |
| 108 end | 111 end |
| 109 | 112 |
| 110 local KeyButton_OnDragStart = function(self) | 113 local KeyButton_OnDragStart = function(self) |
| 111 kb.PickupSlot(self) | 114 kb.PickupSlot(self) |
| 211 end | 214 end |
| 212 | 215 |
| 213 frame.header:SetText(header) | 216 frame.header:SetText(header) |
| 214 | 217 |
| 215 frame:SetScript('OnClick', function(self) | 218 frame:SetScript('OnClick', function(self) |
| 219 kb.db[dbKey] = self:GetChecked() | |
| 216 if callback then | 220 if callback then |
| 217 callback(self) | 221 callback(self) |
| 218 end | |
| 219 kb.db[dbKey] = self:GetChecked() | |
| 220 if not kb.db[dbKey] then | |
| 221 if kb.saveTarget then | |
| 222 kb.DeactivateSlot(kb.saveTarget) | |
| 223 end | |
| 224 end | 222 end |
| 225 kb.ui() | 223 kb.ui() |
| 226 end) | 224 end) |
| 227 | 225 |
| 228 frame:SetScript('OnEnter', function(self) | 226 frame:SetScript('OnEnter', function(self) |
| 358 kb:uibutton( | 356 kb:uibutton( |
| 359 'KeyBinderInventoryButton', 'Bags', nil, | 357 'KeyBinderInventoryButton', 'Bags', nil, |
| 360 function() OpenAllBags() end, | 358 function() OpenAllBags() end, |
| 361 "Interface\\BUTTONS\\UI-MicroButtonCharacter-Up", {0, 1, .4, 1}) | 359 "Interface\\BUTTONS\\UI-MicroButtonCharacter-Up", {0, 1, .4, 1}) |
| 362 | 360 |
| 363 KeyBinder_CheckButton(KeyBinderStickyMode, 'Enabled', 'Disabled', 'stickyMode', 'Keep input active after receiving a key.', nil, 'Sticky:') | 361 KeyBinder_CheckButton(KeyBinderStickyMode, 'Enabled', 'Disabled', 'stickyMode', 'Keep input active after receiving a key.', function() |
| 362 if kb.saveTarget and (not kb.db.stickyMode) then | |
| 363 kb.DeactivateSlot(kb.saveTarget) | |
| 364 end | |
| 365 end, 'Sticky:') | |
| 364 KeyBinder_CheckButton(KeyBinderHoverInput, 'MouseOver', 'Click', 'hoverInput', 'Enable key input when the cursor is over a binding slot.', nil, 'Bind by:') | 366 KeyBinder_CheckButton(KeyBinderHoverInput, 'MouseOver', 'Click', 'hoverInput', 'Enable key input when the cursor is over a binding slot.', nil, 'Bind by:') |
| 365 KeyBinder_CheckButton(KeyBinderProtectBindings, 'Block', 'Allow', 'protectBlizKeys', 'Allow overwriting Blizzard UI bindings.', nil, 'Safety:') | 367 KeyBinder_CheckButton(KeyBinderProtectBindings, 'Block', 'Allow', 'protectBlizKeys', 'Allow overwriting Blizzard UI bindings.', nil, 'Safety:') |
| 366 | 368 |
| 367 | 369 |
| 368 KeyBinderUnbindButton:SetScript('OnClick', function() | 370 KeyBinderUnbindButton:SetScript('OnClick', function() |
| 489 | 491 |
| 490 -- Reset this so talent cache can be rebuilt | 492 -- Reset this so talent cache can be rebuilt |
| 491 kb.talentsPushed = nil | 493 kb.talentsPushed = nil |
| 492 end | 494 end |
| 493 | 495 |
| 496 --- Associate processed input with the given slot's metadata | |
| 497 kb.SaveSlot = function(self, key) | |
| 498 | |
| 499 if not self.command then | |
| 500 return | |
| 501 end | |
| 502 print('|cFFFFFF00received|cFFFFFF00', self:GetID(), '|cFF00FFFF', key) | |
| 503 | |
| 504 local modifier = '' | |
| 505 if IsAltKeyDown() then | |
| 506 modifier = 'ALT-' | |
| 507 end | |
| 508 if IsControlKeyDown() then | |
| 509 modifier = modifier.. 'CTRL-' | |
| 510 end | |
| 511 if IsShiftKeyDown() then | |
| 512 modifier = modifier..'SHIFT-' | |
| 513 end | |
| 514 local binding = modifier..key | |
| 515 | |
| 516 -- check for system bindings | |
| 517 --bprint('|cFFFFFF00SaveBind|r', 'protectKeys', kb.db.protectBlizKeys) | |
| 518 if kb.db.protectBlizKeys and kb.SystemBindings[binding] then | |
| 519 kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', binding, kb.SystemBindings[binding])) | |
| 520 kb.bindingstext:SetText(nil) | |
| 521 return false | |
| 522 end | |
| 523 | |
| 524 -- check for other keys | |
| 525 local previousCommand = GetBindingAction(binding) | |
| 526 if previousCommand ~= "" and previousCommand ~= self.command then | |
| 527 local actionType, actionID, name = kb.GetCommandAction(previousCommand) | |
| 528 if actionType then | |
| 529 local keys = {GetBindingKey(previousCommand) } | |
| 530 local i = 1 | |
| 531 while keys[i] do | |
| 532 if keys[i] == binding then | |
| 533 tremove(keys, i) | |
| 534 kb.UpdateBindingsCache(actionType, actionID, keys) | |
| 535 break | |
| 536 end | |
| 537 i = i + 1 | |
| 538 end | |
| 539 end | |
| 540 end | |
| 541 | |
| 542 local currentHotKeys = {GetBindingKey(self.command)} | |
| 543 local found | |
| 544 for i, key in ipairs(currentHotKeys) do | |
| 545 if key == binding then | |
| 546 found = true | |
| 547 kb:print('hotkey already assigned') | |
| 548 end | |
| 549 end | |
| 550 if not found then | |
| 551 tinsert(currentHotKeys, 1, binding) | |
| 552 kb.UpdateBindingsCache(self.actionType, self.actionID, currentHotKeys) | |
| 553 end | |
| 554 | |
| 555 | |
| 556 | |
| 557 print('SetBinding', binding, self.command) | |
| 558 SetBinding(binding, self.command) | |
| 559 SaveBindings(GetCurrentBindingSet()) | |
| 560 self.binding = binding | |
| 561 | |
| 562 local talentInfo | |
| 563 if self.actionType == 'spell' and kb.TalentCache[self.actionID] then | |
| 564 print('store dynamicType talent') | |
| 565 talentInfo = {self.macroName, self.actionName, self.actionType, self.actionID} | |
| 566 local bindings = {GetBindingKey(self.command) } | |
| 567 for i, key in ipairs(bindings) do | |
| 568 tinsert(talentInfo, key) | |
| 569 end | |
| 570 end | |
| 571 | |
| 572 for level, profile in ipairs(kb.orderedProfiles) do | |
| 573 if (level == kb.db.bindMode) then | |
| 574 profile.bound[self.command] = true | |
| 575 if talentInfo then | |
| 576 profile.bindings[self.binding] = nil | |
| 577 else | |
| 578 profile.bindings[self.binding] = self.command | |
| 579 end | |
| 580 profile.talents[self.actionName] = talentInfo | |
| 581 else | |
| 582 profile.bindings[self.binding] = nil | |
| 583 profile.bound[self.command] = nil | |
| 584 kb.currentProfile.talents[self.actionName] = nil | |
| 585 end | |
| 586 if kb.currentProfile.talents[self.actionID] then | |
| 587 kb.currentProfile.talents[self.actionID] = nil | |
| 588 end | |
| 589 end | |
| 590 | |
| 591 kb:print(L('BINDING_ASSIGNED', self.binding, self.actionName, kb.currentHeader)) | |
| 592 kb.UpdateSlot(self, true) | |
| 593 return true | |
| 594 end | |
| 595 | |
| 596 | |
| 597 kb.UnbindSlot = function(self) | |
| 598 | |
| 599 local keys = {GetBindingKey(self.command) } | |
| 600 if #keys >= 1 then | |
| 601 kb.UpdateBindingsCache(self.actionType, self.actionID, {}) | |
| 602 end | |
| 603 | |
| 604 | |
| 605 --print('detected', #keys, 'bindings') | |
| 606 for i, key in pairs(keys) do | |
| 607 --print('clearing', key) | |
| 608 SetBinding(key, nil) | |
| 609 SaveBindings(GetCurrentBindingSet()) | |
| 610 if kb.currentProfile.bindings[key] then | |
| 611 --kb:print(L('BINDING_REMOVED', self.actionName, kb.currentHeader)) | |
| 612 kb.currentProfile.bindings[key] = nil | |
| 613 end | |
| 614 if kb.currentProfile.talents[self.actionName] then | |
| 615 kb.currentProfile.talents[self.actionName] = nil | |
| 616 end | |
| 617 | |
| 618 kb.bindings[tostring(self.actionType)..'_'..tostring(self.actionID)] = nil | |
| 619 end | |
| 620 if kb.currentProfile.bound[self.command] then | |
| 621 kb.currentProfile.bound[self.command] = nil | |
| 622 --kb:print(BINDING_REMOVED:format(self.actionName, configHeaders[db.bindMode])) | |
| 623 end | |
| 624 | |
| 625 | |
| 626 self.active = false | |
| 627 kb.UpdateSlot(self, true) | |
| 628 end | |
| 629 | |
| 494 kb.AcceptAssignment = function(self, ...) | 630 kb.AcceptAssignment = function(self, ...) |
| 495 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] | 631 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] |
| 496 local source = kb. loadedProfiles[popup.oldProfile] | 632 local source = kb. loadedProfiles[popup.oldProfile] |
| 497 kb.SetSlot(popup.slot, unpack(popup.args)) | 633 kb.SetSlot(popup.slot, unpack(popup.args)) |
| 498 kb.UpdateSlot(popup.slot) | 634 kb.UpdateSlot(popup.slot) |
| 499 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) -- re-enable scrolling | 635 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) -- re-enable scrolling |
| 500 ClearCursor() | 636 ClearCursor() |
| 501 ResetCursor() | 637 ResetCursor() |
| 502 end | 638 end |
| 639 | |
| 640 --- Add to blizzard interfaces | |
| 641 StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] = { | |
| 642 text = "Confirm moving an assigned command.", | |
| 643 button1 = OKAY, | |
| 644 button2 = CANCEL, | |
| 645 timeout = 0, | |
| 646 whileDead = 1, | |
| 647 showAlert = 1, | |
| 648 OnAccept = kb.AcceptAssignment, | |
| 649 OnCancel = function() kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) end | |
| 650 } |
