From 024078a8314cd965b688f0dd925dd6a4477c10e4 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Sat, 5 Sep 2026 23:18:34 +0200 Subject: [PATCH] fix: defer tracked bar refreshes while moving --- UI/TrackedItemBarMoveSafety.lua | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 UI/TrackedItemBarMoveSafety.lua diff --git a/UI/TrackedItemBarMoveSafety.lua b/UI/TrackedItemBarMoveSafety.lua new file mode 100644 index 0000000..5dd2cc3 --- /dev/null +++ b/UI/TrackedItemBarMoveSafety.lua @@ -0,0 +1,69 @@ +-- Guda Tracked Item Bar movement safety +-- Prevents structural Tracked Item Bar refreshes while the frame is being dragged. +-- Lua 5.0 compatible. + +local addon = Guda +if not addon or not addon.Modules or not addon.Modules.TrackedItemBar then return end + +local TrackedItemBar = addon.Modules.TrackedItemBar +if not TrackedItemBar.Update then return end + +local OriginalUpdate = TrackedItemBar.Update + +local function FlushDeferredUpdate(barFrame) + if not barFrame or barFrame.isMoving then return end + if not barFrame._gudaTrackedBarDeferredUpdate then return end + + barFrame._gudaTrackedBarDeferredUpdate = nil + TrackedItemBar:Update() +end + +local function WrapMouseUp(frame, barFrame) + if not frame or frame._gudaTrackedBarMoveSafetyWrapped then return end + + local originalMouseUp = frame:GetScript("OnMouseUp") + frame._gudaTrackedBarMoveSafetyWrapped = true + + frame:SetScript("OnMouseUp", function() + if originalMouseUp then + originalMouseUp() + end + + FlushDeferredUpdate(barFrame or Guda_TrackedItemBar) + end) +end + +local function EnsureMoveSafetyHooks() + local barFrame = Guda_TrackedItemBar + if not barFrame then return end + + -- The bar itself can be dragged from its empty area. + WrapMouseUp(barFrame, barFrame) + + -- Tracked-item buttons can also start/stop movement on behalf of the bar. + -- Buttons are created dynamically, so wrap every currently existing one. + local i = 1 + while true do + local button = getglobal("Guda_TrackedItemBarButton" .. i) + if not button then break end + WrapMouseUp(button, barFrame) + i = i + 1 + end +end + +function TrackedItemBar:Update() + local barFrame = Guda_TrackedItemBar + + -- BAG_UPDATE, PLAYER_LEVEL_UP and other refreshes can arrive while + -- StartMoving() is active. Rebuilding/hiding/resizing the frame in that + -- state is unsafe on 1.12, so coalesce them into one post-drag refresh. + if barFrame and barFrame.isMoving then + barFrame._gudaTrackedBarDeferredUpdate = true + return + end + + OriginalUpdate(self) + EnsureMoveSafetyHooks() +end + +addon:Debug("TrackedItemBar movement safety enabled")