Files
Questie-X/Modules/Tracker/TrackerMenu.lua
T

580 lines
19 KiB
Lua

---@class TrackerMenu
local TrackerMenu = QuestieLoader:CreateModule("TrackerMenu")
-------------------------
--Import QuestieTracker modules.
-------------------------
---@type QuestieTracker
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
---@type TrackerBaseFrame
local TrackerBaseFrame = QuestieLoader:ImportModule("TrackerBaseFrame")
---@type TrackerUtils
local TrackerUtils = QuestieLoader:ImportModule("TrackerUtils")
-------------------------
--Import Questie modules.
-------------------------
---@type QuestieQuest
local QuestieQuest = QuestieLoader:ImportModule("QuestieQuest")
---@type QuestieMap
local QuestieMap = QuestieLoader:ImportModule("QuestieMap")
---@type QuestieLink
local QuestieLink = QuestieLoader:ImportModule("QuestieLink")
---@type QuestieCombatQueue
local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue")
---@type QuestieLib
local QuestieLib = QuestieLoader:ImportModule("QuestieLib")
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
--- COMPATIBILITY ---
local C_Timer = QuestieCompat.C_Timer
local GetQuestLogIndexByID = QuestieCompat.GetQuestLogIndexByID
local LibDropDown = QuestieCompat.LibUIDropDownMenu or LibStub:GetLibrary("LibUIDropDownMenuQuestie-4.0")
TrackerMenu.menuFrame = LibDropDown:Create_UIDropDownMenu("QuestieTrackerMenuFrame", UIParent)
local tinsert = table.insert
-- Create local Quest Menu functions
TrackerMenu.addFocusOption = function(menu, quest, objective)
if Questie.db.char.TrackerFocus and type(Questie.db.char.TrackerFocus) == "string" and Questie.db.char.TrackerFocus == tostring(quest.Id) .. " " .. tostring(objective.Index) then
tinsert(menu, {
text = l10n('Unfocus'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:UnFocus()
QuestieQuest:ToggleNotes(true)
end
})
else
tinsert(menu, {
text = l10n('Focus Objective'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:FocusObjective(quest.Id, objective.Index)
QuestieQuest:ToggleNotes(false)
end
})
end
end
TrackerMenu.addTomTomOption = function(menu, quest, objective)
tinsert(menu, {
text = l10n('Set |cFF54e33bTomTom|r Target'),
func = function()
LibDropDown:CloseDropDownMenus()
local spawn, zone, name = QuestieMap:GetNearestQuestSpawn(quest)
if (not spawn) and objective ~= nil then
spawn, zone, name = QuestieMap:GetNearestSpawn(objective)
end
if spawn then
TrackerUtils:SetTomTomTarget(name, zone, spawn[1], spawn[2])
end
end
})
end
TrackerMenu.minMaxQuestOption = function(menu, quest)
if Questie.db.char.collapsedQuests[quest.Id] then
tinsert(menu, {
text = l10n('Maximize Quest'),
func = function()
Questie.db.char.collapsedQuests[quest.Id] = false
QuestieCombatQueue:Queue(function()
QuestieTracker:Update()
end)
end
})
else
tinsert(menu, {
text = l10n('Minimize Quest'),
func = function()
Questie.db.char.collapsedQuests[quest.Id] = true
QuestieCombatQueue:Queue(function()
QuestieTracker:Update()
end)
end
})
end
end
TrackerMenu.addShowHideObjectivesOption = function(menu, quest, objective)
if objective.HideIcons then
tinsert(menu, {
text = l10n('Show Icons'),
func = function()
LibDropDown:CloseDropDownMenus()
objective.HideIcons = nil
Questie.db.char.TrackerHiddenObjectives[tostring(quest.Id) .. " " .. tostring(objective.Index)] = nil
QuestieQuest:ToggleNotes(true)
end
})
else
tinsert(menu, {
text = l10n('Hide Icons'),
func = function()
LibDropDown:CloseDropDownMenus()
objective.HideIcons = true
Questie.db.char.TrackerHiddenObjectives[tostring(quest.Id) .. " " .. tostring(objective.Index)] = true
QuestieQuest:ToggleNotes(false)
end
})
end
end
TrackerMenu.addShowHideQuestsOption = function(menu, quest)
if quest.HideIcons then
tinsert(menu, {
text = l10n('Show Icons'),
func = function()
quest.HideIcons = nil
Questie.db.char.TrackerHiddenQuests[quest.Id] = nil
QuestieQuest:ToggleNotes(true)
end
})
else
tinsert(menu, {
text = l10n('Hide Icons'),
func = function()
quest.HideIcons = true
Questie.db.char.TrackerHiddenQuests[quest.Id] = true
QuestieQuest:ToggleNotes(false)
end
})
end
end
TrackerMenu.addShowObjectivesOnMapOption = function(menu, quest, objective)
tinsert(menu, {
text = l10n('Show on Map'),
func = function()
LibDropDown:CloseDropDownMenus()
local needHiddenUpdate = false
if (Questie.db.char.TrackerFocus and type(Questie.db.char.TrackerFocus) == "string" and Questie.db.char.TrackerFocus ~= tostring(quest.Id) .. " " .. tostring(objective.Index))
or (Questie.db.char.TrackerFocus and type(Questie.db.char.TrackerFocus) == "number" and Questie.db.char.TrackerFocus ~= quest.Id) then
TrackerUtils:UnFocus()
needHiddenUpdate = true
end
if objective.HideIcons then
objective.HideIcons = nil
needHiddenUpdate = true
end
if quest.HideIcons then
quest.HideIcons = nil
needHiddenUpdate = true
end
if needHiddenUpdate then
QuestieQuest:ToggleNotes(true)
end
TrackerUtils:ShowObjectiveOnMap(objective)
end
})
end
TrackerMenu.addShowFinisherOnMapOption = function(menu, quest)
if quest:IsComplete() == 1 then
tinsert(menu, {
text = l10n('Show on Map'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:ShowFinisherOnMap(quest)
end
})
end
end
TrackerMenu.addObjectiveOption = function(menu, subMenu, quest)
if quest:IsComplete() == 0 then
tinsert(menu, { text = l10n('Objectives'), hasArrow = true, menuList = subMenu })
end
end
TrackerMenu.addLinkToChatOption = function(menu, quest)
tinsert(menu, {
text = l10n('Link Quest to chat'),
func = function()
LibDropDown:CloseDropDownMenus()
if (not ChatFrame1EditBox:IsVisible()) then
ChatFrame_OpenChat(QuestieLink:GetQuestLinkString(quest.level, quest.name, quest.Id))
else
ChatEdit_InsertLink(QuestieLink:GetQuestLinkString(quest.level, quest.name, quest.Id))
end
end
})
end
TrackerMenu.addShowInQuestLogOption = function(menu, quest)
tinsert(menu, {
text = l10n('Show in Quest Log'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:ShowQuestLog(quest)
end
})
end
TrackerMenu.addAbandonedQuest = function(menu, quest)
tinsert(menu, {
text = l10n('Abandon Quest'),
func = function()
LibDropDown:CloseDropDownMenus()
local lastQuest = GetQuestLogSelection()
local questLogIndex = (GetQuestLogIndexByID and GetQuestLogIndexByID(quest.Id)) or 0
if questLogIndex and questLogIndex > 0 then
SelectQuestLogEntry(questLogIndex)
end
SetAbandonQuest()
local items = GetAbandonQuestItems()
if items then
StaticPopup_Hide("ABANDON_QUEST")
StaticPopup_Show("ABANDON_QUEST_WITH_ITEMS", GetAbandonQuestName(), items)
else
StaticPopup_Hide("ABANDON_QUEST_WITH_ITEMS")
StaticPopup_Show("ABANDON_QUEST", GetAbandonQuestName())
end
SelectQuestLogEntry(lastQuest)
local questLogFrame = QuestLogExFrame or ClassicQuestLog or QuestLogFrame
if questLogFrame:IsShown() then
QuestLog_Update()
end
end
})
end
TrackerMenu.addUntrackOption = function(menu, quest)
tinsert(menu, {
text = l10n('Untrack Quest'),
func = function()
LibDropDown:CloseDropDownMenus()
QuestieTracker:UntrackQuestId(quest.Id)
local questLogFrame = QuestLogExFrame or ClassicQuestLog or QuestLogFrame
if questLogFrame:IsShown() then
QuestLog_Update()
end
end
})
end
TrackerMenu.addFocusUnfocusOption = function(menu, quest)
if Questie.db.char.TrackerFocus and type(Questie.db.char.TrackerFocus) == "number" and Questie.db.char.TrackerFocus == quest.Id then
tinsert(menu, {
text = l10n('Unfocus'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:UnFocus()
QuestieQuest:ToggleNotes(true)
end
})
else
tinsert(menu, {
text = l10n('Focus Quest'),
func = function()
LibDropDown:CloseDropDownMenus()
TrackerUtils:FocusQuest(quest.Id)
QuestieQuest:ToggleNotes(false)
end
})
end
end
TrackerMenu.addLockUnlockOption = function(menu)
if Questie.db.profile.trackerLocked then
tinsert(menu, {
text = l10n('Unlock Tracker'),
func = function()
LibDropDown:CloseDropDownMenus()
Questie.db.profile.trackerLocked = false
TrackerBaseFrame:Update()
end
})
else
tinsert(menu, {
text = l10n('Lock Tracker'),
func = function()
LibDropDown:CloseDropDownMenus()
Questie.db.profile.trackerLocked = true
TrackerBaseFrame:Update()
end
})
end
end
-- Register the WoWHead Quest popup dialog
StaticPopupDialogs["QUESTIE_WOWHEAD_URL"] = {
text = "WoWHead URL",
button2 = CLOSE,
hasEditBox = true,
editBoxWidth = 280,
EditBoxOnEnterPressed = function(self)
self:GetParent():Hide()
end,
EditBoxOnEscapePressed = function(self)
self:GetParent():Hide()
end,
OnShow = function(self)
local questID = self.text.text_arg1 or self.data
local quest_wow = QuestieDB.GetQuest(questID)
local name = quest_wow.name
-- self.text:SetText(self.text:GetText() .. "\n\n|cffff7f00" .. name .. "|r")
self.text:SetFont("GameFontNormal", 12)
-- self.text:SetText(self.text:GetText() .. "\n\n|c FFFFB9 00" .. name .. "|r")
self.text:SetText(self.text:GetText() .. Questie:Colorize("\n\n" .. name, "gold"))
local langShort = string.sub(l10n:GetUILocale(), 1, 2) .. "."
if langShort == "en." then
langShort = ""
end
local wowheadLink
if Questie.IsWotlk then
if langShort then
langShort = langShort:gsub("%.", "/") -- The Wotlk WoWHead URL differs to the other Classic URLs
end
wowheadLink = "https://" .. "wowhead.com/wotlk/" .. langShort .. "quest=" .. questID
elseif Questie.IsTBC then
wowheadLink = "https://" .. langShort .. "tbc.wowhead.com/quest=" .. questID
else
wowheadLink = "https://" .. langShort .. "classic.wowhead.com/quest=" .. questID
end
self.editBox:SetText(wowheadLink)
self.editBox:SetFocus()
self.editBox:HighlightText()
self.editBox:SetScript("OnKeyDown", function(_, key)
if key == "C" and IsControlKeyDown() then
C_Timer.After(0.1, function()
self.editBox:GetParent():Hide()
ActionStatus_DisplayMessage(l10n("Copied URL to clipboard"), true)
end)
end
end)
end,
whileDead = true,
hideOnEscape = true,
timeout = 0 -- 335
}
-- Create Quest Menu
function TrackerMenu:GetMenuForQuest(quest)
local menu = {}
local subMenu = {}
for _, objective in pairs(quest.Objectives) do
local objectiveMenu = {}
TrackerMenu.addFocusOption(objectiveMenu, quest, objective)
TrackerMenu.addTomTomOption(objectiveMenu, nil, objective)
TrackerMenu.addShowHideObjectivesOption(objectiveMenu, quest, objective)
TrackerMenu.addShowObjectivesOnMapOption(objectiveMenu, quest, objective)
tinsert(subMenu, { text = objective.Description, hasArrow = true, menuList = objectiveMenu })
end
if next(quest.SpecialObjectives) then
for _, objective in pairs(quest.SpecialObjectives) do
local objectiveMenu = {}
TrackerMenu.addFocusOption(objectiveMenu, quest, objective)
TrackerMenu.addTomTomOption(objectiveMenu, nil, objective)
TrackerMenu.addShowHideObjectivesOption(objectiveMenu, quest, objective)
TrackerMenu.addShowObjectivesOnMapOption(objectiveMenu, quest, objective)
tinsert(subMenu, { text = objective.Description, hasArrow = true, menuList = objectiveMenu })
end
end
local coloredQuestName = QuestieLib:GetColoredQuestName(quest.Id, Questie.db.profile.enableTooltipsQuestLevel, true, true)
tinsert(menu, { text = coloredQuestName, isTitle = true })
TrackerMenu.addObjectiveOption(menu, subMenu, quest)
TrackerMenu.addFocusUnfocusOption(menu, quest)
TrackerMenu.addTomTomOption(menu, quest, nil)
TrackerMenu.minMaxQuestOption(menu, quest)
TrackerMenu.addShowHideQuestsOption(menu, quest)
TrackerMenu.addShowFinisherOnMapOption(menu, quest)
TrackerMenu.addShowInQuestLogOption(menu, quest)
TrackerMenu.addLinkToChatOption(menu, quest)
TrackerMenu.addUntrackOption(menu, quest)
TrackerMenu.addAbandonedQuest(menu, quest)
tinsert(menu, {
text = "|cFF39c0edWoWHead URL|r",
func = function()
StaticPopup_Show("QUESTIE_WOWHEAD_URL", quest.Id, nil, quest.Id)
end
})
TrackerMenu.addLockUnlockOption(menu)
tinsert(menu, {
text = l10n('Cancel'),
func = function()
end
})
return menu
end
-- Create local Achievement Menu functions
TrackerMenu.addAchieveLinkToChatOption = function(menu, achieve)
tinsert(menu, {
text = l10n('Link Achievement to chat'),
func = function()
LibDropDown:CloseDropDownMenus()
if (not ChatFrame1EditBox:IsVisible()) then
ChatFrame_OpenChat(GetAchievementLink(achieve.Id))
else
ChatEdit_InsertLink(GetAchievementLink(achieve.Id))
end
end
})
end
TrackerMenu.addShowInAchievementsOption = function(menu, achieve)
tinsert(menu, {
text = l10n('Show in Achievements Log'),
func = function()
LibDropDown:CloseDropDownMenus()
if (not AchievementFrame) then
AchievementFrame_LoadUI()
end
if (not AchievementFrame:IsShown()) then
AchievementFrame_ToggleAchievementFrame()
AchievementFrame_SelectAchievement(achieve.Id)
else
if (AchievementFrameAchievements.selection ~= achieve.Id) then
AchievementFrame_SelectAchievement(achieve.Id)
end
end
end
})
end
TrackerMenu.addUntrackAchieveOption = function(menu, achieve)
tinsert(menu, {
text = l10n('Untrack Achievement'),
func = function()
LibDropDown:CloseDropDownMenus()
QuestieTracker:UntrackAchieveId(achieve.Id)
QuestieTracker:UpdateAchieveTrackerCache(achieve.Id)
if (not AchievementFrame) then
AchievementFrame_LoadUI()
end
AchievementFrameAchievements_ForceUpdate()
QuestieCombatQueue:Queue(function()
QuestieTracker:Update()
end)
end
})
end
-- Register the WoWHead Achievement popup dialog
StaticPopupDialogs["QUESTIE_WOWHEAD_AURL"] = {
text = "WoWHead URL",
button2 = CLOSE,
hasEditBox = true,
editBoxWidth = 280,
EditBoxOnEnterPressed = function(self)
self:GetParent():Hide()
end,
EditBoxOnEscapePressed = function(self)
self:GetParent():Hide()
end,
OnShow = function(self)
local achieveID = self.text.text_arg1 or self.data
local name = select(2, GetAchievementInfo(achieveID))
self.text:SetFont("GameFontNormal", 12)
self.text:SetText(self.text:GetText() .. Questie:Colorize("\n\n" .. name, "gold"))
local langShort = string.sub(l10n:GetUILocale(), 1, 2) .. "."
if langShort == "en." then
langShort = ""
end
local wowheadLink
if langShort then
langShort = langShort:gsub("%.", "/") -- The Wotlk wowhead URL differs to the other Classic URLs
end
wowheadLink = "https://" .. "wowhead.com/wotlk/" .. langShort .. "achievement=" .. achieveID
self.editBox:SetText(wowheadLink)
self.editBox:SetFocus()
self.editBox:HighlightText()
self.editBox:SetScript("OnKeyDown", function(_, key)
if key == "C" and IsControlKeyDown() then
C_Timer.After(0.1, function()
self.editBox:GetParent():Hide()
ActionStatus_DisplayMessage(l10n("Copied URL to clipboard"), true)
end)
end
end)
end,
whileDead = true,
hideOnEscape = true,
timeout = 0 -- 335
}
-- Create Achievement Menu
function TrackerMenu:GetMenuForAchievement(achieve)
local menu = {}
tinsert(menu, { text = "|cFFFFFF00" .. select(2, GetAchievementInfo(achieve.Id)) .. "|r", isTitle = true })
TrackerMenu.addAchieveLinkToChatOption(menu, achieve)
TrackerMenu.addShowInAchievementsOption(menu, achieve)
for trackedId, _ in pairs(Questie.db.char.trackedAchievementIds) do
if trackedId == achieve.Id then
TrackerMenu.addUntrackAchieveOption(menu, achieve)
end
end
tinsert(menu, {
text = "|cFF39c0edWoWHead URL|r",
func = function()
StaticPopup_Show("QUESTIE_WOWHEAD_AURL", achieve.Id, nil, achieve.Id)
end
})
TrackerMenu.addLockUnlockOption(menu)
tinsert(menu, {
text = l10n('Cancel'),
func = function()
end
})
return menu
end