Refactor message removal logic and introduce unique queue IDs.
All checks were successful
forgejo/Czech Quests/addon/pipeline/head This commit looks good

This commit is contained in:
Roman Jaroš 2025-05-04 10:45:46 +02:00
parent 9a0fa4fd09
commit 4087c853a1

View file

@ -2,6 +2,7 @@ local _, addon = ...
local messages = {} local messages = {}
local GAP = 2 local GAP = 2
local queueCounter = 0
local function ShowSpeech(Frame, offsetY) local function ShowSpeech(Frame, offsetY)
Frame:ClearAllPoints() Frame:ClearAllPoints()
@ -33,21 +34,37 @@ local function ReflowMessages(requery)
end end
end end
local function RemoveMessage(frame) local function RemoveMessage(queueId)
for i, fs in ipairs(messages) do for _, fs in ipairs(messages) do
if fs == frame then if fs.queueId == queueId and not fs._removing then
local animation = fs:CreateAnimationGroup() fs._removing = true
local fadeOut = animation:CreateAnimation("Alpha") if fs:IsShown() and (fs:GetAlpha() or 1) > 0.01 then
fadeOut:SetFromAlpha(1) local animation = fs:CreateAnimationGroup()
fadeOut:SetToAlpha(0) local fadeOut = animation:CreateAnimation("Alpha")
fadeOut:SetDuration(1) fadeOut:SetFromAlpha(fs:GetAlpha() or 1)
fadeOut:SetStartDelay(0) fadeOut:SetToAlpha(0)
animation:SetScript("OnFinished", function() fadeOut:SetDuration(1)
animation:SetScript("OnFinished", function()
fs:Hide()
for idx, msg in ipairs(messages) do
if msg.queueId == fs.queueId then
table.remove(messages, idx)
break
end
end
C_Timer.After(0, function() ReflowMessages() end)
end)
animation:Play()
else
fs:Hide() fs:Hide()
table.remove(messages, i) for idx, msg in ipairs(messages) do
ReflowMessages() if msg.queueId == fs.queueId then
end) table.remove(messages, idx)
animation:Play() break
end
end
C_Timer.After(0, function() ReflowMessages() end)
end
break break
end end
end end
@ -60,11 +77,16 @@ local function AddMessage(sender, message)
local MessageFrame = addon.SpeechFrame:CreateMessage() local MessageFrame = addon.SpeechFrame:CreateMessage()
MessageFrame.Message:SetText(text) MessageFrame.Message:SetText(text)
queueCounter = queueCounter + 1
MessageFrame.queueId = queueCounter
table.insert(messages, MessageFrame) table.insert(messages, MessageFrame)
ReflowMessages()
C_Timer.After(0.1, function()
ReflowMessages()
end)
C_Timer.After(15, function() C_Timer.After(15, function()
RemoveMessage(MessageFrame) RemoveMessage(MessageFrame.queueId)
end) end)
end end
addon.API.AddSpeechMessage = AddMessage addon.API.AddSpeechMessage = AddMessage