annotate SkeletonKey/KeyButton.lua @ 30:b0e4d04d428a

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