From 889cbfa7bb82fad8d313b21db31a720f3f5abba8 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Sat, 5 Sep 2026 16:20:26 +0200 Subject: [PATCH] fix: avoid recycling visible cache data before redraw --- Data/CacheLifecycleSafety.lua | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Data/CacheLifecycleSafety.lua diff --git a/Data/CacheLifecycleSafety.lua b/Data/CacheLifecycleSafety.lua new file mode 100644 index 0000000..34d625a --- /dev/null +++ b/Data/CacheLifecycleSafety.lua @@ -0,0 +1,75 @@ +-- Guda ClassicAPI cache lifecycle safety +-- Whole-cache invalidation is deferred to in-place dirty refreshes while the +-- corresponding UI is visible. This prevents pooled item tables still held by +-- visible buttons from being cleared/reused before their redraw runs. +-- Lua 5.0 compatible. + +local addon = Guda +local BagScanner = addon.Modules.BagScanner +local BankScanner = addon.Modules.BankScanner +if not BagScanner or not BankScanner then return end + +local oldBagClearCache = BagScanner.ClearCache +local oldBagInvalidateCache = BagScanner.InvalidateCache +local oldBankClearCache = BankScanner.ClearCache +local oldBankInvalidateCache = BankScanner.InvalidateCache + +local function IsShown(name) + local frame = getglobal(name) + return frame and frame.IsShown and frame:IsShown() +end + +local function MarkAllBagsDirty() + if addon.Constants and addon.Constants.BAGS then + for _, bagID in ipairs(addon.Constants.BAGS) do + BagScanner:InvalidateBag(bagID) + end + else + for bagID = 0, 4 do + BagScanner:InvalidateBag(bagID) + end + end + BagScanner:InvalidateBag(-2) +end + +local function MarkAllBankBagsDirty() + if addon.Constants and addon.Constants.BANK_BAGS then + for _, bagID in ipairs(addon.Constants.BANK_BAGS) do + BankScanner:InvalidateBag(bagID) + end + end +end + +function BagScanner:ClearCache() + if IsShown("Guda_BagFrame") then + MarkAllBagsDirty() + return + end + return oldBagClearCache(self) +end + +function BagScanner:InvalidateCache() + if IsShown("Guda_BagFrame") then + MarkAllBagsDirty() + return + end + return oldBagInvalidateCache(self) +end + +function BankScanner:ClearCache() + if BankScanner:IsBankOpen() and IsShown("Guda_BankFrame") then + MarkAllBankBagsDirty() + return + end + return oldBankClearCache(self) +end + +function BankScanner:InvalidateCache() + if BankScanner:IsBankOpen() and IsShown("Guda_BankFrame") then + MarkAllBankBagsDirty() + return + end + return oldBankInvalidateCache(self) +end + +addon:Debug("ClassicAPI cache lifecycle safety enabled")