2016-11-04 24 views
1

我有一个工具提示,如果按住SHIFT键,我希望它显示更详细的信息。下面的代码到目前为止工作:WoW Addon - 按下按键时的动态工具提示

function myAddonFrame_OnEnter(self) 
    myAddon_GenerateTooltip(self) 
end 

function myAddonFrame_OnLeave(self) 
    GameTooltip:Hide() 
end 

function myAddon_GenerateTooltip(self) 
    GameTooltip:SetOwner(self or UIParent, "ANCHOR_LEFT") 
    GameTooltip:SetText(“myAddon”, 0.7, 0, 1) 
    GameTooltip:AddLine(" ", 1, 1, 1) 
    if IsShiftKeyDown() then 
     -- Show some more details, if the SHIFT key is pressed. 
     GameTooltip:AddLine(“Some detailed stuff about god and the world.”, 1, 1, 1) 
     GameTooltip:AddLine(“Even more great stuff to read.”, 0.9, 0.8, 0.1, 1) 
    else 
     -- Basic information to be displayed when no button is pressed. 
     GameTooltip:AddLine(“Some basic information. Yaaay!“, 1, 1, 1) 
     GameTooltip:AddLine(" ", 1, 1, 1) 
     GameTooltip:AddLine(“Hold SHIFT for more information…”, 0.5, 0.5, 0.5) 
    end 
    GameTooltip:Show() 
end 

但是,这只有在鼠标悬停myAddonFrame之前举行SHIFT键时才起作用。只要鼠标光标保留在myAddonFrame上,即使在释放SHIFT之后,它也会显示详细信息。但我希望它动态!

我的问题在这里:
我怎样才能让根据SHIFT键,当鼠标光标停留在框架上的提示来刷新自己?
我想到的是,当我将鼠标悬停在魔兽世界中的某个物品上时,只要按住SHIFT键,该物品就会与我目前佩戴的物品进行比较。我只是想在同一个工具提示中想到这个效果。

我希望有人能把我推向正确的方向。我试过使用MODIFIER_STATE_CHANGED,但我没有得到它的工作。

哦,虽然我们正在谈论toolips ......这里有一个加分题:
是否有可能将其格式化位?粗体,斜体,字体大小,换行中单个单词的颜色变化等?我没有发现什么特别的here (wowprogramming.com),但也许我忽略了它。

---解决---
为有兴趣在溶液中的:

我用Nathanyel的代码片段,并调整了一点。因为我只用一个XML文件来处理所有的帧和一个相应的LUA文件,所以我不想在那里创建一个新的帧。但我想出了一种方法来使用现有的myAddonFrame作为动态工具提示。
我从上面的代码工作完美,我不得不添加以下内容:

-- [ALL THE CODE ABOVE!] 

function myAddonFrame_OnLoad(frame) 
    frame:RegisterEvent("MODIFIER_STATE_CHANGED") -- Needed for the dynamic tool tip. 
end 

function myAddonFrame_OnEvent(frame, event, ...) 
    -- Fired, when any keyboard key is pressed. 
    local key, state = select(1, ...) 
    if (event == "MODIFIER_STATE_CHANGED") then 
     -- Switch the dynamic tooltip when the SHIFT key is held. 
     if myAddonFrame:IsMouseOver() and ((key == "LSHIFT") or (key == "RSHIFT")) then 
      myAddon_GenerateTooltip(frame) 
     end 
    end 
end 

这就是它!感谢Nathanyel的深思。 :)

回答

0

这一事件确实是关键,但是当你需要将它注册到一个框架,最好是受代码的人,你应该使用一个新的框架为您提示:

local myFrame = CreateFrame("GameTooltip","myFrame",UIParent,"GameTooltipTemplate") 

myFrame:SetScript("OnEvent",function(self, event, arg, ...) 
    if myFrame:IsShown() 
    and event == "MODIFIER_STATE_CHANGED" 
    and (arg = "LSHIFT" or arg = "RSHIFT") then 
    myAddon_GenerateTooltip() -- might need a parameter 
    end 
end 

myFrame:RegisterEvent("MODIFIER_STATE_CHANGED") 

这当按下Shift键时,只需重新填充工具提示,并且您的功能可以对键的新状态作出反应。
餐巾代码,斜杠一些副本&粘贴从我使用这种方法的插件,所以它可能不完美,但足以传达的概念。

+1

虽然给MODIFIER_STATE_CHANGED一个尝试,我总是使用相同的框架(实际上,这个插件现在只包含一个单一的框架)。这可能一直是这个问题。我今晚会试一试,告诉你我的结果。现在感谢! :) – nehegeb

+1

那真的有帮助!我在上面的问题中整合了最终解决方案。再次感谢! – nehegeb