comparison SkeletonKey/KeyBinds.lua @ 1:cd7d06bcd98d

KeyBinds: set hotkey text for blizzard action buttons UnitFrame: prototype templates for the majority of units
author Nenue
date Tue, 21 Jun 2016 04:47:52 -0400
parents 69e828f4238a
children 07293831dd7b
comparison
equal deleted inserted replaced
0:69e828f4238a 1:cd7d06bcd98d
12 -- .refresh(button) update button contents 12 -- .refresh(button) update button contents
13 -- .ui() invoke interface 13 -- .ui() invoke interface
14 -- .profile(name) set profile character 14 -- .profile(name) set profile character
15 -- .loadbinds(bindings) walk table with SetBinding() 15 -- .loadbinds(bindings) walk table with SetBinding()
16 16
17 local KT = LibKT.register(KeyBinder)
17 local kb = KeyBinder 18 local kb = KeyBinder
18 local KT = select(2,...) 19 local db
19 KT.register(KeyBinder) 20
20 local MIN_BIND_SLOTS = 32 21 local MIN_BIND_SLOTS = 32
21 local BINDS_PER_ROW = 8 22 local BINDS_PER_ROW = 8
22 local KEY_BUTTON_SIZE = 40 23 local KEY_BUTTON_SIZE = 40
23 local TAB_OFFSET = 12 24 local TAB_OFFSET = 12
24 local TAB_HEIGHT = 40 25 local TAB_HEIGHT = 40
25 local TAB_SPACING = 2 26 local TAB_SPACING = 2
26 local BUTTON_SPACING = 4 27 local BUTTON_SPACING = 4
27 local BUTTON_PADDING = 12 28 local BUTTON_PADDING = 12
28 local HEADER_OFFSET 29 local HEADER_OFFSET, FOOTER_OFFSET
29 local FOOTER_OFFSET
30 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544; 30 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544;
31 local BINDING_TYPE_SPECIALIZATION = 3 31 local BINDING_TYPE_SPECIALIZATION = 3
32 local BINDING_TYPE_CHARACTER = 2 32 local BINDING_TYPE_CHARACTER = 2
33 local BINDING_TYPE_GLOBAL = 1 33 local BINDING_TYPE_GLOBAL = 1
34 local BINDING_ASSIGNED = '|cFF00FF00%s|r assigned to |cFFFFFF00%s|r (%s).' 34 local BINDING_ASSIGNED = '|cFF00FF00%s|r assigned to |cFFFFFF00%s|r (%s).'
79 local CLASS_ICON_TEXTURE = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES" 79 local CLASS_ICON_TEXTURE = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES"
80 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1 } 80 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1 }
81 local BORDER_ASSIGNED = {0.5,0.5,0.5,1 } 81 local BORDER_ASSIGNED = {0.5,0.5,0.5,1 }
82 local BORDER_PENDING = {1,0.5,0,1 } 82 local BORDER_PENDING = {1,0.5,0,1 }
83 83
84 84 local bindMode = 3
85
86 local bindMode = 3 -- not to be confused with db.bindMode which is boolean
87 local bindHeader = '' 85 local bindHeader = ''
88 local specHeader, specTexture, characterHeader = 'SPEC_NAME', 'Interface\\ICONS\\INV_Misc_QuestionMark', 'PLAYER_NAME' 86 local specHeader, specTexture, characterHeader = 'SPEC_NAME', 'Interface\\ICONS\\INV_Misc_QuestionMark', 'PLAYER_NAME'
87 local numButtons = BINDS_PER_ROW * 4
89 local bindsCommitted = true 88 local bindsCommitted = true
90 89
91 local profile 90 local profile, character, specialization, global
92 local character
93 local specialization
94 local global
95 local priority = {} 91 local priority = {}
96 local numButtons = BINDS_PER_ROW * 4
97 local buttons = {} 92 local buttons = {}
98 local reverts = {} 93 local reverts = {}
99 local KeyButton = {} -- collection of KeyButton template handlers 94 local KeyButton = {} -- collection of KeyButton template handlers
100 local Action = {} -- collection of special action buttons for special binds 95 local Action = {} -- collection of special action buttons for special binds
101 local protected = { 96 local protected = {
506 FOOTER_OFFSET = saveButton:GetHeight() + BUTTON_PADDING 501 FOOTER_OFFSET = saveButton:GetHeight() + BUTTON_PADDING
507 end 502 end
508 503
509 --- Invokes the KeyBinder frame (from the /kb function or some other source) 504 --- Invokes the KeyBinder frame (from the /kb function or some other source)
510 kb.ui = function() 505 kb.ui = function()
511 if not KT.db.bindMode then 506 if not db.showUI then
512 return 507 return
513 end 508 end
514 509
515 if not kb:IsVisible() then 510 if not kb:IsVisible() then
516 kb:Show() 511 kb:Show()
517 KT.db.bindMode = true 512 db.showUI = true
518 end 513 end
519 514
520 if not kb.loaded then 515 if not kb.loaded then
521 SetupUI() 516 SetupUI()
522 kb.loaded = true 517 kb.loaded = true
581 end 576 end
582 SaveBindings() 577 SaveBindings()
583 end 578 end
584 579
585 local ACTION_BARS = { 580 local ACTION_BARS = {
586 'MultiBarBottomLeftButton', 581 {'ActionButton', 0},
587 'MultiBarBottomRighttButton', 582 {'MultiBarLeftButton', 24},
588 'MultiBarLeftButton', 583 {'MultiBarRightButton', 36},
589 'MultiBarRightButton', 584 {'MultiBarBottomRighttButton', 48},
590 'ActionButton' 585 {'MultiBarBottomLeftButton', 60},
591 } 586 }
592 kb.HotKeyText = function () 587 kb.HotKeyText = function (slot)
593 for _, prefix in ipairs(ACTION_BARS) do 588 local i, offset = 0, 0
594 for i = 1,12 do 589 local actionbar
595 local button = _G[prefix .. i] 590
596 if button and button.action then 591 -- figure out which bar the slot belongs to
597 local type, id, subType, subID = GetActionInfo(button.action) 592 for i, bar in ipairs(ACTION_BARS) do
598 if type == 'spell' then 593 actionbar, offset = unpack(ACTION_BARS[i])
599 local name = GetSpellInfo(id) 594 if bar[2] > slot then
600 local bind, bind2 = GetBindingKey('SPELL '..name) 595 break
601 if bind or bind2 then 596 end
602 --print('SPELL '..name, GetBindingKey('SPELL '..name)) 597 end
603 button.HotKey:SetText(BindingString(bind)) 598 local button = _G[actionbar .. (slot - offset)]
604 button.HotKey:Show() 599
605 end 600 if not button then
606 end 601 return
607 end 602 end
608 end 603
604 local type, id, subType, subID = GetActionInfo(slot)
605
606 if not type then
607 return
608 end
609
610 local bind, command
611 if type == 'spell' then
612 local name = GetSpellInfo(id)
613 command = 'SPELL '..name
614 elseif type == 'macro' then
615 command = 'MACRO ' .. id
616 else
617 return
618 end
619 bind = GetBindingKey(command)
620 print(slot, bind, '->', command)
621 if bind then
622 button.HotKey:SetText(BindingString(bind))
623 button.HotKey:Show()
609 end 624 end
610 end 625 end
611 626
612 kb.InitProfile = function(profile) 627 kb.InitProfile = function(profile)
613 profile.buttons = profile.buttons or {} 628 profile.buttons = profile.buttons or {}
627 profile.macros = {} 642 profile.macros = {}
628 end 643 end
629 644
630 --- Gives us the profile structure to work with while instating data 645 --- Gives us the profile structure to work with while instating data
631 kb.profile = function(name) 646 kb.profile = function(name)
632 KT.db = KT.db or {} 647 global = kb.InitProfile(db)
633 global = kb.InitProfile(KT.db)
634 profile = global 648 profile = global
635 local subtitle 649 local subtitle
636 if name then 650 if name then
637 KT.db[name] = KT.db[name] or {} 651 db[name] = db[name] or {}
638 KT.db[name] = kb.InitProfile(KT.db[name]) 652 db[name] = kb.InitProfile(db[name])
639 character = KT.db[name] 653 character = db[name]
640 local spec = GetSpecialization() 654 local spec = GetSpecialization()
641 if spec then 655 if spec then
642 KT.db[name][spec] = KT.db[name][spec] or {} 656 db[name][spec] = db[name][spec] or {}
643 profile = kb.InitProfile(KT.db[name][spec]) 657 profile = kb.InitProfile(db[name][spec])
644 bindMode = BINDING_TYPE_SPECIALIZATION 658 bindMode = BINDING_TYPE_SPECIALIZATION
645 subtitle = select(2,GetSpecializationInfo(spec)) 659 subtitle = select(2,GetSpecializationInfo(spec))
646 specialization = KT.db[name][spec] 660 specialization = db[name][spec]
647 else 661 else
648 profile = kb.InitProfile(KT.db[name]) 662 profile = kb.InitProfile(db[name])
649 bindMode = BINDING_TYPE_CHARACTER 663 bindMode = BINDING_TYPE_CHARACTER
650 subtitle = name 664 subtitle = name
651 specialization = character 665 specialization = character
652 end 666 end
653 end 667 end
654 priority = {global, character, specialization } 668 priority = {global, character, specialization }
655 669
656 670
657 671
658 if not KT.db.bindsPage then 672 if not db.bindsPage then
659 KT.db.bindsPage = bindMode 673 db.bindsPage = bindMode
660 end 674 end
661 bindMode = KT.db.bindsPage 675 bindMode = db.bindsPage
662 676
663 677
664 if not BINDING_MODE[bindMode] then 678 if not BINDING_MODE[bindMode] then
665 bindMode = 3 679 bindMode = 3
666 KT.db.bindsPage = 3 680 db.bindsPage = 3
667 print('overriding', bindMode) 681 print('overriding', bindMode)
668 end 682 end
669 683
670 profile = priority[bindMode] 684 profile = priority[bindMode]
671 685
680 end 694 end
681 695
682 kb.SelectTab = function(self) 696 kb.SelectTab = function(self)
683 bindMode = self:GetID() 697 bindMode = self:GetID()
684 profile = priority[self:GetID()] 698 profile = priority[self:GetID()]
685 KT.db.bindsPage = self:GetID() 699 db.bindsPage = self:GetID()
686 kb.ui() 700 kb.ui()
687 end 701 end
688 kb.save = function() 702 kb.save = function()
689 SaveBindings(GetCurrentBindingSet()) 703 SaveBindings(GetCurrentBindingSet())
690 bindsCommitted = true 704 bindsCommitted = true
709 KeyBinderMacro:SetAttribute('*type*', 'macro') 723 KeyBinderMacro:SetAttribute('*type*', 'macro')
710 end 724 end
711 725
712 --- Get started 726 --- Get started
713 kb.variables = function() 727 kb.variables = function()
728 SkeletonKeyDB = SkeletonKeyDB or {}
729 db = SkeletonKeyDB
714 kb.profile(GetUnitName('player', true)) 730 kb.profile(GetUnitName('player', true))
715 for i = 1, 3 do 731 for i = 1, 3 do
716 for attribute, data in pairs(priority[i].macros) do 732 for attribute, data in pairs(priority[i].macros) do
717 KeyBinderMacro:SetAttribute(attribute, data[1]) 733 KeyBinderMacro:SetAttribute(attribute, data[1])
718 end 734 end
727 kb:RegisterEvent('PLAYER_REGEN_ENABLED') 743 kb:RegisterEvent('PLAYER_REGEN_ENABLED')
728 kb:RegisterEvent('ACTIONBAR_SLOT_CHANGED') 744 kb:RegisterEvent('ACTIONBAR_SLOT_CHANGED')
729 end 745 end
730 746
731 kb.close = function() 747 kb.close = function()
732 KT.db.bindMode = false 748 db.showUI = false
733 kb:Hide() 749 kb:Hide()
734 end 750 end
735 751
736 kb.PLAYER_REGEN_DISABLED = function() 752 kb.PLAYER_REGEN_DISABLED = function()
737 if KT.db.bindMode then 753 if db.showUI then
738
739 kb:Hide() 754 kb:Hide()
740 end 755 end
741 end 756 end
742 757
743 kb.PLAYER_REGEN_ENABLED = function() 758 kb.PLAYER_REGEN_ENABLED = function()
744 if KT.db.bindMode then 759 if db.showUI then
745 kb.ui() 760 kb.ui()
746 end 761 end
747 end 762 end
748 --- Refresh buttons if macros are updated 763 --- Refresh buttons if macros are updated
749 kb.UPDATE_BINDINGS = function() 764 kb.UPDATE_BINDINGS = function()
750 if KT.db.bindMode then 765 for i = 1, 120 do
766 print(i)
767 kb.HotKeyText(i)
768 end
769 if db.showUI then
751 kb.ui() 770 kb.ui()
752 end 771 end
753 kb.HotKeyText() 772 end
754 end 773
755 774 kb.ACTIONBAR_SLOT_CHANGED = function(self, event, slot)
756 kb.ACTIONBAR_SLOT_CHANGED = function() 775 kb.HotKeyText(slot)
757 kb.HotKeyText() 776 end
758 end
759
760
761 777
762 kb.UPDATE_MACROS = kb.UPDATE_BINDINGS 778 kb.UPDATE_MACROS = kb.UPDATE_BINDINGS
763
764
765 SLASH_KB1 = "/kb" 779 SLASH_KB1 = "/kb"
766 SlashCmdList.KB = function() 780 SlashCmdList.KB = function(self, input)
767 if KT.db.bindMode then 781 if db.showUI then
768 KT.db.bindMode = false 782 db.showUI = false
769 print('|cFFFFFF00KeyBinds|r trace, |cFFFF0000OFF|r.') 783 print('|cFFFFFF00KeyBinds|r trace, |cFFFF0000OFF|r.')
770 kb:Hide() 784 kb:Hide()
771 else 785 else
772 KT.db.bindMode = true 786 db.showUI = true
773 print('|cFFFFFF00KeyBinds|r trace, |cFF00FF00ON|r.') 787 print('|cFFFFFF00KeyBinds|r trace, |cFF00FF00ON|r.')
774 kb.ui() 788 kb.ui()
775 end 789 end
776 end 790 end