Files
coa-ai-voiceover/AI_VoiceOver/QuestOverlayUI.lua
T
andrew6180 1e9fa2aaca init
2023-04-16 00:31:14 -07:00

141 lines
5.4 KiB
Lua

setfenv(1, VoiceOver)
QuestOverlayUI = {}
QuestOverlayUI.__index = QuestOverlayUI
function QuestOverlayUI:new(soundQueue)
local questOverlayUI = {}
setmetatable(questOverlayUI, QuestOverlayUI)
questOverlayUI.soundQueue = soundQueue
questOverlayUI.questPlayButtons = {}
questOverlayUI.playingStates = {}
questOverlayUI.displayedButtons = {}
return questOverlayUI
end
function QuestOverlayUI:CreatePlayButton(questID)
local playButton = CreateFrame("Button", nil, QuestLogFrame)
playButton:SetWidth(20)
playButton:SetHeight(20)
playButton:SetHitRectInsets(2, 2, 2, 2)
playButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up")
playButton:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up")
playButton:GetDisabledTexture():SetDesaturated(true)
playButton:GetDisabledTexture():SetAlpha(0.33)
playButton:SetHighlightTexture("Interface\\BUTTONS\\UI-Panel-MinimizeButton-Highlight")
self.questPlayButtons[questID] = playButton
end
function QuestOverlayUI:UpdateQuestTitle(questLogTitleFrame, playButton, normalText, questCheck)
playButton:SetPoint("LEFT", normalText, "LEFT", 4, 0)
local formatedText = [[|TInterface\AddOns\AI_VoiceOver\Textures\spacer:1:24|t]] .. (normalText:GetText() or ""):trim()
normalText:SetText(formatedText)
QuestLogDummyText:SetText(formatedText)
questCheck:SetPoint("LEFT", normalText, "LEFT", normalText:GetStringWidth(), 0)
end
function QuestOverlayUI:UpdatePlayButtonTexture(questID, isPlaying)
local texturePath = isPlaying and "Interface\\TIMEMANAGER\\ResetButton" or
"Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"
if self.questPlayButtons[questID] then
self.questPlayButtons[questID]:SetNormalTexture(texturePath)
end
end
function QuestOverlayUI:UpdatePlayButton(soundTitle, questID, questLogTitleFrame, normalText, questCheck)
self.questPlayButtons[questID]:SetParent(questLogTitleFrame:GetParent())
self.questPlayButtons[questID]:SetFrameLevel(questLogTitleFrame:GetFrameLevel() + 2)
QuestOverlayUI:UpdateQuestTitle(questLogTitleFrame, self.questPlayButtons[questID], normalText, questCheck)
local questOverlayUI = self
self.questPlayButtons[questID]:SetScript("OnClick", function(self)
if questOverlayUI.questPlayButtons[questID].soundData == nil then
local npcID = DataModules:GetQuestLogNPCID(questID) -- TODO: Add fallbacks to item and object questgivers once VO for them is made
questOverlayUI.questPlayButtons[questID].soundData = {
event = Enums.SoundEvent.QuestAccept,
questID = questID,
name = npcID and DataModules:GetNPCName(npcID) or "Unknown Name",
title = soundTitle,
unitGUID = npcID and Utils:MakeGUID(Enums.GUID.Creature, npcID)
}
end
local button = self
local soundData = button.soundData
local questID = soundData.questID
local isPlaying = questOverlayUI.playingStates[questID] or false
if not isPlaying then
questOverlayUI.soundQueue:AddSoundToQueue(soundData)
questOverlayUI.playingStates[questID] = true
questOverlayUI:UpdatePlayButtonTexture(questID, true)
soundData.stopCallback = function()
questOverlayUI.playingStates[questID] = false
questOverlayUI:UpdatePlayButtonTexture(questID, false)
button.soundData = nil
end
else
questOverlayUI.soundQueue:RemoveSoundFromQueue(soundData)
end
end)
end
function QuestOverlayUI:UpdateQuestOverlayUI()
local numEntries, numQuests = GetNumQuestLogEntries()
-- Hide all buttons in displayedButtons
for _, button in pairs(self.displayedButtons) do
button:Hide()
end
if numEntries == 0 then
return
end
-- Clear displayedButtons
table.wipe(self.displayedButtons)
-- Traverse through the quests displayed in the UI
for i = 1, QUESTS_DISPLAYED do
local questIndex = i + Utils:GetQuestLogScrollOffset();
if questIndex > numEntries then
break
end
-- Get quest title
local questLogTitleFrame = Utils:GetQuestLogTitleFrame(i)
local normalText = Utils:GetQuestLogTitleNormalText(i)
local questCheck = Utils:GetQuestLogTitleCheck(i)
local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID = GetQuestLogTitle(
questIndex)
if not self.questPlayButtons[questID] then
self:CreatePlayButton(questID)
end
if not isHeader then
if DataModules:PrepareSound({ event = Enums.SoundEvent.QuestAccept, questID = questID }) then
self:UpdatePlayButton(title, questID, questLogTitleFrame, normalText, questCheck)
self.questPlayButtons[questID]:Enable()
else
self:UpdateQuestTitle(questLogTitleFrame, self.questPlayButtons[questID], normalText, questCheck)
self.questPlayButtons[questID]:Disable()
end
self.questPlayButtons[questID]:Show()
local isPlaying = self.playingStates[questID] or false
self:UpdatePlayButtonTexture(questID, isPlaying)
-- Add the button to displayedButtons
table.insert(self.displayedButtons, self.questPlayButtons[questID])
end
end
end