fix: avoid recycling visible cache data before redraw
This commit is contained in:
@@ -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")
|
||||
Reference in New Issue
Block a user