annotate BindingsFrame.lua @ 70:131d9190db6b

Curseforge migration
author Nenue
date Wed, 28 Dec 2016 16:31:15 -0500
parents
children ca3118127e5e
rev   line source
Nenue@70 1 -- KrakTool
Nenue@70 2 -- BindingsFrame.lua
Nenue@70 3 -- Created: 7/28/2016 3:39 PM
Nenue@70 4 -- %file-revision%
Nenue@70 5 -- Handles the arrangement of and interaction with the SkeletonKey frame
Nenue@70 6 --[=[
Nenue@70 7 -- some useful texture paths
Nenue@70 8 [[Interface\PaperDollInfoFrame\UI-GearManager-Undo]]
Nenue@70 9 [[Interface\PetPaperDollFrame\UI-PetHappiness]]
Nenue@70 10 [[Interface\RAIDFRAME\ReadyCheck-Waiting]]
Nenue@70 11 [[Interface\RAIDFRAME\ReadyCheck-Read]]
Nenue@70 12 [[Interface\RAIDFRAME\ReadyCheck-NotReady]]
Nenue@70 13 [[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]]
Nenue@70 14 [[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]]
Nenue@70 15 [[Interface\UI-TutorialFrame-QuestGiver\UI-TutorialFrame-QuestGray]]
Nenue@70 16 --]=]
Nenue@70 17
Nenue@70 18 SkeletonKeyButtonMixin = {}
Nenue@70 19 local _, kb = ...
Nenue@70 20 local print = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('SK', ...) end or nop
Nenue@70 21 local L = kb.L
Nenue@70 22 local BINDS_PER_ROW = 2
Nenue@70 23 local BINDING_TYPE_SPECIALIZATION = 3
Nenue@70 24 local BINDING_TYPE_CHARACTER = 2
Nenue@70 25 local BINDING_TYPE_GLOBAL = 1
Nenue@70 26 local BUTTON_HSPACING = 128
Nenue@70 27 local BUTTON_SPACING = 4
Nenue@70 28 local BUTTON_PADDING = 12
Nenue@70 29 local TAB_HEIGHT = 24
Nenue@70 30 local KEY_BUTTON_SIZE = 48
Nenue@70 31 local NUM_KEY_SLOTS = BINDS_PER_ROW * 8
Nenue@70 32 local TAB_HEIGHT = 40
Nenue@70 33 local BG_INSET = 4
Nenue@70 34
Nenue@70 35 local BINDING_SCHEME_COLOR = {
Nenue@70 36 [BINDING_TYPE_GLOBAL] = {0,.125,.5,.8},
Nenue@70 37 [BINDING_TYPE_CHARACTER] = {0,0.25,0,0.8},
Nenue@70 38 [BINDING_TYPE_SPECIALIZATION] = {.25,0,0,0.8},
Nenue@70 39 }
Nenue@70 40 local BINDING_SCHEME_VERTEX = {
Nenue@70 41 [BINDING_TYPE_GLOBAL] = {0,.5,1,1},
Nenue@70 42 [BINDING_TYPE_CHARACTER] = {0,1,0,1},
Nenue@70 43 [BINDING_TYPE_SPECIALIZATION] = {1,1,1,1},
Nenue@70 44 }
Nenue@70 45 local BINDING_SCHEME_TEXT = {
Nenue@70 46 [BINDING_TYPE_SPECIALIZATION] = {0, 1, 1},
Nenue@70 47 [BINDING_TYPE_CHARACTER] = {0, 1, 0},
Nenue@70 48 [BINDING_TYPE_GLOBAL] = {0, 1, 1}
Nenue@70 49 }
Nenue@70 50
Nenue@70 51 local match, strupper = string.match, string.upper
Nenue@70 52 local tremove, tinsert, ipairs, pairs, unpack = table.remove, table.insert, ipairs, pairs, unpack
Nenue@70 53 local tonumber, tostring = tonumber, tostring
Nenue@70 54 local GetCursorInfo, ClearCursor, ResetCursor = GetCursorInfo, ClearCursor, ResetCursor
Nenue@70 55 local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
Nenue@70 56 local GetBindingAction, GetBindingKey, GetCurrentBindingSet = GetBindingAction, GetBindingKey, GetCurrentBindingSet
Nenue@70 57 local SetBinding, SaveBindings = SetBinding, SaveBindings
Nenue@70 58 local GetSpellInfo, InCombatLockdown = GetSpellInfo, InCombatLockdown
Nenue@70 59
Nenue@70 60
Nenue@70 61 local ActionListPanel = {
Nenue@70 62 tabButtons = {
Nenue@70 63 [BINDING_TYPE_GLOBAL] = {
Nenue@70 64 icon = "Interface\\WORLDMAP\\WorldMap-Icon",
Nenue@70 65 label = "Global",
Nenue@70 66 },
Nenue@70 67 [BINDING_TYPE_CHARACTER] ={
Nenue@70 68 func = function(self, index)
Nenue@70 69 SetPortraitTexture(self.Icon, 'player')
Nenue@70 70 self.Label:SetText(kb.configHeaders[index])
Nenue@70 71 self.tooltipText = kb.configHeaders[index]
Nenue@70 72 end
Nenue@70 73 },
Nenue@70 74 [BINDING_TYPE_SPECIALIZATION] = {
Nenue@70 75 func = function(self, index)
Nenue@70 76 self.Icon:SetTexture(kb.specInfo.texture)
Nenue@70 77 self.Label:SetText(kb.configHeaders[index])
Nenue@70 78 self.tooltipText = kb.configHeaders[index]
Nenue@70 79 end
Nenue@70 80 },
Nenue@70 81 }
Nenue@70 82 }
Nenue@70 83 local SystemBindingsPanel = {
Nenue@70 84 tabButtons = {
Nenue@70 85 {label = "Global"},
Nenue@70 86 {label = "Character"}
Nenue@70 87 }
Nenue@70 88 }
Nenue@70 89 function SkeletonKeyMixin:ProcessInput (key)
Nenue@70 90 if self.currentPanel then
Nenue@70 91 if self.currentPanel:OnInput(key) then
Nenue@70 92 self:Update(true)
Nenue@70 93 end
Nenue@70 94 end
Nenue@70 95 end
Nenue@70 96
Nenue@70 97 local lastFolder
Nenue@70 98 local restingAlpha = 0.7
Nenue@70 99 local fadeTime, fadeDelay = .30, 0.15
Nenue@70 100 local saveButton
Nenue@70 101
Nenue@70 102
Nenue@70 103
Nenue@70 104 local frameCount = 0
Nenue@70 105 local lastCheckFrame
Nenue@70 106 local KeyBinder_CheckButton = function(frame ,enableText, disableText, dbKey, tooltipText, callback, header)
Nenue@70 107 if kb.db[dbKey] then
Nenue@70 108 frame:SetChecked(true)
Nenue@70 109 end
Nenue@70 110
Nenue@70 111 frame.header:SetText(header)
Nenue@70 112
Nenue@70 113 frame:SetScript('OnClick', function(self)
Nenue@70 114 kb.db[dbKey] = self:GetChecked()
Nenue@70 115 if callback then
Nenue@70 116 callback(self)
Nenue@70 117 end
Nenue@70 118 kb.ui()
Nenue@70 119 end)
Nenue@70 120
Nenue@70 121 frame:SetScript('OnEnter', function(self)
Nenue@70 122 if tooltipText then
Nenue@70 123 GameTooltip:SetOwner(self)
Nenue@70 124 GameTooltip:SetText(tooltipText)
Nenue@70 125 GameTooltip:Show()
Nenue@70 126 end
Nenue@70 127 end)
Nenue@70 128
Nenue@70 129 frame:SetScript('OnLeave', function(self)
Nenue@70 130 if tooltipText and GameTooltip:GetOwner() == self then
Nenue@70 131 GameTooltip:Hide()
Nenue@70 132 end
Nenue@70 133 end)
Nenue@70 134
Nenue@70 135 if frame:GetID() == 0 then
Nenue@70 136 frameCount = frameCount + 1
Nenue@70 137 frame:SetID(frameCount)
Nenue@70 138 print('checkbutton #', frameCount)
Nenue@70 139 if frameCount == 1 then
Nenue@70 140 frame:ClearAllPoints()
Nenue@70 141 frame:SetPoint('TOP', KeyBinderInventoryButton, 'BOTTOM', 0, -22)
Nenue@70 142 frame:SetPoint('LEFT', SkeletonKey 'LEFT', 2, 0)
Nenue@70 143 else
Nenue@70 144 frame:ClearAllPoints()
Nenue@70 145 frame:SetPoint('TOPLEFT', lastCheckFrame, 'BOTTOMLEFT', 0, -2)
Nenue@70 146 end
Nenue@70 147
Nenue@70 148 frame.header:ClearAllPoints()
Nenue@70 149 frame.header:SetPoint('LEFT', frame, 'RIGHT', 2, 0)
Nenue@70 150
Nenue@70 151 lastCheckFrame = frame
Nenue@70 152 end
Nenue@70 153 end
Nenue@70 154
Nenue@70 155
Nenue@70 156
Nenue@70 157 function SkeletonKeyMixin:OnMouseWheel(delta)
Nenue@70 158
Nenue@70 159 -- let the updaters handle range
Nenue@70 160 if IsControlKeyDown() then
Nenue@70 161 self.zoomScale = self.zoomScale - (delta/10)
Nenue@70 162 else
Nenue@70 163 self.scrollOffset = ceil(self.scrollOffset - delta)
Nenue@70 164 end
Nenue@70 165
Nenue@70 166 self:Update(true)
Nenue@70 167 print(self.zoomScale, self.scrollOffset)
Nenue@70 168 end
Nenue@70 169
Nenue@70 170 function SkeletonKeyMixin:OnHide()
Nenue@70 171 KeyBinderImportLog:Hide()
Nenue@70 172 end
Nenue@70 173
Nenue@70 174
Nenue@70 175 local tabID = 0
Nenue@70 176 local prevTab
Nenue@70 177
Nenue@70 178 function SkeletonKeyMixin:SetupTabButton (index, text, icon, func)
Nenue@70 179 print('|cFF00FFFF'..self:GetName()..':SetupTabButton()', index, text, icon, func)
Nenue@70 180 local tabName = 'SkeletonKeyProfileTab'..index
Nenue@70 181 local tab = _G[tabName]
Nenue@70 182
Nenue@70 183 if not tab then
Nenue@70 184 tab = CreateFrame('Button', tabName, self, 'SkeletonKeyTabTemplate')
Nenue@70 185 self.numTabs = self.numTabs + 1
Nenue@70 186 tab:SetID(self.numTabs)
Nenue@70 187 TAB_HEIGHT = tab:GetHeight()
Nenue@70 188
Nenue@70 189 if self.numTabs == 1 then
Nenue@70 190 tab:SetPoint('TOPLEFT', self.profilebg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING)
Nenue@70 191 else
Nenue@70 192 tab:SetPoint('TOPLEFT', self.lastTab,'TOPRIGHT', BUTTON_SPACING, 0)
Nenue@70 193 end
Nenue@70 194
Nenue@70 195 tab.tooltipText = text
Nenue@70 196 tab:SetScript('OnEnter', function(button)
Nenue@70 197 if button.tooltipText then
Nenue@70 198 GameTooltip:SetOwner(button)
Nenue@70 199 GameTooltip:SetText(button.tooltipText)
Nenue@70 200 GameTooltip:Show()
Nenue@70 201 end
Nenue@70 202 end)
Nenue@70 203
Nenue@70 204 tab:SetScript('OnLeave', function(button)
Nenue@70 205 if GameTooltip:IsOwned(button) then
Nenue@70 206 GameTooltip:Hide()
Nenue@70 207 end
Nenue@70 208 end)
Nenue@70 209
Nenue@70 210 tab:SetScript('OnClick', function(button)
Nenue@70 211 self.selectedTabIndex = button:GetID()
Nenue@70 212 self:Update(true)
Nenue@70 213 end)
Nenue@70 214 self.lastTab = tab
Nenue@70 215 end
Nenue@70 216 if text then
Nenue@70 217
Nenue@70 218 tab.Label:SetText(text)
Nenue@70 219 end
Nenue@70 220
Nenue@70 221 if icon then
Nenue@70 222 tab.Icon:SetTexture(icon)
Nenue@70 223 end
Nenue@70 224 if func then
Nenue@70 225 func(tab, index, text)
Nenue@70 226 end
Nenue@70 227
Nenue@70 228 local selected = (index == self.selectedTabIndex)
Nenue@70 229 if selected then
Nenue@70 230 tab.Icon:SetDesaturated(false)
Nenue@70 231 tab.Label:SetTextColor(0,1,0, 1)
Nenue@70 232 else
Nenue@70 233
Nenue@70 234 tab.Icon:SetDesaturated(true)
Nenue@70 235 tab.Label:SetTextColor(1,1,1,0.7)
Nenue@70 236 end
Nenue@70 237
Nenue@70 238 tab.used = true
Nenue@70 239
Nenue@70 240 tab:SetSize(tab.Icon:GetWidth()+tab.Label:GetStringWidth()+3, tab.Icon:GetHeight())
Nenue@70 241 tab:Show()
Nenue@70 242 print(tab:GetPoint(1))
Nenue@70 243 print(tab:GetSize())
Nenue@70 244
Nenue@70 245 return tab
Nenue@70 246 end
Nenue@70 247
Nenue@70 248
Nenue@70 249
Nenue@70 250 --- push current information into living UI
Nenue@70 251 function SkeletonKeyMixin:Update(force)
Nenue@70 252 print('|cFFFF8800'..self:GetName()..':Update()|r', InCombatLockdown() and 'combat', self:IsShown())
Nenue@70 253 for index, frame in ipairs(self.Plugins) do
Nenue@70 254 if frame.Update then
Nenue@70 255 frame:Update(force)
Nenue@70 256 end
Nenue@70 257 end
Nenue@70 258
Nenue@70 259 self.currentPanel = self.currentPanel or self.Panels[1]
Nenue@70 260 if InCombatLockdown() or not self:IsShown() then
Nenue@70 261 return
Nenue@70 262 end
Nenue@70 263
Nenue@70 264 self.numTabs = 0
Nenue@70 265 for index, tab in ipairs(self.tabButtons) do
Nenue@70 266 tab.used = nil
Nenue@70 267 tab:Hide()
Nenue@70 268 end
Nenue@70 269
Nenue@70 270 for index, panel in ipairs(self.Panels) do
Nenue@70 271 print(panel:GetName())
Nenue@70 272 if panel == self.currentPanel then
Nenue@70 273 print('Updating panel:', panel:GetName())
Nenue@70 274 panel:SetAllPoints(self.bg)
Nenue@70 275 self.selectedTabIndex, self.scrollOffset = panel:Update(force)
Nenue@70 276 panel:Show()
Nenue@70 277
Nenue@70 278 for tabIndex, info in ipairs(panel.tabButtons) do
Nenue@70 279 self:SetupTabButton(tabIndex, info.label, info.icon, info.func)
Nenue@70 280 end
Nenue@70 281
Nenue@70 282 else
Nenue@70 283 panel:Hide()
Nenue@70 284 end
Nenue@70 285 end
Nenue@70 286
Nenue@70 287
Nenue@70 288
Nenue@70 289 --- Frame Sizing
Nenue@70 290 self.profilebg:SetHeight(TAB_HEIGHT + BUTTON_PADDING * 2 + self.profiletext:GetStringHeight())
Nenue@70 291
Nenue@70 292 self.bg:SetWidth((KEY_BUTTON_SIZE + BUTTON_HSPACING + BUTTON_SPACING) * BINDS_PER_ROW + BUTTON_PADDING*2 - BUTTON_SPACING - BG_INSET*2)
Nenue@70 293 local numRows = NUM_KEY_SLOTS/BINDS_PER_ROW
Nenue@70 294
Nenue@70 295 self.bg:SetHeight((KEY_BUTTON_SIZE + BUTTON_SPACING) * numRows + BUTTON_PADDING*2 - BUTTON_SPACING - BG_INSET*2)
Nenue@70 296
Nenue@70 297
Nenue@70 298 self:SetHeight(self.headerbg:GetHeight() + self.profilebg:GetHeight() + self.bg:GetHeight() + self.footer:GetHeight()+BG_INSET*2)
Nenue@70 299 self:SetWidth(((BINDS_PER_ROW * (KEY_BUTTON_SIZE + BUTTON_HSPACING) + (BINDS_PER_ROW - 1) * BUTTON_SPACING + BUTTON_PADDING * 2) ))
Nenue@70 300
Nenue@70 301
Nenue@70 302 self.backdrop.insets.left = BG_INSET
Nenue@70 303 self.backdrop.insets.right = BG_INSET
Nenue@70 304 self.backdrop.insets.top = BG_INSET
Nenue@70 305 self.backdrop.insets.bottom = BG_INSET
Nenue@70 306 self:SetBackdrop(self.backdrop)
Nenue@70 307 self:SetBackdropColor(unpack(self.backdropColor))
Nenue@70 308 self:SetBackdropBorderColor(unpack(self.backdropBorder))
Nenue@70 309
Nenue@70 310 self:SetScale(self.zoomScale)
Nenue@70 311
Nenue@70 312 self.profiletext:SetText(kb.configHeaders[kb.db.bindMode])
Nenue@70 313 print(kb.db.bindMode, kb.configHeaders[kb.db.bindMode], self:GetSize())
Nenue@70 314 print(self:GetPoint(1))
Nenue@70 315
Nenue@70 316
Nenue@70 317 self:EnableKeyboard((kb.saveTarget and true) or false)
Nenue@70 318 print('keyboard input:', (kb.saveTarget and true) or false)
Nenue@70 319
Nenue@70 320 -- Reset this so talent cache can be rebuilt
Nenue@70 321 kb.talentsPushed = nil
Nenue@70 322 end
Nenue@70 323
Nenue@70 324 local SkeletonKeyPanel = {}
Nenue@70 325 function SkeletonKeyPanel:OnShow()
Nenue@70 326 print('|cFFFFFF00'..self:GetName()..':OnShow()|r')
Nenue@70 327 end
Nenue@70 328
Nenue@70 329 function ActionListPanel:OnLoad()
Nenue@70 330
Nenue@70 331
Nenue@70 332 self.UnbindButton:SetScript('OnClick', function()
Nenue@70 333 self:UnbindSlot(kb.saveTarget)
Nenue@70 334 SkeletonKey:Update()
Nenue@70 335 end)
Nenue@70 336 end
Nenue@70 337
Nenue@70 338 function ActionListPanel:Update(force)
Nenue@70 339 local parent = self:GetParent()
Nenue@70 340 local tabID = parent.selectedTabIndex
Nenue@70 341 local scrollOffset = parent.scrollOffset
Nenue@70 342 if not tabID then
Nenue@70 343 tabID = kb.db.bindMode or BINDING_TYPE_GLOBAL
Nenue@70 344 end
Nenue@70 345 print('|cFF0088FF'..self:GetName()..':Update()|r', 'tab', parent.selectedTabIndex, 'scroll', parent.scrollOffset)
Nenue@70 346
Nenue@70 347 local selectedProfile = kb.loadedProfiles[tabID]
Nenue@70 348 if selectedProfile then
Nenue@70 349 kb.currentProfile = selectedProfile
Nenue@70 350 kb.db.bindMode = tabID
Nenue@70 351 else
Nenue@70 352 tabID = BINDING_TYPE_GLOBAL
Nenue@70 353 end
Nenue@70 354 scrollOffset = scrollOffset or 0
Nenue@70 355
Nenue@70 356 local leftSlot, upSlot
Nenue@70 357 local buttonTable = self.buttons or {}
Nenue@70 358 for index = 1, NUM_KEY_SLOTS do
Nenue@70 359 if not buttonTable[index] then
Nenue@70 360 local button = CreateFrame('CheckButton', 'KeyBinderSlot'..index, self, 'KeyButton')
Nenue@70 361 local newRow = (mod(index, BINDS_PER_ROW) == 1)
Nenue@70 362
Nenue@70 363 if index == 1 then
Nenue@70 364 button:SetPoint('TOPLEFT', self, 'TOPLEFT', BUTTON_PADDING, - BUTTON_PADDING)
Nenue@70 365 upSlot = button
Nenue@70 366 elseif newRow then
Nenue@70 367 button:SetPoint('TOPLEFT', upSlot, 'BOTTOMLEFT', 0, -BUTTON_SPACING)
Nenue@70 368 upSlot = button
Nenue@70 369 else
Nenue@70 370 button:SetPoint('TOPLEFT', leftSlot, 'TOPRIGHT', BUTTON_HSPACING, 0)
Nenue@70 371 end
Nenue@70 372
Nenue@70 373 button:SetSize(KEY_BUTTON_SIZE, KEY_BUTTON_SIZE)
Nenue@70 374 button:Show()
Nenue@70 375 buttonTable[index] = button
Nenue@70 376 leftSlot = button
Nenue@70 377 end
Nenue@70 378 end
Nenue@70 379 self.buttons = buttonTable
Nenue@70 380
Nenue@70 381 local startIndex = scrollOffset * BINDS_PER_ROW
Nenue@70 382 for i, button in ipairs(self.buttons) do
Nenue@70 383 button:SetID(startIndex+i)
Nenue@70 384 button:UpdateSlot(force)
Nenue@70 385 button:SetFrameLevel(50 + i + (button.isActive and #self.buttons or 0))
Nenue@70 386 end
Nenue@70 387
Nenue@70 388
Nenue@70 389 local r,g,b,a = unpack(BINDING_SCHEME_COLOR[kb.db.bindMode])
Nenue@70 390 self.profileStripe:SetColorTexture(r,g,b)
Nenue@70 391 if kb.saveTarget then
Nenue@70 392 self.bg:SetColorTexture(.2,.5, .2, .5)
Nenue@70 393 self.UnbindButton:SetFrameLevel(kb.saveTarget:GetFrameLevel()-1)
Nenue@70 394 self.UnbindButton:SetPoint('TOPLEFT', kb.saveTarget, 'BOTTOMLEFT', 0, -1)
Nenue@70 395 self.UnbindButton:Show()
Nenue@70 396
Nenue@70 397 else
Nenue@70 398 self.bg:SetColorTexture(.2,.2,.2,1)
Nenue@70 399 self.UnbindButton:Hide()
Nenue@70 400 end
Nenue@70 401
Nenue@70 402 return tabID, scrollOffset
Nenue@70 403 end
Nenue@70 404
Nenue@70 405
Nenue@70 406 function ActionListPanel:ActivateSlot (button)
Nenue@70 407 if kb.saveTarget then
Nenue@70 408 kb.saveTarget.isActive = nil
Nenue@70 409 end
Nenue@70 410 button.isActive = true
Nenue@70 411 kb.saveTarget = button
Nenue@70 412 return true
Nenue@70 413 end
Nenue@70 414
Nenue@70 415 function ActionListPanel:DeactivateSlot (button)
Nenue@70 416 button.isActive = nil
Nenue@70 417 kb.saveTarget = nil
Nenue@70 418 return true
Nenue@70 419 end
Nenue@70 420
Nenue@70 421 function ActionListPanel:OnInput(key)
Nenue@70 422
Nenue@70 423 if key == 'ESCAPE' then
Nenue@70 424 return self:DeactivateSlot(kb.saveTarget)
Nenue@70 425 end
Nenue@70 426
Nenue@70 427 if (match(key, '[RL]SHIFT') or match(key, '[RL]ALT') or match(key, '[RL]CTRL')) then
Nenue@70 428 return
Nenue@70 429 end
Nenue@70 430
Nenue@70 431 if kb.saveTarget then
Nenue@70 432 if kb.saveTarget:SaveSlot(key) then
Nenue@70 433 if not (kb.db.stickyMode or kb.db.hoverInput) then
Nenue@70 434 return self:DeactivateSlot(kb.saveTarget)
Nenue@70 435 end
Nenue@70 436 return true
Nenue@70 437 end
Nenue@70 438 end
Nenue@70 439 end
Nenue@70 440
Nenue@70 441
Nenue@70 442 function SystemBindingsPanel:Update(force)
Nenue@70 443 end
Nenue@70 444
Nenue@70 445 --- Associate processed input with the given slot's metadata
Nenue@70 446 function SkeletonKeyButtonMixin:SaveSlot (key)
Nenue@70 447
Nenue@70 448 if not self.command then
Nenue@70 449 return
Nenue@70 450 end
Nenue@70 451 if InCombatLockdown() then
Nenue@70 452 kb:print(L('Bindings cannot be changed during combat.'))
Nenue@70 453 return
Nenue@70 454 end
Nenue@70 455
Nenue@70 456 local spellName = self.actionName
Nenue@70 457
Nenue@70 458 print('|cFFFFFF00received|cFFFFFF00', self:GetID(), '|cFF00FFFF', key)
Nenue@70 459
Nenue@70 460 local modifier = ''
Nenue@70 461 if IsAltKeyDown() then
Nenue@70 462 modifier = 'ALT-'
Nenue@70 463 end
Nenue@70 464 if IsControlKeyDown() then
Nenue@70 465 modifier = modifier.. 'CTRL-'
Nenue@70 466 end
Nenue@70 467 if IsShiftKeyDown() then
Nenue@70 468 modifier = modifier..'SHIFT-'
Nenue@70 469 end
Nenue@70 470 local binding = modifier..key
Nenue@70 471
Nenue@70 472 -- check for system bindings
Nenue@70 473 --bprint('|cFFFFFF00SaveBind|r', 'protectKeys', kb.db.protectBlizKeys)
Nenue@70 474 if kb.db.protectBlizKeys and kb.SystemBindings[binding] then
Nenue@70 475 kb:print(L('BINDING_FAILED_PROTECTED', binding, kb.SystemBindings[binding]))
Nenue@70 476 return false
Nenue@70 477 end
Nenue@70 478
Nenue@70 479 -- check for other keys
Nenue@70 480 local previousCommand = GetBindingAction(binding)
Nenue@70 481 if previousCommand ~= "" and previousCommand ~= self.command then
Nenue@70 482 local actionType, actionID, name = kb.GetCommandAction(previousCommand)
Nenue@70 483 if actionType then
Nenue@70 484 local keys = {GetBindingKey(previousCommand) }
Nenue@70 485 local i = 1
Nenue@70 486 while keys[i] do
Nenue@70 487 if keys[i] == binding then
Nenue@70 488 tremove(keys, i)
Nenue@70 489 kb.UpdateBindingsCache(actionType, actionID, keys)
Nenue@70 490 break
Nenue@70 491 end
Nenue@70 492 i = i + 1
Nenue@70 493 end
Nenue@70 494 end
Nenue@70 495 end
Nenue@70 496
Nenue@70 497
Nenue@70 498 if self.isAvailable then
Nenue@70 499 print('Binding available spell', binding, self.command)
Nenue@70 500 SetBinding(binding, self.command)
Nenue@70 501 SaveBindings(GetCurrentBindingSet())
Nenue@70 502 self.assignedKeys = {GetBindingKey(self.command) }
Nenue@70 503
Nenue@70 504 kb:print(L('BINDING_ASSIGNED', binding, self.actionName, kb.currentHeader))
Nenue@70 505 else
Nenue@70 506 kb:print(L('UNSELECTED_TALENT_ASSIGNED', binding, self.actionName, kb.currentHeader))
Nenue@70 507 end
Nenue@70 508
Nenue@70 509 if not tContains(self.assignedKeys, binding) then
Nenue@70 510 tinsert(self.assignedKeys, 1, binding)
Nenue@70 511 end
Nenue@70 512
Nenue@70 513 local talentInfo
Nenue@70 514 if spellName and kb.TalentCache[spellName] then
Nenue@70 515 print('store dynamicType talent')
Nenue@70 516 talentInfo = {
Nenue@70 517 macroName = self.macroName,
Nenue@70 518 actionName = self.actionName,
Nenue@70 519 actionType = self.actionType,
Nenue@70 520 actionID = self.actionID,
Nenue@70 521 assignedKeys = self.assignedKeys
Nenue@70 522 }
Nenue@70 523 kb.currentProfile.talents[spellName] = talentInfo
Nenue@70 524 end
Nenue@70 525
Nenue@70 526 for _, key in ipairs(self.assignedKeys) do
Nenue@70 527 if not kb.currentProfile.bindings[key] then
Nenue@70 528 kb.currentProfile.bindings[key] = self.command
Nenue@70 529 end
Nenue@70 530 end
Nenue@70 531
Nenue@70 532 for level, profile in ipairs(kb.orderedProfiles) do
Nenue@70 533 if (level > kb.db.bindMode) then
Nenue@70 534 profile.bindings[binding] = nil
Nenue@70 535 profile.commands[self.command] = nil
Nenue@70 536 profile.bound[self.command] = nil
Nenue@70 537 if spellName then
Nenue@70 538 profile.talents[spellName] = nil
Nenue@70 539 end
Nenue@70 540 end
Nenue@70 541 end
Nenue@70 542
Nenue@70 543 kb.UpdateBindingsCache(self.actionType, self.actionID, self.assignedKeys)
Nenue@70 544
Nenue@70 545 self.binding = binding
Nenue@70 546
Nenue@70 547 return true
Nenue@70 548 end
Nenue@70 549
Nenue@70 550 function SkeletonKeyMixin:OnKeyDown(key)
Nenue@70 551 self:ProcessInput(key)
Nenue@70 552 end
Nenue@70 553 function SkeletonKeyMixin:OnKeyUp(key)
Nenue@70 554 end
Nenue@70 555
Nenue@70 556 function SkeletonKeyMixin:OnDragStart()
Nenue@70 557 self:StartMoving()
Nenue@70 558 end
Nenue@70 559 function SkeletonKeyMixin:OnDragStop()
Nenue@70 560 self:StopMovingOrSizing()
Nenue@70 561 end
Nenue@70 562
Nenue@70 563 function ActionListPanel:UnbindSlot (button)
Nenue@70 564
Nenue@70 565 local button = button or kb.saveTarget
Nenue@70 566 if not button then
Nenue@70 567 return
Nenue@70 568 end
Nenue@70 569
Nenue@70 570 local command = button.command
Nenue@70 571 local actionType = button.actionType
Nenue@70 572 local actionID = button.actionID
Nenue@70 573
Nenue@70 574 local keys = {GetBindingKey(command) }
Nenue@70 575 if #keys >= 1 then
Nenue@70 576 kb.UpdateBindingsCache(actionType, actionID, {})
Nenue@70 577 end
Nenue@70 578
Nenue@70 579 local talentName = button.actionName
Nenue@70 580 if actionType == 'macro' then
Nenue@70 581 local spellName, _, spellID = GetMacroSpell(actionID)
Nenue@70 582 talentName = spellName
Nenue@70 583 end
Nenue@70 584
Nenue@70 585
Nenue@70 586 --print('detected', #keys, 'bindings')
Nenue@70 587 for i, key in pairs(keys) do
Nenue@70 588 --print('clearing', key)
Nenue@70 589 SetBinding(key, nil)
Nenue@70 590 SaveBindings(GetCurrentBindingSet())
Nenue@70 591 if kb.currentProfile.bindings[key] then
Nenue@70 592 --kb:print(L('BINDING_REMOVED', self.actionName, kb.currentHeader))
Nenue@70 593 kb.currentProfile.bindings[key] = nil
Nenue@70 594 end
Nenue@70 595 if kb.currentProfile.talents[talentName] then
Nenue@70 596 kb.currentProfile.talents[talentName] = nil
Nenue@70 597 end
Nenue@70 598
Nenue@70 599 kb.bindings[tostring(actionType)..'_'..tostring(actionID)] = nil
Nenue@70 600 end
Nenue@70 601 if kb.currentProfile.bound[command] then
Nenue@70 602 kb.currentProfile.bound[command] = nil
Nenue@70 603 --kb:print(BINDING_REMOVED:format(self.actionName, configHeaders[db.bindMode]))
Nenue@70 604 end
Nenue@70 605 kb.saveTarget = nil
Nenue@70 606
Nenue@70 607 return true
Nenue@70 608 end
Nenue@70 609
Nenue@70 610 kb.AcceptAssignment = function(self, ...)
Nenue@70 611 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"]
Nenue@70 612 local source = kb. loadedProfiles[popup.oldProfile]
Nenue@70 613 popup.slot:SetSlot(unpack(popup.args))
Nenue@70 614 popup.slot:UpdateSlot()
Nenue@70 615 --kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) -- re-enable scrolling
Nenue@70 616 ClearCursor()
Nenue@70 617 ResetCursor()
Nenue@70 618 end
Nenue@70 619
Nenue@70 620 --- Add to blizzard interfaces
Nenue@70 621 StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] = {
Nenue@70 622 text = "Confirm moving an assigned command.",
Nenue@70 623 button1 = OKAY,
Nenue@70 624 button2 = CANCEL,
Nenue@70 625 timeout = 0,
Nenue@70 626 whileDead = 1,
Nenue@70 627 showAlert = 1,
Nenue@70 628 OnAccept = kb.AcceptAssignment,
Nenue@70 629 --OnCancel = function() kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) end
Nenue@70 630 }
Nenue@70 631
Nenue@70 632
Nenue@70 633
Nenue@70 634 do
Nenue@70 635 local MACRO_SELECTED_ID = 1
Nenue@70 636 local MACRO_SELECTED_NAME = GetMacroInfo(1)
Nenue@70 637 kb.CreateMacroHooks = function()
Nenue@70 638 print('|cFF00FF00setting up MacroUI hooks')
Nenue@70 639 hooksecurefunc("MacroFrame_SelectMacro", function(id)
Nenue@70 640 print('|cFF0088FFMacroFrame_SelectMacro|r', id)
Nenue@70 641 MACRO_SELECTED_ID = id
Nenue@70 642 for k,v in pairs(kb.bindings) do
Nenue@70 643 --print(k,v)
Nenue@70 644 end
Nenue@70 645
Nenue@70 646 end)
Nenue@70 647 end
Nenue@70 648 end
Nenue@70 649
Nenue@70 650
Nenue@70 651 SkeletonKeyActionListMixin = Mixin(ActionListPanel, SkeletonKeyPanel)
Nenue@70 652 SkeletonKeySystemBindingsMixin = Mixin(SystemBindingsPanel, SkeletonKeyPanel)