fix: defer tracked bar refreshes while moving
This commit is contained in:
@@ -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")
|
||||
Reference in New Issue
Block a user