Files
Questie-X/Modules/Journey/QuestieJourney.lua
T

218 lines
6.4 KiB
Lua

---@class QuestieJourney
local QuestieJourney = QuestieLoader:CreateModule("QuestieJourney")
local _QuestieJourney = QuestieJourney.private
QuestieJourneyFrame = nil
-------------------------
--Import modules.
-------------------------
---@type QuestiePlayer
local QuestiePlayer = QuestieLoader:ImportModule("QuestiePlayer")
---@type QuestieOptions
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
---@type ZoneDB
local ZoneDB = QuestieLoader:ImportModule("ZoneDB")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
---@type QuestieCombatQueue
local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue")
-- Useful doc about the AceGUI TreeGroup: https://github.com/hurricup/WoW-Ace3/blob/master/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
local tinsert = table.insert
QuestieJourney.continents = {}
QuestieJourney.zones = {}
QuestieJourney.tabGroup = nil
local AceGUI = LibStub("AceGUI-3.0")
local isWindowShown = false
_QuestieJourney.lastOpenWindow = "journey"
_QuestieJourney.lastZoneSelection = {}
local notesPopupWin
local notesPopupWinIsOpen = false
QuestieJourney.questCategoryKeys = {
EASTERN_KINGDOMS = 1,
KALIMDOR = 2,
OUTLAND = 3,
NORTHREND = 4,
DUNGEONS = 5,
BATTLEGROUNDS = 6,
CLASS = 7,
PROFESSIONS = 8,
EVENTS = 9,
}
function QuestieJourney:Initialize()
local continents = {}
for id, name in pairs(l10n.continentLookup) do
if not (name == "Outland" and Questie.IsClassic) and not (name == "Northrend" and (Questie.IsClassic or Questie.IsTBC)) then
continents[id] = l10n(name)
end
end
coroutine.yield()
continents[QuestieJourney.questCategoryKeys.CLASS] = QuestiePlayer:GetLocalizedClassName()
coroutine.yield()
self.continents = continents
self.zoneMap = ZoneDB:GetZonesWithQuests(true)
self.zones = ZoneDB:GetRelevantZones()
coroutine.yield()
self:BuildMainFrame()
end
function QuestieJourney:BuildMainFrame()
if not QuestieJourneyFrame then
local journeyFrame = AceGUI:Create("Frame")
journeyFrame:SetCallback("OnClose", function()
isWindowShown = false
if notesPopupWinIsOpen then
notesPopupWin:Hide()
notesPopupWin = nil
notesPopupWinIsOpen = false
end
end)
journeyFrame:SetTitle(l10n("%s's Journey", UnitName("player")))
journeyFrame:SetLayout("Fill")
journeyFrame:EnableResize(false)
QuestieCompat.SetResizeBounds(journeyFrame.frame, 550, 400)
local tabGroup = AceGUI:Create("TabGroup")
tabGroup:SetLayout("Flow")
tabGroup:SetTabs({
{
text = l10n('My Journey'),
value="journey"
},
{
text = l10n('Quests by Zone'),
value="zone"
},
{
text = l10n('Advanced Search'),
value="search"
}
})
tabGroup:SetCallback("OnGroupSelected", function(widget, _, group) _QuestieJourney:HandleTabChange(widget, group) end)
tabGroup:SelectTab("journey")
QuestieJourney.tabGroup = tabGroup
journeyFrame:AddChild(QuestieJourney.tabGroup)
local settingsButton = AceGUI:Create("Button")
settingsButton:SetWidth(160)
settingsButton:SetPoint("TOPRIGHT", journeyFrame.frame, "TOPRIGHT", -50, -13)
settingsButton:SetText(l10n('Questie Options'))
settingsButton:SetCallback("OnClick", function()
QuestieCombatQueue:Queue(function()
QuestieJourney:ToggleJourneyWindow()
QuestieOptions:OpenConfigWindow()
end)
end)
journeyFrame:AddChild(settingsButton)
journeyFrame:Hide()
QuestieJourneyFrame = journeyFrame
table.insert(UISpecialFrames, "QuestieJourneyFrame")
end
end
function QuestieJourney:IsShown()
return isWindowShown
end
function QuestieJourney:ToggleJourneyWindow()
-- There are ways to toggle this function before the frame has been created
if QuestieJourneyFrame then
if (not isWindowShown) then
PlaySound(882)
local treeGroup = _QuestieJourney:HandleTabChange(_QuestieJourney.containerCache, _QuestieJourney.lastOpenWindow)
if treeGroup then
_QuestieJourney.treeCache = treeGroup
end
QuestieJourneyFrame:Show()
isWindowShown = true
else
QuestieJourneyFrame:Hide()
isWindowShown = false
end
else
Questie:Error("QuestieJourney:ToggleJourneyWindow() called before QuestieJourneyFrame was initialized!")
end
end
function QuestieJourney:PlayerLevelUp(level)
-- Complete Quest added to Journey
---@type JourneyEntry
local entry = {
Event = "Level",
NewLevel = level,
Timestamp = time()
}
tinsert(Questie.db.char.journey, entry)
end
function QuestieJourney:AcceptQuest(questId)
-- Add quest accept journey note.
---@type JourneyEntry
local entry = {
Event = "Quest",
SubType = "Accept",
Quest = questId,
Level = QuestiePlayer.GetPlayerLevel(),
Timestamp = time()
}
tinsert(Questie.db.char.journey, entry)
end
function QuestieJourney:AbandonQuest(questId)
-- Abandon Quest added to Journey
-- first check to see if the quest has been completed already or not
local skipAbandon = false
for i in ipairs(Questie.db.char.journey) do
local entry = Questie.db.char.journey[i]
if entry.Event == "Quest" then
if entry.Quest == questId then
if entry.SubType == "Complete" then
skipAbandon = true
end
end
end
end
if not skipAbandon then
---@type JourneyEntry
local entry = {
Event = "Quest",
SubType = "Abandon",
Quest = questId,
Level = QuestiePlayer.GetPlayerLevel(),
Timestamp = time()
}
tinsert(Questie.db.char.journey, entry)
end
end
function QuestieJourney:CompleteQuest(questId)
-- Complete Quest added to Journey
---@class JourneyEntry
local entry = {
Event = "Quest",
SubType = "Complete",
Quest = questId,
Level = QuestiePlayer.GetPlayerLevel(),
Timestamp = time()
}
tinsert(Questie.db.char.journey, entry)
end