WoW 插件 - 按下按键时的动态工具提示

WoW Addon - Dynamic tooltip while key is pressed

我有一个工具提示,如果 SHIFT 键是 pressed/held,我希望它显示更详细的信息。到目前为止,以下代码有效:

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 键自行刷新?
我的想法是,当我将鼠标悬停在 WoW 中的某件物品上时,只要我按住 SHIFT 键,该物品就会与我目前穿的衣服进行比较。我想要这种效果,就在同一个工具提示中。

我希望有人能把我推向正确的方向。我试过使用 MODIFIER_STATE_CHANGED,但没有成功。

哦,当我们在谈论工具时...这是一个额外的问题:
可以稍微格式化一下吗?粗体、斜体、字体大小、一行中单个单词的颜色变化等。 ?我没有发现任何特别的东西 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 提供的启发。 :)

该事件确实是关键,但由于您需要将其注册到框架,最好是受代码影响的框架,因此您应该为工具提示使用一个新框架:

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 键时重新填充工具提示,并且您的函数可以对键的新状态做出反应。
餐巾纸代码,从我使用此方法的插件中删除一些复制和粘贴,因此它可能不完美,但足以传达概念。