From 4087c853a1794e69b310f59225197dcd2c912015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Jaro=C5=A1?= Date: Sun, 4 May 2025 10:45:46 +0200 Subject: [PATCH] Refactor message removal logic and introduce unique queue IDs. --- Addon/Code/Speech.lua | 54 ++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/Addon/Code/Speech.lua b/Addon/Code/Speech.lua index 9960fd3..b2beb1d 100755 --- a/Addon/Code/Speech.lua +++ b/Addon/Code/Speech.lua @@ -2,6 +2,7 @@ local _, addon = ... local messages = {} local GAP = 2 +local queueCounter = 0 local function ShowSpeech(Frame, offsetY) Frame:ClearAllPoints() @@ -33,21 +34,37 @@ local function ReflowMessages(requery) end end -local function RemoveMessage(frame) - for i, fs in ipairs(messages) do - if fs == frame then - local animation = fs:CreateAnimationGroup() - local fadeOut = animation:CreateAnimation("Alpha") - fadeOut:SetFromAlpha(1) - fadeOut:SetToAlpha(0) - fadeOut:SetDuration(1) - fadeOut:SetStartDelay(0) - animation:SetScript("OnFinished", function() +local function RemoveMessage(queueId) + for _, fs in ipairs(messages) do + if fs.queueId == queueId and not fs._removing then + fs._removing = true + if fs:IsShown() and (fs:GetAlpha() or 1) > 0.01 then + local animation = fs:CreateAnimationGroup() + local fadeOut = animation:CreateAnimation("Alpha") + fadeOut:SetFromAlpha(fs:GetAlpha() or 1) + fadeOut:SetToAlpha(0) + 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() - table.remove(messages, i) - ReflowMessages() - end) - animation:Play() + 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 break end end @@ -60,11 +77,16 @@ local function AddMessage(sender, message) local MessageFrame = addon.SpeechFrame:CreateMessage() MessageFrame.Message:SetText(text) + queueCounter = queueCounter + 1 + MessageFrame.queueId = queueCounter table.insert(messages, MessageFrame) - ReflowMessages() + + C_Timer.After(0.1, function() + ReflowMessages() + end) C_Timer.After(15, function() - RemoveMessage(MessageFrame) + RemoveMessage(MessageFrame.queueId) end) end addon.API.AddSpeechMessage = AddMessage