Mercurial > wow > skeletonkey
comparison SkeletonKey/KeyButton.lua @ 27:73df13211b22
- actionbar hotkey text properly updates after hotkeys get switched
- remove a unused function call
author | Nenue |
---|---|
date | Tue, 02 Aug 2016 12:33:13 -0400 |
parents | SkeletonKey/KeySlot.lua@f6dd297cb812 |
children | bb160c04de88 |
comparison
equal
deleted
inserted
replaced
26:c081f117c19d | 27:73df13211b22 |
---|---|
1 -- SkeletonKey | |
2 -- KeyButton.lua | |
3 -- Created: 7/28/2016 11:26 PM | |
4 -- %file-revision% | |
5 -- Code dealing with the slot button innards; they are invoked by frame script and should only chain to Set/Release | |
6 | |
7 local kb, print = LibStub('LibKraken').register(KeyBinder, 'Slot') | |
8 local L = kb.L | |
9 local CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_PETACTION, CURSOR_TEXTURE | |
10 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544 | |
11 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1} | |
12 local BORDER_ASSIGNED = {1,1,1,1} | |
13 local BORDER_DYNAMIC = {1,1,0,1} | |
14 local BORDER_PENDING = {1,0.5,0,1 } | |
15 local BUTTON_HEADERS = { | |
16 ['spell'] = SPELLS, | |
17 ['macro'] = MACRO, | |
18 ['petaction'] = PET, | |
19 ['mount'] = MOUNT, | |
20 ['battlepet'] = BATTLEPET, | |
21 | |
22 | |
23 [5] = PROFESSIONS_FIRST_AID, | |
24 [7] = PROFESSIONS_COOKING, | |
25 [9] = PROFESSIONS_FISHING, | |
26 [10] = PROFESSIONS_ARCHAEOLOGY, | |
27 | |
28 } | |
29 | |
30 -- This is needed to identify a spells that aren't reflected by GetCursorInfo() | |
31 kb.OnPickupPetAction = function(slot, ...) | |
32 local isPickup = GetCursorInfo() | |
33 print(slot, ...) | |
34 if kb.PetCache.action[slot] then | |
35 if isPickup then | |
36 local key, _, texture = unpack(kb.PetCache.action[slot]) | |
37 local spellName = _G[key] or key | |
38 if spellName and kb.PetCache.spellslot[spellName] then | |
39 CURSOR_SPELLSLOT = kb.PetCache.spellslot[spellName][1] | |
40 CURSOR_BOOKTYPE = BOOKTYPE_PET | |
41 CURSOR_TEXTURE = _G[texture] or texture | |
42 end | |
43 else | |
44 CURSOR_SPELLSLOT = nil | |
45 CURSOR_BOOKTYPE = nil | |
46 CURSOR_TEXTURE = nil | |
47 end | |
48 print('|cFFFF4400PickupPetAction|r', isPickup, CURSOR_PETACTION) | |
49 end | |
50 | |
51 local name, subtext, texture, isToken = GetPetActionInfo(slot) | |
52 if name then | |
53 kb.PetCache.action[slot] = {name, subtext, texture, isToken} | |
54 end | |
55 | |
56 | |
57 print('current cursor info', CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_TEXTURE) | |
58 | |
59 end | |
60 | |
61 kb.OnPickupSpellBookItem = function(slot, bookType) | |
62 print('|cFFFF4400PickupSpellBookItem('.. tostring(slot).. ', '..tostring(bookType)..')') | |
63 CURSOR_SPELLSLOT = slot | |
64 CURSOR_BOOKTYPE = bookType | |
65 CURSOR_TEXTURE = GetSpellBookItemTexture(slot, bookType) | |
66 print('current cursor info', CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_TEXTURE) | |
67 end | |
68 | |
69 kb.CreateHooks = function() | |
70 hooksecurefunc("PickupSpellBookItem", kb.OnPickupSpellBookItem) | |
71 hooksecurefunc("PickupPetAction", kb.OnPickupPetAction) | |
72 end | |
73 | |
74 | |
75 kb.DropToSlot = function(self) | |
76 print(self:GetName(),'|cFF0088FFreceived|r') | |
77 local actionType, actionID, subType, subData = GetCursorInfo() | |
78 print('GetCursorInfo', GetCursorInfo()) | |
79 if actionType then | |
80 | |
81 if actionType == 'flyout' then | |
82 ClearCursor() | |
83 ResetCursor() | |
84 return | |
85 end | |
86 | |
87 | |
88 local name, icon, _ | |
89 local pickupID, pickupBook | |
90 | |
91 if actionType == 'spell' then | |
92 actionID = subData | |
93 name, _, icon = GetSpellInfo(actionID) | |
94 | |
95 elseif actionType == 'macro' then | |
96 name, icon = GetMacroInfo(actionID) | |
97 elseif actionType == 'petaction' then | |
98 if CURSOR_SPELLSLOT and CURSOR_BOOKTYPE then | |
99 | |
100 local spellType, spellID = GetSpellBookItemInfo(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE) | |
101 local spellName, spellText = GetSpellBookItemName(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE) | |
102 if spellType == 'PETACTION' then | |
103 name = spellName | |
104 actionID = spellText | |
105 icon = CURSOR_TEXTURE | |
106 else | |
107 name, _, icon = GetSpellInfo(spellID) | |
108 actionID = spellID | |
109 end | |
110 | |
111 pickupID = CURSOR_SPELLSLOT | |
112 pickupBook = CURSOR_BOOKTYPE | |
113 else | |
114 | |
115 end | |
116 | |
117 elseif actionType == 'mount' then | |
118 if subType == 0 then | |
119 name, _, icon = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL) | |
120 actionID = 0 | |
121 else | |
122 name, _, icon = C_MountJournal.GetMountInfoByID(actionID) | |
123 end | |
124 elseif actionType == 'item' then | |
125 name = GetItemInfo(actionID) | |
126 icon = GetItemIcon(actionID) | |
127 actionID = name | |
128 elseif actionType == 'battlepet' then | |
129 | |
130 local speciesID, customName, level, xp, maxXp, displayID, isFavorite, petName, petIcon, petType, creatureID = C_PetJournal.GetPetInfoByPetID(detail); | |
131 name = customName or petName | |
132 icon = petIcon | |
133 | |
134 end | |
135 local macroName, macroText, command = kb.RegisterAction(actionType, actionID, name) | |
136 | |
137 | |
138 local isAssigned, isBound, assignedBy, boundBy = kb.IsCommandBound(self, command) | |
139 if isAssigned then | |
140 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] | |
141 popup.slot = self | |
142 popup.text = "Currently assigned in |cFFFFFF00"..tostring(kb.configHeaders[assignedBy]).."|r. Are you sure?" | |
143 popup.oldProfile = assignedBy | |
144 popup.args = {command, name, icon, actionType, actionID, macroName, macroText, pickupID, pickupBook } | |
145 kb:SetScript('OnMouseWheel', nil) -- disable scrolling | |
146 StaticPopup_Show('SKELETONKEY_CONFIRM_ASSIGN_SLOT') | |
147 else | |
148 kb.SetSlot(self, command, name, icon, actionType, actionID, macroName, macroText, pickupID, pickupBook) | |
149 kb.UpdateSlot(self) | |
150 self.active = nil | |
151 ClearCursor() | |
152 ResetCursor() | |
153 end | |
154 end | |
155 end | |
156 | |
157 | |
158 do | |
159 local PickupAction = { | |
160 spell = _G.PickupSpell, | |
161 petaction = _G.PickupSpellBookItem, | |
162 macro = _G.PickupMacro, | |
163 item = _G.PickupItem, | |
164 mount = _G.C_MountJournal.Pickup | |
165 } | |
166 local GetPickupValue = { | |
167 spell = function(self) return select(7, GetSpellInfo(self.actionID)) end, | |
168 petaction = function(self) return self.pickupSlot, self.pickupBook end, | |
169 } | |
170 kb.PickupSlot = function(self) | |
171 if not (self.command and self.isAvailable) then | |
172 return | |
173 end | |
174 print(self.actionType) | |
175 if self.actionType == 'spell' then | |
176 -- It can't be picked up if SpellInfo(name) returns void | |
177 local dummy = GetSpellInfo(self.actionName) | |
178 if not dummy then | |
179 return | |
180 end | |
181 end | |
182 if PickupAction[self.actionType] then | |
183 if GetPickupValue[self.actionType] then | |
184 PickupAction[self.actionType](GetPickupValue[self.actionType](self)) | |
185 else | |
186 PickupAction[self.actionType](self.actionID) | |
187 end | |
188 kb.ReleaseSlot(self) | |
189 kb.UpdateSlot(self) | |
190 end | |
191 end | |
192 end | |
193 | |
194 kb.UnbindSlot = function(self) | |
195 | |
196 local keys = {GetBindingKey(self.command) } | |
197 if #keys >= 1 then | |
198 kb.UpdateBindingsCache(self.actionType, self.actionID, {}) | |
199 end | |
200 | |
201 | |
202 --print('detected', #keys, 'bindings') | |
203 for i, key in pairs(keys) do | |
204 --print('clearing', key) | |
205 SetBinding(key, nil) | |
206 SaveBindings(GetCurrentBindingSet()) | |
207 if kb.currentProfile.bindings[key] then | |
208 --kb:print(L('BINDING_REMOVED', self.actionName, kb.currentHeader)) | |
209 kb.currentProfile.bindings[key] = nil | |
210 end | |
211 if kb.currentProfile.talents[self.actionName] then | |
212 kb.currentProfile.talents[self.actionName] = nil | |
213 end | |
214 kb.bindings[self.actionType][self.actionID] = nil | |
215 end | |
216 if kb.currentProfile.bound[self.command] then | |
217 kb.currentProfile.bound[self.command] = nil | |
218 --kb:print(BINDING_REMOVED:format(self.actionName, configHeaders[db.bindMode])) | |
219 end | |
220 | |
221 | |
222 self.active = false | |
223 kb.UpdateSlot(self, true) | |
224 end | |
225 | |
226 --- Updates the current KeyBinding for the button's command | |
227 kb.SaveSlot = function(self, key) | |
228 | |
229 if not self.command then | |
230 return | |
231 end | |
232 print('|cFFFFFF00received|cFFFFFF00', self:GetID(), '|cFF00FFFF', key) | |
233 | |
234 local modifier = '' | |
235 if IsAltKeyDown() then | |
236 modifier = 'ALT-' | |
237 end | |
238 if IsControlKeyDown() then | |
239 modifier = modifier.. 'CTRL-' | |
240 end | |
241 if IsShiftKeyDown() then | |
242 modifier = modifier..'SHIFT-' | |
243 end | |
244 local binding = modifier..key | |
245 | |
246 if key == 'ESCAPE' then | |
247 else | |
248 if kb.SystemBindings[binding] then | |
249 kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', binding, kb.SystemBindings[binding])) | |
250 return | |
251 end | |
252 | |
253 | |
254 if self.command then | |
255 | |
256 local previousCommand = GetBindingAction(binding) | |
257 if previousCommand ~= "" and previousCommand ~= self.command then | |
258 if kb.SystemBindings[binding] then | |
259 -- bounce out if trying to use a protected key | |
260 kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', key, GetBindingAction(binding))) | |
261 kb.bindingstext:SetText(nil) | |
262 return false | |
263 end | |
264 | |
265 local actionType, actionID, name = kb.GetCommandAction(previousCommand) | |
266 if actionType then | |
267 local keys = {GetBindingKey(previousCommand) } | |
268 local i = 1 | |
269 while keys[i] do | |
270 if keys[i] == binding then | |
271 table.remove(keys, i) | |
272 kb.UpdateBindingsCache(actionType, actionID, keys) | |
273 break | |
274 end | |
275 i = i + 1 | |
276 end | |
277 end | |
278 end | |
279 | |
280 local currentHotKeys = {GetBindingKey(self.command)} | |
281 local found | |
282 for i, key in ipairs(currentHotKeys) do | |
283 if key == binding then | |
284 found = true | |
285 kb:print('hotkey already assigned') | |
286 end | |
287 end | |
288 if not found then | |
289 table.insert(currentHotKeys, 1, binding) | |
290 kb.UpdateBindingsCache(self.actionType, self.actionID, currentHotKeys) | |
291 end | |
292 | |
293 self.binding = binding | |
294 | |
295 | |
296 | |
297 SetBinding(binding, self.command) | |
298 SaveBindings(GetCurrentBindingSet()) | |
299 | |
300 | |
301 | |
302 local talentInfo | |
303 if self.actionType == 'spell' and kb.TalentCache[self.actionID] then | |
304 print('conditional binding (talent = "'..self.actionName..'")') | |
305 talentInfo = {self.macroName, self.actionName, self.actionType, self.actionID} | |
306 local bindings = {GetBindingKey(self.command) } | |
307 for i, key in ipairs(bindings) do | |
308 tinsert(talentInfo, key) | |
309 end | |
310 end | |
311 | |
312 for level, profile in ipairs(kb.orderedProfiles) do | |
313 if (level == kb.db.bindMode) then | |
314 profile.bound[self.command] = true | |
315 if talentInfo then | |
316 profile.bindings[self.binding] = nil | |
317 else | |
318 profile.bindings[self.binding] = self.command | |
319 end | |
320 profile.talents[self.actionName] = talentInfo | |
321 else | |
322 profile.bindings[self.binding] = nil | |
323 profile.bound[self.command] = nil | |
324 kb.currentProfile.talents[self.actionName] = nil | |
325 end | |
326 if kb.currentProfile.talents[self.actionID] then | |
327 kb.currentProfile.talents[self.actionID] = nil | |
328 end | |
329 end | |
330 | |
331 kb:print(L('BINDING_ASSIGNED', self.binding, self.actionName, kb.currentHeader)) | |
332 end | |
333 end | |
334 kb.UpdateSlot(self, true) | |
335 return true | |
336 end | |
337 | |
338 | |
339 --- Updates profile assignment and button contents | |
340 kb.UpdateSlot = function(self, force) | |
341 local slot = self:GetID() | |
342 | |
343 if force then | |
344 if kb.currentProfile.buttons[slot] then | |
345 kb.SetSlot(self, unpack(kb.currentProfile.buttons[slot])) | |
346 else | |
347 kb.ReleaseSlot(self) | |
348 end | |
349 end | |
350 | |
351 if self.command then | |
352 print('['..slot..'] =', self.command, GetBindingKey(self.command)) | |
353 | |
354 if not self.isAvailable then | |
355 self.border:SetColorTexture(1,0,0,1) | |
356 self.ignoreTexture:Show() | |
357 else | |
358 self.ignoreTexture:Hide() | |
359 | |
360 if self.pending then | |
361 self.border:SetColorTexture(unpack(BORDER_PENDING)) | |
362 elseif self.isDynamic then | |
363 self.border:SetColorTexture(unpack(BORDER_DYNAMIC)) | |
364 else | |
365 self.border:SetColorTexture(unpack(BORDER_ASSIGNED)) | |
366 end | |
367 end | |
368 | |
369 | |
370 if self.actionType == 'macro' then | |
371 self.macro:Show() | |
372 else | |
373 self.macro:Hide() | |
374 if self.actionType == 'spell' then | |
375 local dummy = GetSpellInfo(self.actionName) | |
376 if not dummy then | |
377 self.icon:SetDesaturated(true) | |
378 else | |
379 self.icon:SetDesaturated(false) | |
380 end | |
381 | |
382 end | |
383 end | |
384 | |
385 if self.isDynamic then | |
386 print('|cFF00BBFFUpdateSlot|r:', self.isDynamic, self.isAvailable, self.actionID) | |
387 end | |
388 | |
389 if self.isDynamic == 'profession' then | |
390 local profText = (self.spellNum == 1) and TRADE_SKILLS or (BUTTON_HEADERS[self.profIndex] or GetProfessionInfo(self.profIndex)) | |
391 if self.isAvailable then | |
392 print(self.profIndex, 'spnum', type(self.spellNum), (self.spellNum == 1)) | |
393 | |
394 self.statusText = '|cFFFFFF00'..profText..'|r' | |
395 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | |
396 else | |
397 self.statusText = '|cFFFF4400'..profText..'|r' | |
398 self.actionName = '(need to train profession #'..self.profNum..')' | |
399 self.bindingText ='?' | |
400 end | |
401 elseif self.isDynamic == 'talent' then | |
402 | |
403 self.statusText = '|cFF00FFFF'.. TALENT .. '|r' | |
404 if self.isAvailable then | |
405 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | |
406 else | |
407 if kb.TalentBindings[self.actionID] then | |
408 print(self.actionID, #kb.TalentBindings[self.actionID]) | |
409 self.bindingText= kb.BindingString(unpack(kb.TalentBindings[self.actionID])) | |
410 end | |
411 | |
412 end | |
413 elseif self.isDynamic == 'petaction' then | |
414 local specialType, specialNum = self.command:match("petaction_([%a%s]+)_(%d)") | |
415 if specialType and specialNum then | |
416 print('pet skill|cFF00FF00', specialType..'|r', specialNum) | |
417 self.statusText = L(specialType..' %%d'):format(specialNum) | |
418 else | |
419 self.statusText = L('Pet Action') | |
420 end | |
421 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | |
422 else | |
423 self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r' | |
424 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | |
425 end | |
426 | |
427 local locked, layer = kb.IsCommandBound(self) | |
428 if locked then | |
429 self.icon:SetAlpha(0.5) | |
430 else | |
431 self.icon:SetAlpha(1) | |
432 end | |
433 | |
434 | |
435 if self.actionType == 'spell' then | |
436 self.icon:SetTexture(GetSpellTexture(self.actionID)) | |
437 end | |
438 else | |
439 self.ignoreTexture:Hide() | |
440 end | |
441 | |
442 if not self.isAvailable then | |
443 self.bind:SetTextColor(0.7,0.7,0.7,1) | |
444 else | |
445 self.bind:SetTextColor(1,1,1,1) | |
446 end | |
447 | |
448 | |
449 if kb.saveTarget and kb.saveTarget ~= self then | |
450 self:SetAlpha(0.25) | |
451 else | |
452 | |
453 self:SetAlpha(1) | |
454 end | |
455 | |
456 | |
457 self.header:SetText(self.statusText) | |
458 self.bind:SetText(self.bindingText) | |
459 self.details:SetText(self.actionName) | |
460 end | |
461 | |
462 --- Resets button command | |
463 kb.ReleaseSlot = function(self) | |
464 local slot = self:GetID() | |
465 | |
466 | |
467 if kb.currentProfile.buttons[slot] then | |
468 kb.currentProfile.buttons[slot] = nil | |
469 end | |
470 if self.command then | |
471 kb.currentProfile.commands[self.command] = nil | |
472 end | |
473 if self.actionType == 'spell' and IsTalentSpell(self.actionName) then | |
474 if kb.currentProfile.talents[self.actionID] then | |
475 kb.currentProfile.talents[self.actionID] = nil | |
476 end | |
477 end | |
478 local droppedKeys = {} | |
479 | |
480 -- doing removal in second loop to avoid possible iterator shenanigans | |
481 for k,v in pairs(kb.currentProfile.bindings) do | |
482 if v == self.command then | |
483 tinsert(droppedKeys, k) | |
484 end | |
485 end | |
486 if #droppedKeys >=1 then | |
487 for i, k in ipairs(droppedKeys) do | |
488 kb.currentProfile.bindings[k] = nil | |
489 end | |
490 end | |
491 | |
492 self.isAvailable = nil | |
493 self.isDynamic = nil | |
494 self.bindingText = nil | |
495 self.statusText = nil | |
496 self.command = nil | |
497 self.actionType = nil | |
498 self.actionID = nil | |
499 self.actionName = nil | |
500 self.pickupSlot = nil | |
501 self.pickupBook = nil | |
502 self.macroName = nil | |
503 self.profile = nil | |
504 self.icon:SetTexture(nil) | |
505 self.border:SetColorTexture(unpack(BORDER_UNASSIGNED)) | |
506 self:EnableKeyboard(false) | |
507 self:SetScript('OnKeyDown', nil) | |
508 self.ignoreTexture:Hide() | |
509 end | |
510 | |
511 kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook) | |
512 local slot = self:GetID() | |
513 local isDynamic, isAvailable | |
514 | |
515 print('|cFFFFFF00SetSlot|r:', self:GetID()) | |
516 if command then | |
517 | |
518 if actionType == 'spell' then | |
519 local professionNum, spellNum = command:match("profession_(%d)_(%d)") | |
520 if (professionNum and spellNum) then | |
521 isDynamic = 'profession' | |
522 local cacheInfo = kb.ProfessionCache[professionNum..'_'..spellNum] | |
523 if cacheInfo then | |
524 isAvailable = true | |
525 name = cacheInfo.spellName | |
526 icon = cacheInfo.icon | |
527 actionID = cacheInfo.spellID | |
528 self.profIndex = cacheInfo.profIndex | |
529 self.spellOffset = cacheInfo.spellOffset | |
530 end | |
531 print(' Special slot: |cFF00FFFFProfession|r', professionNum, spellNum, isDynamic, isAvailable) | |
532 | |
533 self.professionNum = tonumber(professionNum) | |
534 self.spellNum = tonumber(spellNum) | |
535 | |
536 else | |
537 if kb.TalentCache[actionID] then | |
538 isDynamic = 'talent' | |
539 print(' Special slot: |cFFBBFF00talent|r', name, isAvailable) | |
540 end | |
541 | |
542 isAvailable = GetSpellInfo(name) | |
543 end | |
544 elseif actionType == 'petaction' then | |
545 isDynamic = 'petaction' | |
546 local specialType, specialNum = command:match(actionType..'_([%a%s]+)_(%d)') | |
547 | |
548 if kb.PetCache.subtext[specialType] and kb.PetCache.subtext[specialType][tonumber(specialNum)] then | |
549 print('***dynamic pet thign', specialType, specialNum) | |
550 --[[ i, spellName, subText, spellID, texture, specialNum[subText ]] | |
551 pickupSlot, name, specialType, actionID, icon, specialNum = unpack(kb.PetCache.subtext[specialType][tonumber(specialNum)]) | |
552 pickupBook = BOOKTYPE_PET | |
553 end | |
554 | |
555 isAvailable = (kb.PetCache.spellslot[name]) | |
556 | |
557 | |
558 elseif actionType == 'macro' then | |
559 if not actionID then | |
560 actionID = GetMacroIndexByName(name) | |
561 end | |
562 isAvailable = true | |
563 else | |
564 --- Journal selections | |
565 -- todo: consider using the deep end of blizzard action bar instead | |
566 if not actionID then | |
567 actionID = command:match("^KeyBinderMacro:(.+)") | |
568 end | |
569 isAvailable = true | |
570 end | |
571 | |
572 if isAvailable then | |
573 local oldCommand = command | |
574 macroName, macroText, command = kb.RegisterAction(actionType, actionID, name) | |
575 if oldCommand ~= command then | |
576 print('|cFFFF4400fixing command string', actionType, actionID, name) | |
577 kb.currentProfile.bound[oldCommand] = nil | |
578 kb.currentProfile.bound[command] = slot | |
579 for k,v in pairs(kb.currentProfile.bindings) do | |
580 if v == oldCommand then | |
581 kb.currentProfile.bindings[k] = command | |
582 end | |
583 end | |
584 end | |
585 kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText) | |
586 end | |
587 | |
588 | |
589 actionID = actionID or 0 | |
590 self:EnableKeyboard(true) | |
591 print(' |cFF00FF00kb.currentProfile.buttons['..slot..'] |cFF00FFFF=|r |cFF00FFFF"'.. command.. '"|r |cFF00FF00"'.. name.. '"|r |cFFFFFF00icon:'.. tostring(icon) .. '|r |cFFFF8800"'.. actionType, '"|r |cFFFF0088id:'.. actionID ..'|r |cFF00FF00"'.. macroName .. '"|r') | |
592 kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook } | |
593 | |
594 | |
595 -- Clean up conflicting entries for loaded button | |
596 local previous = kb.currentProfile.commands[command] | |
597 if previous ~= slot and kb.buttons[previous] then | |
598 kb.ReleaseSlot(kb.buttons[previous]) | |
599 end | |
600 | |
601 if not (kb.IsCommandBound(self, command) or kb.currentProfile.bound[command]) then | |
602 | |
603 local binds = {GetBindingKey(command) } | |
604 if #binds >= 1 then | |
605 kb:print('Recovered key binding for', name) | |
606 for i, key in ipairs(binds) do | |
607 kb.currentProfile.bindings[key] = command | |
608 kb.currentProfile.bound[command] = true | |
609 end | |
610 end | |
611 end | |
612 | |
613 | |
614 kb.currentProfile.commands[command] = slot | |
615 | |
616 end | |
617 | |
618 self.isAvailable = isAvailable | |
619 self.isDynamic = isDynamic | |
620 | |
621 self.pickupSlot = pickupSlot | |
622 self.pickupBook = pickupBook | |
623 self.macroText = macroText | |
624 self.macroName = macroName | |
625 self.actionType = actionType | |
626 self.actionID = actionID | |
627 self.actionName = name | |
628 self.command = command | |
629 self.icon:SetTexture(icon) | |
630 self.profile = kb.db.bindMode | |
631 self:RegisterForDrag('LeftButton') | |
632 end | |
633 | |
634 kb.GetCommandAction = function(command) | |
635 for i, data in ipairs(kb.loadedProfiles) do | |
636 if data.commands[command] then | |
637 if data.buttons[data.commands[command]] then | |
638 local _, _, _, actionType, actionID = unpack(data.buttons[data.commands[command]]) | |
639 return actionType, actionID | |
640 end | |
641 end | |
642 end | |
643 end | |
644 | |
645 | |
646 --- Add to blizzard interfaces | |
647 StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] = { | |
648 text = "Confirm moving an assigned command.", | |
649 button1 = OKAY, | |
650 button2 = CANCEL, | |
651 timeout = 0, | |
652 whileDead = 1, | |
653 showAlert = 1, | |
654 OnAccept = kb.AcceptAssignment, | |
655 OnCancel = function() kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) end | |
656 } |