-- ------------------------------------------------------------------------------ --
--                                TradeSkillMaster                                --
--                          https://tradeskillmaster.com                          --
--    All Rights Reserved - Detailed license information included with addon.     --
-- ------------------------------------------------------------------------------ --

--- AlphaAnimatedFrame UI Element Class.
-- An alpha animated frame is a frame which allows for animating its alpha. It is a subclass of the @{Frame} class.
-- @classmod AlphaAnimatedFrame

local _, TSM = ...
local AlphaAnimatedFrame = TSM.Include("LibTSMClass").DefineClass("AlphaAnimatedFrame", TSM.UI.Frame)
local UIElements = TSM.Include("UI.UIElements")
UIElements.Register(AlphaAnimatedFrame)
TSM.UI.AlphaAnimatedFrame = AlphaAnimatedFrame



-- ============================================================================
-- Public Class Methods
-- ============================================================================

function AlphaAnimatedFrame.__init(self)
	self.__super:__init()

	local frame = self:_GetBaseFrame()
	self._ag = frame:CreateAnimationGroup()
	self._ag:SetLooping("BOUNCE")
	self._alpha = self._ag:CreateAnimation("Alpha")
end

function AlphaAnimatedFrame.Acquire(self)
	self._alpha:SetFromAlpha(1)
	self._alpha:SetToAlpha(1)
	self._alpha:SetDuration(1)
	self.__super:Acquire()
end

function AlphaAnimatedFrame.Release(self)
	self._ag:Stop()
	self.__super:Release()
end

--- Sets the range of the alpha animation.
-- @tparam AlphaAnimatedFrame self The alpha animated frame object
-- @tparam number fromAlpha The initial alpha value (usually 1)
-- @tparam number toAlpha The end alpha value (between 0 and 1 inclusive)
-- @treturn AlphaAnimatedFrame The alpha animated frame object
function AlphaAnimatedFrame.SetRange(self, fromAlpha, toAlpha)
	self._alpha:SetFromAlpha(fromAlpha)
	self._alpha:SetToAlpha(toAlpha)
	return self
end

--- Sets the duration of the animation.
-- @tparam AlphaAnimatedFrame self The alpha animated frame object
-- @tparam number duration The duration in seconds
-- @treturn AlphaAnimatedFrame The alpha animated frame object
function AlphaAnimatedFrame.SetDuration(self, duration)
	self._alpha:SetDuration(duration)
	return self
end

--- Sets whether or not the animation is playing.
-- @tparam AlphaAnimatedFrame self The alpha animated frame object
-- @tparam boolean play Whether the animation should be playing or not
-- @treturn AlphaAnimatedFrame The alpha animated frame object
function AlphaAnimatedFrame.SetPlaying(self, play)
	if play then
		self._ag:Play()
	else
		self._ag:Stop()
	end
	return self
end

--- Gets whether or not the animation is playing.
-- @tparam AlphaAnimatedFrame self The alpha animated frame object
-- @treturn boolean Whether the animation is playing
function AlphaAnimatedFrame.IsPlaying(self)
	return self._ag:IsPlaying()
end
