comparison SkeletonKey/UI.lua @ 6:f6d1c192afc6

Refactored file layout: - frame display logic in UI.lua - player data in Cache.lua - event responses in Events.lua a lot of local tables are now stored members of KeyBinder for that to work
author Nenue
date Thu, 28 Jul 2016 16:45:56 -0400
parents
children a2fc77fa4c73
comparison
equal deleted inserted replaced
5:9ac29fe77455 6:f6d1c192afc6
1 -- KrakTool
2 -- UI.lua
3 -- Created: 7/28/2016 3:39 PM
4 -- %file-revision%
5 --
6
7 local kb, print = LibStub("LibKraken").register(KeyBinder, 'KeySlot')
8 local BINDS_PER_ROW = 2
9 local BUTTON_HSPACING = 128
10 local BUTTON_SPACING = 4
11 local BUTTON_PADDING = 12
12 local BINDING_TYPE_SPECIALIZATION = 3
13 local BINDING_TYPE_CHARACTER = 2
14 local BINDING_TYPE_GLOBAL = 1
15 local KEY_BUTTON_SIZE = 48
16 local MIN_BIND_SLOTS = 32
17 local TAB_OFFSET = 12
18 local TAB_HEIGHT = 40
19 local TAB_SPACING = 2
20 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1 }
21 local BORDER_ASSIGNED = {0.5,0.5,0.5,1 }
22 local BORDER_DYNAMIC = {1,1,0,1}
23 local BORDER_PENDING = {1,0.5,0,1 }
24
25 local BUTTON_HEADERS = {
26 ['spell'] = SPELLS,
27 ['macro'] = MACRO,
28 ['petaction'] = PET,
29 ['mount'] = MOUNT,
30 ['battlepet'] = BATTLEPET,
31
32
33 [5] = PROFESSIONS_FIRST_AID,
34 [7] = PROFESSIONS_COOKING,
35 [9] = PROFESSIONS_FISHING,
36 [10] = PROFESSIONS_ARCHAEOLOGY,
37
38 }
39
40 local BINDING_SCHEME_COLOR = {
41 [BINDING_TYPE_GLOBAL] = {0,.125,.5,.5},
42 [BINDING_TYPE_CHARACTER] = {0,0.25,0,0.5},
43 [BINDING_TYPE_SPECIALIZATION] = {.25,0,0,0.5},
44 }
45 local BINDING_SCHEME_VERTEX = {
46 [BINDING_TYPE_GLOBAL] = {0,.5,1,1},
47 [BINDING_TYPE_CHARACTER] = {0,1,0,1},
48 [BINDING_TYPE_SPECIALIZATION] = {1,1,1,1},
49 }
50 local BINDING_SCHEME_TEXT = {
51 [BINDING_TYPE_SPECIALIZATION] = {0, 1, 1},
52 [BINDING_TYPE_CHARACTER] = {0, 1, 0},
53 [BINDING_TYPE_GLOBAL] = {0, 1, 1}
54 }
55
56 local restingAlpha = 0.7
57 local fadeTime, fadeDelay = .30, 0.15
58 local numButtons = BINDS_PER_ROW * 8
59 local saveButton
60 local KeyButton_OnKeyDown = function(self, key)
61 kb.StoreBinding(self, key)
62 end
63 local KeyButton_OnClick = function(self, click)
64 print(self:GetName(), 'OnMouseDown', click)
65 if click == 'LeftButton' then
66 kb.DropToSlot(self)
67 elseif click == 'RightButton' then
68 kb.ReleaseSlot(self)
69 else
70 kb.StoreBinding(self, click:upper())
71 end
72 end
73
74 local KeyButton_OnDragStart = function(self)
75 kb.PickupSlot(self)
76 end
77
78 local KeyButton_OnReceiveDrag = function(self, ...)
79 kb.DropToSlot(self)
80 end
81
82
83 local KeyBinder_OnUpdate = function(self, elapsed)
84 self.elapsed = self.elapsed + elapsed
85 self.throttle = self.throttle + elapsed
86
87 if (self.throttle >= 0.032) then
88 self.throttle = 0
89 else
90 return
91 end
92
93 local progress = 1
94 if self.elapsed > fadeTime then
95 self.elapsed = 0
96 self.fadeStep = 0
97 --self.statustext:SetText(nil)
98 --self.bindingstext:SetText(nil)
99 self:SetScript('OnUpdate', nil)
100 else
101 if self.elapsed < fadeDelay then
102 progress = 0
103 else
104 self.fadeStep = self.fadeStep + 1
105 progress = (self.elapsed - fadeDelay) /(fadeTime - fadeDelay)
106 end
107 --print(self.fadeStep, format('%.02f/%.02f', (self.elapsed - fadeDelay) ,(fadeTime - fadeDelay)) , progress)
108 end
109
110 local alpha = 1 - progress * (1- restingAlpha)
111 self.statustext:SetAlpha(alpha)
112 self.bindingstext:SetAlpha(alpha)
113 end
114
115 local KeyButton_OnUpdate = function(self)
116 if not self.command then
117 return
118 end
119
120 if self:IsMouseOver() then
121 kb.elapsed = 0
122 if not self.active then
123 -- only set this handler when the button is activated/mouseOver
124 self.active = true
125 self:SetScript('OnKeyDown', KeyButton_OnKeyDown)
126
127 kb.statustext:SetText(self.statusText .. ': '..self.actionName)
128 kb.bindingstext:SetText(self.bindingText)
129 kb.fadeStep = 0
130 kb.throttle = 0
131 kb:SetScript('OnUpdate', KeyBinder_OnUpdate)
132
133 end
134 else
135 if self.active then
136 self.active = nil
137 self:SetScript('OnKeyDown', nil)
138 end
139 end
140 end
141
142 local KeyBinder_OnMouseWheel = function(self, delta)
143 print(self, delta, self.scrollOffset, (self.scrollOffset <= 0))
144
145
146 if IsControlKeyDown() then
147 KEY_BUTTON_SIZE = KEY_BUTTON_SIZE - delta
148 else
149
150
151 if (delta > 0) and (self.scrollOffset <= 0) then
152 return
153 elseif delta < 0 and kb.scrollOffset >= 42 then
154 return
155 end
156 kb.scrollOffset = ceil(kb.scrollOffset - (delta * BINDS_PER_ROW))
157 end
158
159 kb.ui(true)
160 end
161
162 local KeyBinder_OnHide = function()
163 KeyBinderImportLog:Hide()
164 end
165
166 local CloseButton_OnClick = function()
167 db.showUI = false
168 kb:Hide()
169 end
170 local CancelButton_OnClick = function()
171 kb.RevertBindings()
172 end
173 local SaveButton_OnClick = function()
174 kb.ConfirmBindings()
175 end
176
177 local KeyBinder_Initialize = function()
178
179
180 kb.scrollOffset = 0
181 kb.tabAnchor = {'TOPLEFT', kb.profilebg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING}
182 kb.tabGrowth = {'TOPLEFT', nil,'TOPRIGHT', BUTTON_SPACING, 0}
183 kb.tabSize = {TAB_HEIGHT, TAB_HEIGHT }
184 kb.UIPanelAnchor = {'TOPLEFT', kb.sourcesbg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING}
185 kb.UIPanelGrowth = {'TOPLEFT', nil, 'BOTTOMLEFT', 0, -2 }
186 kb.UIPanelSize = {84, 32 }
187 kb.UIPanelIcon = {24, 32, 'LEFT', -12, 0}
188 kb.controlsAnchor = {'BOTTOMLEFT', kb.footer, BUTTON_PADDING, BUTTON_PADDING }
189 kb.controlsGrowth = {'BOTTOMLEFT', nil, 'BOTTOMRIGHT', BUTTON_SPACING, 0}
190
191 -- order of these is important
192 kb:tab('KeyBinderGlobalTab',
193 kb.configTitle[BINDING_TYPE_GLOBAL] .. '\n' .. kb.configDescription[BINDING_TYPE_GLOBAL], "Interface\\ICONS\\item_azereansphere", {0.15,.85,.15,.85})
194 kb:tab('KeyBinderCharacterTab',
195 kb.configHeaders[BINDING_TYPE_CHARACTER] .. '\n' .. kb.configDescription[BINDING_TYPE_CHARACTER], nil)
196 kb:tab('KeyBinderSpecTab',
197 kb.configHeaders[BINDING_TYPE_SPECIALIZATION] .. '\n' .. kb.configDescription[BINDING_TYPE_SPECIALIZATION], kb.specInfo.texture)
198 KeyBinderCharacterTab.icon:SetTexCoord(0.15,.85,.15,.85)
199
200
201
202 --portraitLayers[1] = KeyBinderCharacterTab.icon
203
204 saveButton = kb:button('KeyBinderSaveButton', 'Save', 'Commit all changes.', SaveButton_OnClick)
205 --restoreButton = kb:button('KeyBinderRestoreButton', 'Discard', 'Revert all changes.', CancelButton_OnClick)
206 --clearButton = kb:button('KeyBinderClearButton', 'Clear Page', 'Release all buttons.', ResetButton_OnClick)
207
208 kb:uibutton(
209 'KeyBinderSpellBookButton', 'SpellBook', nil,
210 function() ToggleSpellBook(BOOKTYPE_SPELL) end,
211 "Interface\\BUTTONS\\UI-MicroButton-Spellbook-Up", {0, 1, .4, 1})
212 kb:uibutton(
213 'KeyBinderTalentFrameButton', TALENTS, SPECIALIZATION,
214 function() ToggleTalentFrame() end,
215 "Interface\\BUTTONS\\UI-MicroButton-Talents-Up", {0, 1, .4, 1})
216
217 kb:uibutton(
218 'KeyBinderMacroFrameButton', 'Macros', nil,
219 function() if MacroFrame and MacroFrame:IsVisible() then
220 HideUIPanel(MacroFrame)
221 else
222 ShowMacroFrame() end
223 end,
224 "Interface\\BUTTONS\\UI-MicroButton-Help-Up", {0, 1, .4, 1})
225
226 kb:uibutton(
227 'KeyBinderInventoryButton', 'Bags', nil,
228 function() OpenAllBags() end,
229 "Interface\\BUTTONS\\UI-MicroButtonCharacter-Up", {0, 1, .4, 1})
230
231
232
233 kb.info:SetPoint('TOPLEFT', kb.UIPanels[1], 'BOTTOMLEFT', 0, -BUTTON_SPACING)
234 HEADER_OFFSET = kb.UIPanels[1]:GetHeight() + BUTTON_PADDING
235 + kb.info:GetHeight()
236 FOOTER_OFFSET = saveButton:GetHeight() + BUTTON_PADDING
237
238 kb:SetScript('OnHide', KeyBinder_OnHide)
239 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel)
240 kb.CloseButton:SetScript('OnClick', CloseButton_OnClick)
241
242 end
243
244 --- Resets button command
245 kb.ReleaseSlot = function(self)
246 local slot = self:GetID()
247
248
249 if kb.currentProfile.buttons[slot] then
250 kb.currentProfile.buttons[slot] = nil
251 end
252 if self.command then
253 kb.currentProfile.commands[self.command] = nil
254 end
255 if self.actionType == 'spell' and IsTalentSpell(self.actionName) then
256 if kb.currentProfile.talents[self.actionID] then
257 kb.currentProfile.talents[self.actionID] = nil
258 end
259 end
260 local droppedKeys = {}
261
262 -- doing removal in second loop to avoid possible iterator shenanigans
263 for k,v in pairs(kb.currentProfile.bindings) do
264 if v == self.command then
265 tinsert(droppedKeys, k)
266 end
267 end
268 if #droppedKeys >=1 then
269 for i, k in ipairs(droppedKeys) do
270 kb.currentProfile.bindings[k] = nil
271 end
272 end
273
274 self.isAvailable = nil
275 self.isDynamic = nil
276 self.bindingText = nil
277 self.statusText = nil
278 self.command = nil
279 self.actionType = nil
280 self.actionID = nil
281 self.actionName = nil
282 self.pickupSlot = nil
283 self.pickupBook = nil
284 self.macroName = nil
285 self.profile = nil
286 self.icon:SetTexture(nil)
287 self.border:SetColorTexture(unpack(BORDER_UNASSIGNED))
288 self:EnableKeyboard(false)
289 self:SetScript('OnKeyDown', nil)
290 end
291
292 kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook)
293 local slot = self:GetID()
294 local isDynamic, isAvailable
295
296 print('|cFFFFFF00SetSlot|r:', self:GetID())
297 if command then
298
299 if actionType == 'spell' then
300 local professionNum, spellNum = command:match("profession_(%d)_(%d)")
301
302 if (professionNum and spellNum) then
303 isDynamic = 'profession'
304 local cacheInfo = kb.ProfessionCache[professionNum..'_'..spellNum]
305 if cacheInfo then
306 isAvailable = true
307 name = cacheInfo.spellName
308 icon = cacheInfo.icon
309 actionID = cacheInfo.spellID
310 self.profIndex = cacheInfo.profIndex
311 self.spellOffset = cacheInfo.spellOffset
312 end
313 print(' Special slot: |cFF00FFFFProfession|r', professionNum, spellNum, isDynamic, isAvailable)
314
315 self.professionNum = tonumber(professionNum)
316 self.spellNum = tonumber(spellNum)
317
318 else
319 if kb.TalentCache[actionID] then
320 isDynamic = 'talent'
321 print(' Special slot: |cFFBBFF00talent|r', name, isAvailable)
322 end
323
324 isAvailable = GetSpellInfo(name)
325 end
326 actionID = name
327 elseif actionType == 'macro' then
328 if not actionID then
329 actionID = GetMacroIndexByName(name)
330 end
331 isAvailable = true
332 else
333 --- Journal selections
334 -- todo: consider using the deep end of blizzard action bar instead
335 if not actionID then
336 actionID = command:match("^KeyBinderMacro:(.+)")
337 end
338 isAvailable = true
339 end
340
341 if isAvailable then
342 local oldCommand = command
343 macroName, macroText, command = kb.RegisterAction(actionType, actionID)
344 if oldCommand ~= command then
345 print('|cFFFF4400fixing command string', actionType, actionID, name)
346 kb.currentProfile.bound[oldCommand] = nil
347 kb.currentProfile.bound[command] = slot
348 for k,v in pairs(kb.currentProfile.bindings) do
349 if v == oldCommand then
350 kb.currentProfile.bindings[k] = command
351 end
352 end
353 end
354 kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText)
355 end
356
357 if actionType == 'petaction' then
358 self.pickupSlot = pickupSlot
359 self.pickupBook = pickupBook
360 else
361 self.pickupSlot = nil
362 self.pickupBook = nil
363 end
364
365 actionID = actionID or 0
366 self:EnableKeyboard(true)
367 print(' |cFF00FF00kb.currentProfile.buttons['..slot..'] |cFF00FFFF=|r |cFF00FFFF"'.. command.. '"|r |cFF00FF00"'.. name, '"|r |cFFFFFF00icon:'.. icon .. '|r |cFFFF8800"'.. actionType, '"|r |cFFFF0088id:'.. actionID ..'|r |cFF00FF00"'.. macroName .. '"|r')
368 kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook}
369
370 -- Clean up conflicting entries for loaded button
371 local previous = kb.currentProfile.commands[command]
372 if previous ~= slot and kb.buttons[previous] then
373 kb.ReleaseSlot(kb.buttons[previous])
374 end
375 kb.currentProfile.commands[command] = slot
376 end
377
378 self.isAvailable = isAvailable
379 self.isDynamic = isDynamic
380
381 self.macroText = macroText
382 self.macroName = macroName
383 self.actionType = actionType
384 self.actionID = actionID
385 self.actionName = name
386 self.command = command
387 self.icon:SetTexture(icon)
388 self.profile = kb.db.bindMode
389 self:RegisterForDrag('LeftButton')
390 end
391
392 --- Retrieves button at index; creates said button and instates any stored parameters
393 local leftSlot, upSlot
394 local buttonsDepth = 0
395 kb.GetSlot = function(index)
396
397 local slot = index + kb.scrollOffset
398
399 if not kb.buttons[index] then
400 local button = CreateFrame('CheckButton', 'KeyBinderSlot'..index, kb, 'KeyButton')
401 button:SetScript('OnClick', KeyButton_OnClick)
402 button:SetScript('OnUpdate', KeyButton_OnUpdate)
403 button:SetScript('OnDragStart', KeyButton_OnDragStart)
404 button:SetScript('OnReceiveDrag', KeyButton_OnReceiveDrag)
405 button:RegisterForClicks('AnyUp')
406
407
408 local newRow = (mod(index, BINDS_PER_ROW) == 1)
409
410 if index == 1 then
411 button:SetPoint('TOPLEFT', kb.bg, 'TOPLEFT', BUTTON_PADDING, - BUTTON_PADDING)
412 upSlot = button
413 buttonsDepth = KEY_BUTTON_SIZE + BUTTON_PADDING * 2
414 elseif newRow then
415 button:SetPoint('TOPLEFT', upSlot, 'BOTTOMLEFT', 0, -BUTTON_SPACING)
416 upSlot = button
417 buttonsDepth = buttonsDepth + KEY_BUTTON_SIZE + BUTTON_SPACING
418 else
419 button:SetPoint('TOPLEFT', leftSlot, 'TOPRIGHT', BUTTON_HSPACING, 0)
420 end
421
422 button:SetSize(KEY_BUTTON_SIZE, KEY_BUTTON_SIZE)
423 button:Show()
424 kb.buttons[index] = button
425 leftSlot = button
426 end
427 return kb.buttons[index]
428 end
429
430 --- Updates profile assignment and button contents
431 kb.UpdateSlot = function(self, force)
432 local slot = self:GetID()
433
434 if force then
435 if kb.currentProfile.buttons[slot] then
436 kb.SetSlot(self, unpack(kb.currentProfile.buttons[slot]))
437 else
438 kb.ReleaseSlot(self)
439 end
440 end
441
442 if self.command then
443 print('['..slot..'] =', self.command, GetBindingKey(self.command))
444
445 if self.pending then
446 self.border:SetColorTexture(unpack(BORDER_PENDING))
447 elseif self.isDynamic then
448 self.border:SetColorTexture(unpack(BORDER_DYNAMIC))
449 else
450 self.border:SetColorTexture(unpack(BORDER_ASSIGNED))
451 end
452
453 if self.actionType == 'macro' then
454 self.macro:Show()
455 else
456 self.macro:Hide()
457 if self.actionType == 'spell' then
458 local dummy = GetSpellInfo(self.actionName)
459 if not dummy then
460 self.icon:SetDesaturated(true)
461 else
462 self.icon:SetDesaturated(false)
463 end
464
465 end
466 end
467
468 if self.isDynamic then
469 print('|cFFFFBB00UpdateSlot|r: ', self.isDynamic, self.isAvailable, self.actionID)
470 end
471
472 if self.isDynamic == 'profession' then
473 local profText = (self.spellNum == 1) and TRADE_SKILLS or (BUTTON_HEADERS[self.profIndex] or GetProfessionInfo(self.profIndex))
474 if self.isAvailable then
475 print(self.profIndex, 'spnum', type(self.spellNum), (self.spellNum == 1))
476
477 self.statusText = '|cFFFFFF00'..profText..'|r'
478 self.bindingText = kb.BindingString(GetBindingKey(self.command))
479 else
480 self.statusText = '|cFFFF4400'..profText..'|r'
481 self.actionName = '(need to train profession #'..self.profNum..')'
482 self.bindingText ='?'
483 end
484 elseif self.isDynamic == 'talent' then
485
486 self.statusText = '|cFF00FFFF'.. TALENT .. '|r'
487 if self.isAvailable then
488 self.bindingText = kb.BindingString(GetBindingKey(self.command))
489 else
490 if kb.inactiveTalentBindings[self.actionID] then
491 print(self.actionID, #kb.inactiveTalentBindings[self.actionID])
492 self.bindingText= kb.BindingString(unpack(kb.inactiveTalentBindings[self.actionID]))
493 end
494
495 end
496 else
497 self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r'
498 self.bindingText = kb.BindingString(GetBindingKey(self.command))
499 end
500
501 local locked, layer = kb.IsCommandBound(self)
502 if locked then
503 self.icon:SetAlpha(0.5)
504 else
505 self.icon:SetAlpha(1)
506 end
507
508 if self.actionType == 'spell' then
509 self.icon:SetTexture(GetSpellTexture(self.actionID))
510 end
511 end
512
513 if not self.isAvailable then
514 self.bind:SetTextColor(0.7,0.7,0.7,1)
515 else
516 self.bind:SetTextColor(1,1,1,1)
517 end
518
519 self.header:SetText(self.statusText)
520 self.bind:SetText(self.bindingText)
521 self.macro:SetText(self.macroName)
522 self.details:SetText(self.actionName)
523 end
524
525 --- push current information into living UI
526 kb.ui = function(force)
527 for i, module in ipairs(kb.modules) do
528 if module.ui then
529 module.ui(force)
530 end
531 end
532
533 if not kb.db.showUI then
534 print('---end of refresh')
535 return
536 end
537 if not kb.loaded then
538 KeyBinder_Initialize()
539 kb.loaded = true
540 end
541 for i = 1, numButtons do
542 local button = kb.GetSlot(i)
543 button:SetID(i+kb.scrollOffset)
544 kb.UpdateSlot(button, force)
545 end
546
547 if kb.bindsCommitted then
548 KeyBinderSaveButton:Disable()
549 --KeyBinderRestoreButton:Disable()
550 else
551 KeyBinderSaveButton:Enable()
552 --KeyBinderRestoreButton:Enable()
553 end
554
555 --- Frame Sizing
556 kb.profilebg:SetHeight(kb.tabSize[2] + BUTTON_PADDING * 2 + kb.profiletext:GetStringHeight())
557
558 kb.bg:SetWidth((KEY_BUTTON_SIZE + BUTTON_HSPACING + BUTTON_SPACING) * BINDS_PER_ROW + BUTTON_PADDING*2 - BUTTON_SPACING)
559 local numRows = numButtons/BINDS_PER_ROW
560
561 kb.bg:SetHeight((KEY_BUTTON_SIZE + BUTTON_SPACING) * numRows + BUTTON_PADDING*2 - BUTTON_SPACING)
562
563 kb:SetHeight(kb.headerbg:GetHeight() + kb.profilebg:GetHeight() + kb.bg:GetHeight() + kb.footer:GetHeight())
564 kb:SetWidth((kb.sourcesbg:GetWidth() +(BINDS_PER_ROW * (KEY_BUTTON_SIZE + BUTTON_HSPACING) + (BINDS_PER_ROW - 1) * BUTTON_SPACING + BUTTON_PADDING * 2) ))
565
566 kb.bg:SetColorTexture(unpack(BINDING_SCHEME_COLOR[kb.db.bindMode]))
567 for i, tab in ipairs(kb.tabButtons) do
568 local border = tab:GetNormalTexture()
569 local tabTexture = "Interface\\Buttons\\UI-Quickslot2"
570 local left, top, right, bottom = -12, 12, 13, -13
571 if i == kb.db.bindMode then
572 tabTexture = "Interface\\Buttons\\CheckButtonGlow"
573 left, top, right, bottom = -14, 14, 15, -15
574 tab.icon:SetDesaturated(false)
575 if tab.icon2 then tab.icon2:SetDesaturated(false) end
576 border:SetDesaturated(true)
577 border:SetVertexColor(1,1,1, 1)
578 else
579 tab.icon:SetDesaturated(true)
580 if tab.icon2 then tab.icon2:SetDesaturated(true) end
581 border:SetDesaturated(false)
582 border:SetVertexColor(1,1,1)
583 end
584 border:SetTexture(tabTexture)
585 border:SetPoint('TOPLEFT', tab, 'TOPLEFT', left, top)
586 border:SetPoint('BOTTOMRIGHT', tab, 'BOTTOMRIGHT', right, bottom)
587 end
588
589 KeyBinderSpecTab.icon:SetTexture(kb.specInfo.texture)
590
591 kb.profiletext:SetText(kb.configHeaders[kb.db.bindMode])
592 print(kb.db.bindMode, kb.configHeaders[kb.db.bindMode], kb:GetSize())
593 print(kb:GetPoint(1))
594
595 kb:Show()
596
597 -- Reset this so talent cache can be rebuilt
598 kb.talentsPushed = nil
599 end
600
601 kb.AcceptAssignment = function(self, ...)
602 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"]
603 local source = loadedProfiles[popup.oldProfile]
604 kb.SetSlot(popup.slot, unpack(popup.args))
605 kb.UpdateSlot(popup.slot)
606 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) -- re-enable scrolling
607 ClearCursor()
608 ResetCursor()
609 end
610
611
612 --- Add to blizzard interfaces
613 StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] = {
614 text = "Confirm moving an assigned command.",
615 button1 = OKAY,
616 button2 = CANCEL,
617 timeout = 0,
618 whileDead = 1,
619 showAlert = 1,
620 OnAccept = kb.AcceptAssignment,
621 OnCancel = function() kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) end
622 }