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