annotate SkeletonKey/KeyButton.lua @ 42:c77b355a0366

Added tag v7.0.3-10-release for changeset 0877063fd03b
author Nenue
date Tue, 16 Aug 2016 11:34:46 -0400
parents daff39af0c6d
children 9a9d7f2a7c07
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@34 360
Nenue@14 361 if self.command then
Nenue@14 362 print('['..slot..'] =', self.command, GetBindingKey(self.command))
Nenue@14 363
Nenue@15 364 if not self.isAvailable then
Nenue@15 365 self.border:SetColorTexture(1,0,0,1)
Nenue@15 366 self.ignoreTexture:Show()
Nenue@14 367 else
Nenue@15 368 self.ignoreTexture:Hide()
Nenue@15 369
Nenue@15 370 if self.pending then
Nenue@15 371 self.border:SetColorTexture(unpack(BORDER_PENDING))
Nenue@15 372 elseif self.isDynamic then
Nenue@15 373 self.border:SetColorTexture(unpack(BORDER_DYNAMIC))
Nenue@15 374 else
Nenue@15 375 self.border:SetColorTexture(unpack(BORDER_ASSIGNED))
Nenue@15 376 end
Nenue@14 377 end
Nenue@14 378
Nenue@15 379
Nenue@14 380 if self.actionType == 'macro' then
Nenue@14 381 self.macro:Show()
Nenue@14 382 else
Nenue@14 383 self.macro:Hide()
Nenue@14 384 if self.actionType == 'spell' then
Nenue@14 385 local dummy = GetSpellInfo(self.actionName)
Nenue@14 386 if not dummy then
Nenue@14 387 self.icon:SetDesaturated(true)
Nenue@14 388 else
Nenue@14 389 self.icon:SetDesaturated(false)
Nenue@14 390 end
Nenue@14 391
Nenue@14 392 end
Nenue@14 393 end
Nenue@14 394
Nenue@14 395 if self.isDynamic then
Nenue@15 396 print('|cFF00BBFFUpdateSlot|r:', self.isDynamic, self.isAvailable, self.actionID)
Nenue@14 397 end
Nenue@14 398
Nenue@14 399 if self.isDynamic == 'profession' then
Nenue@30 400 if self.profIndex then
Nenue@29 401
Nenue@29 402 local profText = (self.spellNum == 1) and TRADE_SKILLS or (BUTTON_HEADERS[self.profIndex] or GetProfessionInfo(self.profIndex))
Nenue@14 403 print(self.profIndex, 'spnum', type(self.spellNum), (self.spellNum == 1))
Nenue@14 404
Nenue@29 405 self.statusText = '|cFFFFFF00'..tostring(profText)..'|r'
Nenue@14 406 self.bindingText = kb.BindingString(GetBindingKey(self.command))
Nenue@14 407 else
Nenue@29 408
Nenue@30 409 self.statusText = '|cFFFF4400'..PROFESSION_HEADERS[self.professionNum]..'|r'
Nenue@29 410 self.actionName = '(#'..self.professionNum..')'
Nenue@14 411 self.bindingText ='?'
Nenue@14 412 end
Nenue@14 413 elseif self.isDynamic == 'talent' then
Nenue@14 414
Nenue@14 415 self.statusText = '|cFF00FFFF'.. TALENT .. '|r'
Nenue@14 416 if self.isAvailable then
Nenue@14 417 self.bindingText = kb.BindingString(GetBindingKey(self.command))
Nenue@14 418 else
Nenue@19 419 if kb.TalentBindings[self.actionID] then
Nenue@19 420 print(self.actionID, #kb.TalentBindings[self.actionID])
Nenue@19 421 self.bindingText= kb.BindingString(unpack(kb.TalentBindings[self.actionID]))
Nenue@14 422 end
Nenue@14 423
Nenue@14 424 end
Nenue@19 425 elseif self.isDynamic == 'petaction' then
Nenue@21 426 local specialType, specialNum = self.command:match("petaction_([%a%s]+)_(%d)")
Nenue@21 427 if specialType and specialNum then
Nenue@21 428 print('pet skill|cFF00FF00', specialType..'|r', specialNum)
Nenue@21 429 self.statusText = L(specialType..' %%d'):format(specialNum)
Nenue@19 430 else
Nenue@19 431 self.statusText = L('Pet Action')
Nenue@19 432 end
Nenue@15 433 self.bindingText = kb.BindingString(GetBindingKey(self.command))
Nenue@14 434 else
Nenue@14 435 self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r'
Nenue@14 436 self.bindingText = kb.BindingString(GetBindingKey(self.command))
Nenue@14 437 end
Nenue@14 438
Nenue@14 439 local locked, layer = kb.IsCommandBound(self)
Nenue@14 440 if locked then
Nenue@14 441 self.icon:SetAlpha(0.5)
Nenue@14 442 else
Nenue@14 443 self.icon:SetAlpha(1)
Nenue@14 444 end
Nenue@14 445
Nenue@17 446
Nenue@14 447 if self.actionType == 'spell' then
Nenue@14 448 self.icon:SetTexture(GetSpellTexture(self.actionID))
Nenue@14 449 end
Nenue@21 450 else
Nenue@34 451 if kb.saveTarget == self then
Nenue@34 452 kb.DeactivateSlot(self)
Nenue@34 453 end
Nenue@34 454
Nenue@21 455 self.ignoreTexture:Hide()
Nenue@14 456 end
Nenue@14 457
Nenue@14 458 if not self.isAvailable then
Nenue@14 459 self.bind:SetTextColor(0.7,0.7,0.7,1)
Nenue@14 460 else
Nenue@14 461 self.bind:SetTextColor(1,1,1,1)
Nenue@14 462 end
Nenue@14 463
Nenue@17 464
Nenue@17 465 if kb.saveTarget and kb.saveTarget ~= self then
Nenue@17 466 self:SetAlpha(0.25)
Nenue@17 467 else
Nenue@17 468
Nenue@17 469 self:SetAlpha(1)
Nenue@17 470 end
Nenue@17 471
Nenue@17 472
Nenue@14 473 self.header:SetText(self.statusText)
Nenue@14 474 self.bind:SetText(self.bindingText)
Nenue@14 475 self.details:SetText(self.actionName)
Nenue@14 476 end
Nenue@14 477
Nenue@14 478 --- Resets button command
Nenue@14 479 kb.ReleaseSlot = function(self)
Nenue@14 480 local slot = self:GetID()
Nenue@14 481
Nenue@14 482
Nenue@14 483 if kb.currentProfile.buttons[slot] then
Nenue@14 484 kb.currentProfile.buttons[slot] = nil
Nenue@14 485 end
Nenue@14 486 if self.command then
Nenue@14 487 kb.currentProfile.commands[self.command] = nil
Nenue@14 488 end
Nenue@14 489 if self.actionType == 'spell' and IsTalentSpell(self.actionName) then
Nenue@14 490 if kb.currentProfile.talents[self.actionID] then
Nenue@14 491 kb.currentProfile.talents[self.actionID] = nil
Nenue@14 492 end
Nenue@14 493 end
Nenue@14 494 local droppedKeys = {}
Nenue@14 495
Nenue@14 496 -- doing removal in second loop to avoid possible iterator shenanigans
Nenue@14 497 for k,v in pairs(kb.currentProfile.bindings) do
Nenue@14 498 if v == self.command then
Nenue@14 499 tinsert(droppedKeys, k)
Nenue@14 500 end
Nenue@14 501 end
Nenue@14 502 if #droppedKeys >=1 then
Nenue@14 503 for i, k in ipairs(droppedKeys) do
Nenue@14 504 kb.currentProfile.bindings[k] = nil
Nenue@14 505 end
Nenue@14 506 end
Nenue@14 507
Nenue@14 508 self.isAvailable = nil
Nenue@14 509 self.isDynamic = nil
Nenue@14 510 self.bindingText = nil
Nenue@14 511 self.statusText = nil
Nenue@14 512 self.command = nil
Nenue@14 513 self.actionType = nil
Nenue@14 514 self.actionID = nil
Nenue@14 515 self.actionName = nil
Nenue@14 516 self.pickupSlot = nil
Nenue@14 517 self.pickupBook = nil
Nenue@14 518 self.macroName = nil
Nenue@14 519 self.profile = nil
Nenue@14 520 self.icon:SetTexture(nil)
Nenue@14 521 self.border:SetColorTexture(unpack(BORDER_UNASSIGNED))
Nenue@14 522 self:EnableKeyboard(false)
Nenue@14 523 self:SetScript('OnKeyDown', nil)
Nenue@15 524 self.ignoreTexture:Hide()
Nenue@14 525 end
Nenue@14 526
Nenue@14 527 kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook)
Nenue@14 528 local slot = self:GetID()
Nenue@14 529 local isDynamic, isAvailable
Nenue@14 530
Nenue@14 531 print('|cFFFFFF00SetSlot|r:', self:GetID())
Nenue@14 532 if command then
Nenue@14 533
Nenue@14 534 if actionType == 'spell' then
Nenue@14 535 local professionNum, spellNum = command:match("profession_(%d)_(%d)")
Nenue@14 536 if (professionNum and spellNum) then
Nenue@14 537 isDynamic = 'profession'
Nenue@14 538 local cacheInfo = kb.ProfessionCache[professionNum..'_'..spellNum]
Nenue@14 539 if cacheInfo then
Nenue@14 540 isAvailable = true
Nenue@14 541 name = cacheInfo.spellName
Nenue@14 542 icon = cacheInfo.icon
Nenue@14 543 actionID = cacheInfo.spellID
Nenue@14 544 self.profIndex = cacheInfo.profIndex
Nenue@14 545 self.spellOffset = cacheInfo.spellOffset
Nenue@30 546 else
Nenue@30 547 print(professionNum, type(professionNum), PROFESSION_HEADERS[tonumber(professionNum)])
Nenue@30 548 local profID = PROFESSION_HEADERS[tonumber(professionNum)]
Nenue@30 549 if type(profID) == 'number' then
Nenue@30 550 local pname, texture, _, _, numSpells, spellOffset = GetProfessionInfo(profID)
Nenue@30 551 self.profIndex = profID
Nenue@30 552 else
Nenue@30 553 name = profID
Nenue@30 554 end
Nenue@30 555
Nenue@14 556 end
Nenue@14 557 print(' Special slot: |cFF00FFFFProfession|r', professionNum, spellNum, isDynamic, isAvailable)
Nenue@14 558
Nenue@14 559 self.professionNum = tonumber(professionNum)
Nenue@14 560 self.spellNum = tonumber(spellNum)
Nenue@14 561
Nenue@14 562 else
Nenue@14 563 if kb.TalentCache[actionID] then
Nenue@14 564 isDynamic = 'talent'
Nenue@14 565 print(' Special slot: |cFFBBFF00talent|r', name, isAvailable)
Nenue@14 566 end
Nenue@14 567
Nenue@14 568 isAvailable = GetSpellInfo(name)
Nenue@14 569 end
Nenue@15 570 elseif actionType == 'petaction' then
Nenue@15 571 isDynamic = 'petaction'
Nenue@21 572 local specialType, specialNum = command:match(actionType..'_([%a%s]+)_(%d)')
Nenue@21 573
Nenue@21 574 if kb.PetCache.subtext[specialType] and kb.PetCache.subtext[specialType][tonumber(specialNum)] then
Nenue@30 575 print('***dynamic pet skill', specialType, specialNum)
Nenue@21 576 --[[ i, spellName, subText, spellID, texture, specialNum[subText ]]
Nenue@21 577 pickupSlot, name, specialType, actionID, icon, specialNum = unpack(kb.PetCache.subtext[specialType][tonumber(specialNum)])
Nenue@21 578 pickupBook = BOOKTYPE_PET
Nenue@21 579 end
Nenue@21 580
Nenue@22 581 isAvailable = (kb.PetCache.spellslot[name])
Nenue@22 582
Nenue@21 583
Nenue@14 584 elseif actionType == 'macro' then
Nenue@14 585 if not actionID then
Nenue@14 586 actionID = GetMacroIndexByName(name)
Nenue@14 587 end
Nenue@14 588 isAvailable = true
Nenue@14 589 else
Nenue@14 590 --- Journal selections
Nenue@14 591 -- todo: consider using the deep end of blizzard action bar instead
Nenue@14 592 if not actionID then
Nenue@14 593 actionID = command:match("^KeyBinderMacro:(.+)")
Nenue@14 594 end
Nenue@14 595 isAvailable = true
Nenue@14 596 end
Nenue@14 597
Nenue@14 598 if isAvailable then
Nenue@14 599 local oldCommand = command
Nenue@14 600 macroName, macroText, command = kb.RegisterAction(actionType, actionID, name)
Nenue@14 601 if oldCommand ~= command then
Nenue@14 602 print('|cFFFF4400fixing command string', actionType, actionID, name)
Nenue@14 603 kb.currentProfile.bound[oldCommand] = nil
Nenue@14 604 kb.currentProfile.bound[command] = slot
Nenue@14 605 for k,v in pairs(kb.currentProfile.bindings) do
Nenue@14 606 if v == oldCommand then
Nenue@14 607 kb.currentProfile.bindings[k] = command
Nenue@14 608 end
Nenue@14 609 end
Nenue@14 610 end
Nenue@14 611 kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText)
Nenue@14 612 end
Nenue@14 613
Nenue@14 614
Nenue@14 615 actionID = actionID or 0
Nenue@14 616 self:EnableKeyboard(true)
Nenue@17 617 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 618 kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook }
Nenue@19 619
Nenue@14 620
Nenue@14 621 -- Clean up conflicting entries for loaded button
Nenue@14 622 local previous = kb.currentProfile.commands[command]
Nenue@14 623 if previous ~= slot and kb.buttons[previous] then
Nenue@14 624 kb.ReleaseSlot(kb.buttons[previous])
Nenue@14 625 end
Nenue@19 626
Nenue@19 627 if not (kb.IsCommandBound(self, command) or kb.currentProfile.bound[command]) then
Nenue@19 628
Nenue@19 629 local binds = {GetBindingKey(command) }
Nenue@19 630 if #binds >= 1 then
Nenue@19 631 kb:print('Recovered key binding for', name)
Nenue@19 632 for i, key in ipairs(binds) do
Nenue@19 633 kb.currentProfile.bindings[key] = command
Nenue@19 634 kb.currentProfile.bound[command] = true
Nenue@19 635 end
Nenue@19 636 end
Nenue@19 637 end
Nenue@19 638
Nenue@19 639
Nenue@14 640 kb.currentProfile.commands[command] = slot
Nenue@19 641
Nenue@14 642 end
Nenue@14 643
Nenue@14 644 self.isAvailable = isAvailable
Nenue@14 645 self.isDynamic = isDynamic
Nenue@14 646
Nenue@15 647 self.pickupSlot = pickupSlot
Nenue@15 648 self.pickupBook = pickupBook
Nenue@14 649 self.macroText = macroText
Nenue@14 650 self.macroName = macroName
Nenue@14 651 self.actionType = actionType
Nenue@14 652 self.actionID = actionID
Nenue@14 653 self.actionName = name
Nenue@14 654 self.command = command
Nenue@14 655 self.icon:SetTexture(icon)
Nenue@14 656 self.profile = kb.db.bindMode
Nenue@14 657 self:RegisterForDrag('LeftButton')
Nenue@14 658 end
Nenue@14 659
Nenue@27 660 kb.GetCommandAction = function(command)
Nenue@27 661 for i, data in ipairs(kb.loadedProfiles) do
Nenue@27 662 if data.commands[command] then
Nenue@27 663 if data.buttons[data.commands[command]] then
Nenue@27 664 local _, _, _, actionType, actionID = unpack(data.buttons[data.commands[command]])
Nenue@27 665 return actionType, actionID
Nenue@27 666 end
Nenue@27 667 end
Nenue@27 668 end
Nenue@27 669 end
Nenue@16 670
Nenue@14 671
Nenue@14 672 --- Add to blizzard interfaces
Nenue@14 673 StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] = {
Nenue@14 674 text = "Confirm moving an assigned command.",
Nenue@14 675 button1 = OKAY,
Nenue@14 676 button2 = CANCEL,
Nenue@14 677 timeout = 0,
Nenue@14 678 whileDead = 1,
Nenue@14 679 showAlert = 1,
Nenue@14 680 OnAccept = kb.AcceptAssignment,
Nenue@14 681 OnCancel = function() kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) end
Nenue@14 682 }