comparison modules/PetAction.lua @ 116:fb48811a8736

Convert to standard keybindings
author Flick <flickerstreak@gmail.com>
date Fri, 23 Jan 2009 23:44:55 +0000
parents 410d036c43b2
children 6e4a11b9d290
comparison
equal deleted inserted replaced
115:af0172ed7037 116:fb48811a8736
294 end 294 end
295 }) 295 })
296 296
297 local frameRecycler = {} 297 local frameRecycler = {}
298 local trash = CreateFrame("Frame") 298 local trash = CreateFrame("Frame")
299 local KBAttach, GetActionName, GetHotkey, SetKey, FreeKey, ClearBindings, GetBindings, OnEnter, OnLeave 299
300 do 300 local function GetActionName(f)
301 local buttonLookup = setmetatable({},{__mode="kv"}) 301 local b = f and f._reactionButton
302 302 if b then
303 -- Use KeyBound-1.0 for binding, but use Override bindings instead of 303 return format("%s:%s", b.bar:GetName(), b.idx)
304 -- regular bindings to support multiple profile use. This is a little 304 end
305 -- weird with the KeyBound dialog box (which has per-char selector as well 305 end
306 -- as an OK/Cancel box) but it's the least amount of effort to implement. 306
307 function GetActionName(f) 307 local function GetHotkey(f)
308 local b = buttonLookup[f] 308 return KB:ToShortKey(GetBindingKey(format("CLICK %s:LeftButton",f:GetName())))
309 if b then 309 end
310 return format("%s:%s", b.bar:GetName(), b.idx) 310
311 end 311 local function OnEnter( self )
312 end 312 if ReAction:GetKeybindMode() then
313 313 KB:Set(self)
314 function GetHotkey(f) 314 elseif self.tooltipName then
315 local b = buttonLookup[f]
316 if b then
317 return KB:ToShortKey(b:GetConfig().hotkey)
318 end
319 end
320
321 function SetKey(f, key)
322 local b = buttonLookup[f]
323 if b then
324 local c = b:GetConfig()
325 if c.hotkey then
326 SetOverrideBinding(f, false, c.hotkey, nil)
327 end
328 if key then
329 SetOverrideBindingClick(f, false, key, f:GetName(), nil)
330 end
331 c.hotkey = key
332 b:DisplayHotkey(GetHotkey(f))
333 end
334 end
335
336 function FreeKey(f, key)
337 local b = buttonLookup[f]
338 if b then
339 local c = b:GetConfig()
340 if c.hotkey == key then
341 local action = f:GetActionName()
342 SetOverrideBinding(f, false, c.hotkey, nil)
343 c.hotkey = nil
344 b:DisplayHotkey(nil)
345 return action
346 end
347 end
348 return ReAction:FreeOverrideHotkey(key)
349 end
350
351 function ClearBindings(f)
352 SetKey(f, nil)
353 end
354
355 function GetBindings(f)
356 local b = buttonLookup[f]
357 if b then
358 return b:GetConfig().hotkey
359 end
360 end
361
362 function KBAttach( button )
363 local f = button:GetFrame()
364 f.GetActionName = GetActionName
365 f.GetHotkey = GetHotkey
366 f.SetKey = SetKey
367 f.FreeKey = FreeKey
368 f.ClearBindings = ClearBindings
369 f.GetBindings = GetBindings
370 buttonLookup[f] = button
371 f:SetKey(button:GetConfig().hotkey)
372 ReAction:RegisterKeybindFrame(f)
373 if ReAction:GetKeybindMode() then
374 button.border:SetVertexColor(KB:GetColorKeyBoundMode())
375 button.border:Show()
376 end
377 end
378
379 function OnEnter( self )
380 if not self.tooltipName then
381 return;
382 end
383 local uber = GetCVar("UberTooltips") 315 local uber = GetCVar("UberTooltips")
384 if self.isToken or (uber == "0") then 316 if self.isToken or (uber == "0") then
385 if uber == "0" then 317 if uber == "0" then
386 GameTooltip:SetOwner(self, "ANCHOR_RIGHT") 318 GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
387 else 319 else
388 GameTooltip_SetDefaultAnchor(GameTooltip, self) 320 GameTooltip_SetDefaultAnchor(GameTooltip, self)
389 end 321 end
390 local tooltip = self.tooltipName 322 GameTooltip:SetText(self.tooltipName)
391 local k = GetBindings(self)
392 if k then
393 tooltip = tooltip .. format(" %s(%s)%s", NORMAL_FONT_COLOR_CODE, k, FONT_COLOR_CODE_CLOSE)
394 end
395 GameTooltip:SetText(tooltip)
396 if self.tooltipSubtext then 323 if self.tooltipSubtext then
397 GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5) 324 GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5)
398 end 325 end
399 GameTooltip:Show() 326 GameTooltip:Show()
400 else 327 else
401 GameTooltip_SetDefaultAnchor(GameTooltip, self) 328 GameTooltip_SetDefaultAnchor(GameTooltip, self)
402 GameTooltip:SetPetAction(self:GetID()) 329 GameTooltip:SetPetAction(self:GetID())
403 end 330 end
404 end 331 end
405 332 end
406 function OnLeave() 333
407 GameTooltip:Hide() 334 local function OnLeave()
408 end 335 GameTooltip:Hide()
409
410 end 336 end
411 337
412 local meta = { __index = Button } 338 local meta = { __index = Button }
413 339
414 function Button:New( bar, idx, config ) 340 function Button:New( bar, idx, config )
422 348
423 local name = config.name or ("ReAction_%s_%s_%d"):format(bar:GetName(),moduleID,idx) 349 local name = config.name or ("ReAction_%s_%s_%d"):format(bar:GetName(),moduleID,idx)
424 config.name = name 350 config.name = name
425 self.name = name 351 self.name = name
426 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured 352 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured
427 353
428 -- have to recycle frames with the same name: 354 -- have to recycle frames with the same name:
429 -- otherwise you either get references to old textures because named CreateFrame() 355 -- otherwise you either get references to old textures because named CreateFrame()
430 -- doesn't overwrite existing globals. Can't set them to nil in the global table, 356 -- doesn't overwrite existing globals. Can't set them to nil in the global table,
431 -- as it causes taint. 357 -- as it causes taint.
432 local parent = bar:GetFrame() 358 local parent = bar:GetFrame()
461 self.acModel = _G[("%sShine"):format(name)] 387 self.acModel = _G[("%sShine"):format(name)]
462 self.cooldown = _G[("%sCooldown"):format(name)] 388 self.cooldown = _G[("%sCooldown"):format(name)]
463 self.hotkey = f.hotkey 389 self.hotkey = f.hotkey
464 self.border = _G[("%sBorder"):format(name)] 390 self.border = _G[("%sBorder"):format(name)]
465 391
466 392 f._reactionButton = self
467 f:RegisterEvent("PLAYER_CONTROL_LOST"); 393
468 f:RegisterEvent("PLAYER_CONTROL_GAINED"); 394 f:RegisterEvent("PLAYER_CONTROL_LOST")
469 f:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED"); 395 f:RegisterEvent("PLAYER_CONTROL_GAINED")
470 f:RegisterEvent("UNIT_PET"); 396 f:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED")
471 f:RegisterEvent("UNIT_FLAGS"); 397 f:RegisterEvent("UNIT_PET")
472 f:RegisterEvent("UNIT_AURA"); 398 f:RegisterEvent("UNIT_FLAGS")
473 f:RegisterEvent("PET_BAR_UPDATE"); 399 f:RegisterEvent("UNIT_AURA")
474 f:RegisterEvent("PET_BAR_UPDATE_COOLDOWN"); 400 f:RegisterEvent("PET_BAR_UPDATE")
401 f:RegisterEvent("PET_BAR_UPDATE_COOLDOWN")
475 402
476 f:SetScript("OnEvent", 403 f:SetScript("OnEvent",
477 function(event,arg1) 404 function(event,arg1)
478 if event =="PET_BAR_UPDATE_COOLDOWN" then 405 if event =="PET_BAR_UPDATE_COOLDOWN" then
479 self:UpdateCooldown() 406 self:UpdateCooldown()
491 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then 418 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
492 return "clear" 419 return "clear"
493 end 420 end
494 ]]) 421 ]])
495 422
496 KBAttach(self)
497
498 -- attach to skinner 423 -- attach to skinner
499 bar:SkinButton(self, 424 bar:SkinButton(self,
500 { 425 {
501 HotKey = self.hotkey, 426 HotKey = self.hotkey,
502 } 427 }
503 ) 428 )
504 429
505 self:Refresh() 430 self:Refresh()
431 self:UpdateHotkey()
506 self:SetKeybindMode(ReAction:GetKeybindMode()) 432 self:SetKeybindMode(ReAction:GetKeybindMode())
507 433
508 return self 434 return self
509 end 435 end
510 436
519 _G[self.name] = nil 445 _G[self.name] = nil
520 end 446 end
521 if self.config.actionID then 447 if self.config.actionID then
522 ActionIDList[self.config.actionID] = nil 448 ActionIDList[self.config.actionID] = nil
523 end 449 end
450 f._reactionButton = nil
524 self.frame = nil 451 self.frame = nil
525 self.config = nil 452 self.config = nil
526 self.bar = nil 453 self.bar = nil
527 end 454 end
528 455
549 return self.config.actionID 476 return self.config.actionID
550 end 477 end
551 478
552 function Button:Update() 479 function Button:Update()
553 local id = self.frame:GetID() 480 local id = self.frame:GetID()
554 local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(id); 481 local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(id)
555 local f = self.frame 482 local f = self.frame
556 --ReAction:Print(("id %d: '%s', '%s', '%s', '%s', '%s', '%s', '%s'"):format(tostring(id), tostring(name),tostring(subtext),tostring(texture),tostring(isToken),tostring(isActive),tostring(autoCastAllowed),tostring(autoCastEnabled)))
557 483
558 if isToken then 484 if isToken then
559 self.icon:SetTexture(_G[texture]); 485 self.icon:SetTexture(_G[texture])
560 f.tooltipName = _G[name]; 486 f.tooltipName = _G[name]
561 else 487 else
562 self.icon:SetTexture(texture); 488 self.icon:SetTexture(texture)
563 f.tooltipName = name; 489 f.tooltipName = name
564 end 490 end
565 491
566 f.isToken = isToken; 492 f.isToken = isToken
567 f.tooltipSubtext = subtext; 493 f.tooltipSubtext = subtext
568 f:SetChecked( isActive and 1 or 0); 494 f:SetChecked( isActive and 1 or 0)
569 495
570 if autoCastAllowed then 496 if autoCastAllowed then
571 self.acTex:Show(); 497 self.acTex:Show()
572 else 498 else
573 self.acTex:Hide(); 499 self.acTex:Hide()
574 end 500 end
575 501
576 if autoCastEnabled then 502 if autoCastEnabled then
577 AutoCastShine_AutoCastStart(self.acModel) 503 AutoCastShine_AutoCastStart(self.acModel)
578 else 504 else
583 if GetPetActionSlotUsable(id) then 509 if GetPetActionSlotUsable(id) then
584 SetDesaturation(self.icon,nil) 510 SetDesaturation(self.icon,nil)
585 else 511 else
586 SetDesaturation(self.icon,1) 512 SetDesaturation(self.icon,1)
587 end 513 end
588 self.icon:Show(); 514 self.icon:Show()
589 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2"); 515 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
590 else 516 else
591 self.icon:Hide(); 517 self.icon:Hide()
592 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot"); 518 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
593 end 519 end
594 520
595 self:UpdateCooldown() 521 self:UpdateCooldown()
596 end 522 end
597 523
598 function Button:UpdateCooldown() 524 function Button:UpdateCooldown()
599 local start, duration, enable = GetPetActionCooldown(self.frame:GetID()); 525 local start, duration, enable = GetPetActionCooldown(self.frame:GetID())
600 CooldownFrame_SetTimer(self.cooldown, start, duration, enable); 526 CooldownFrame_SetTimer(self.cooldown, start, duration, enable)
601 end 527 end
602 528
603 function Button:UpdateHotkey() 529 function Button:UpdateHotkey()
604 self:DisplayHotkey(GetHotkey(self.frame)) 530 self.hotkey:SetText(GetHotkey(self.frame) or "")
605 end 531 end
606 532
607 function Button:ShowActionIDLabel(show) 533 function Button:ShowActionIDLabel(show)
608 if show then 534 if show then
609 -- store the action ID label in the frame due to frame recycling 535 -- store the action ID label in the frame due to frame recycling
623 end 549 end
624 550
625 551
626 function Button:SetKeybindMode(mode) 552 function Button:SetKeybindMode(mode)
627 if mode then 553 if mode then
554 local f = self.frame
555 f.GetActionName = GetActionName
556 f.GetHotkey = GetHotkey
628 self.border:SetVertexColor(KB:GetColorKeyBoundMode()) 557 self.border:SetVertexColor(KB:GetColorKeyBoundMode())
629 self.border:Show() 558 self.border:Show()
630 else 559 else
631 self.border:Hide() 560 self.border:Hide()
632 end 561 end
633 end 562 end
634 563
635 function Button:DisplayHotkey( key )
636 self.hotkey:SetText(key or "")
637 end