Nano Hash - криптовалюты, майнинг, программирование

WoW Addon - динамическая всплывающая подсказка при нажатой клавише

У меня есть всплывающая подсказка, и я хочу, чтобы она отображала более подробную информацию, если нажата / удерживается клавиша SHIFT. Следующий код пока работает:

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, но у меня ничего не получилось.

Да, и пока мы говорим об инструментах ... вот бонусный вопрос:
Можно ли их немного отформатировать? Жирный шрифт, курсив, размер шрифта, изменение цвета для одного слова в строке и т. Д.? Я не нашел ничего особенного здесь (wowprogramming.com), но, возможно, я это не заметил.

--- РЕШЕНО ---
Для тех, кто заинтересован в решении:

Я использовал фрагмент кода Натаниэля и немного его скорректировал. Поскольку я использую один 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

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


Ответы:


1

Это событие действительно является ключевым, но, поскольку вам нужно зарегистрировать его во фрейме, предпочтительно в том, на который влияет код, вы должны использовать новый фрейм для своей всплывающей подсказки:

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, и ваша функция может реагировать на новое состояние клавиши.
Код салфетки, коснитесь некоторой копии и вставки из надстройки, где я использовал этот метод, поэтому это может не быть идеально, но достаточно, чтобы передать концепцию.

04.11.2016
  • Давая попробовать MODIFIER_STATE_CHANGED, я всегда использовал один и тот же фрейм (действительно, этот аддон сейчас состоит только из одного единственного фрейма). Это могло быть проблемой все время. Сегодня вечером я попробую ваш подход и расскажу о своих результатах. А сейчас спасибо! :) 04.11.2016
  • Что ж, это действительно помогло! Я интегрировал окончательное решение в вопрос выше. Еще раз спасибо! 05.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..