2016-11-04 10 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 

Но это работает только, если клавиша SHIFT удерживается перед наведением указателя мыши на myAddonFrame. Он также отобразит подробную информацию даже после отпускания SHIFT, пока курсор мыши останется на myAddonFrame. Но я хочу, чтобы это было динамично!

Мой вопрос здесь:
Как я могу сделать всплывающую подсказку, чтобы обновить сам по клавише SHIFT, когда курсор мыши остается на раме?
Я имею в виду что-то вроде, когда я наводил курсор на предмет в WoW и только до тех пор, пока я держу клавишу 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 

Вот оно! Спасибо Натаньелю за пищу для размышлений. :)

ответ

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