Quantcast
local NAME, ns = ...
local oUF = ns.oUF or oUF
assert(oUF, NAME.." was unable to locate oUF install.")

local f = CreateFrame('Frame')
local smoothing = {}
local abs, min, max, next = math.abs, math.min, math.max, next

f:SetScript('OnUpdate', function()
	local limit = 30/GetFramerate()
	for bar, value in next, smoothing do
		local cur = bar:GetValue()
		local new = cur + min((value-cur)/3, max(value-cur, limit))
		if new ~= new then
			-- Mad hax to prevent QNAN.
			new = value
		end
		bar:SetValue_(new)
		if cur == value or abs(new - value) < 2 then
			bar:SetValue_(value)
			smoothing[bar] = nil
		end
	end
end)

local function Smooth(self, value)
	local _, max = self:GetMinMaxValues()
	if value == self:GetValue() or (self._max and self._max ~= max) then
		smoothing[self] = nil
		self:SetValue_(value)
	else
		smoothing[self] = value
	end
	self._max = max
end

local function SmoothBar(self, bar, unset)
	if unset and bar.SetValue_ then
		bar.SetValue = bar.SetValue_
		bar.SetValue_ = nil
	elseif not unset and not bar.SetValue_ then
		bar.SetValue_ = bar.SetValue
		bar.SetValue = Smooth
	end
end

oUF:RegisterMetaFunction('SmoothBar', SmoothBar)