DIFF

AnimatedGridSpacer.c

// Different easing functions
enum AnimatedGridSpacerEasingType
{
	EASE_LINEAR,
	EASE_IN_OUT_CUBIC,
	EASE_IN_OUT_QUART,
	EASE_OUT_BOUNCE,
	EASE_OUT_BACK
}
	
class AnimatedGridSpacer
{
	Widget m_GridSpacer;
	float m_ColumWidth = 0;
	
	float m_AnimationDuration = 0.25;
	float m_AnimationTime = 0;
	
	float m_CurrentPosX, m_CurrentPosY;
	float m_BasePosX, m_BasePosY;
	float m_StartPosX, m_TargetPosX;
	
	bool m_IsAnimating = false;
	int m_CurrentColum = 0;
	int m_MaxColums = 3;
		
	AnimatedGridSpacerEasingType m_EasingType = AnimatedGridSpacerEasingType.EASE_IN_OUT_CUBIC;
	
	ref ScriptInvoker m_OnAnimationComplete;
	
	void AnimatedGridSpacer(Widget gridSpacer, int maxColums, float animDuration = 0.25, AnimatedGridSpacerEasingType easing = AnimatedGridSpacerEasingType.EASE_IN_OUT_CUBIC)
	{
		m_GridSpacer = gridSpacer;
		m_MaxColums = maxColums;
		m_AnimationDuration = animDuration;
		m_EasingType = easing;
		
		if (m_GridSpacer)
		{
			SetColumWidth();
			
			m_GridSpacer.GetScreenPos(m_CurrentPosX, m_CurrentPosY);
			m_GridSpacer.GetScreenPos(m_BasePosX, m_BasePosY);
			m_CurrentPosX = m_BasePosX;
			m_CurrentPosY = m_BasePosY;
		}
		
		m_OnAnimationComplete = new ScriptInvoker();
	}
	
	void SetColumWidth()
	{
		if (!m_GridSpacer)
			return;
		
		Widget panel = m_GridSpacer.GetChildren();
		if (panel)
		{
			float w, h;
			panel.GetSize(w, h);
			m_ColumWidth = w;
		}
	}
	
	float ApplyEasing(float t)
	{
		switch(m_EasingType)
		{
			case AnimatedGridSpacerEasingType.EASE_LINEAR:
			{
				return t;
			}
			case AnimatedGridSpacerEasingType.EASE_IN_OUT_CUBIC:
			{
				return Easing.EaseInOutCubic(t);
			}
			case AnimatedGridSpacerEasingType.EASE_IN_OUT_QUART:
			{
				return Easing.EaseInOutQuad(t);
			}
			case AnimatedGridSpacerEasingType.EASE_OUT_BOUNCE:
			{
				return Easing.EaseOutBounce(t);
			}
			case AnimatedGridSpacerEasingType.EASE_OUT_BACK:
			{
				return Easing.EaseOutBack(t);
			}
		}
		return t;
	}
	
	void AnimateToColum(int targetColumn)
	{
		if (m_IsAnimating || targetColumn == m_CurrentColum)
			return;
		
		if (m_IsAnimating || targetColumn == m_CurrentColum) 
			return;
				
		m_StartPosX = m_CurrentPosX;
		m_TargetPosX = m_BasePosX - (targetColumn * m_ColumWidth);
		m_CurrentColum = targetColumn;
		m_AnimationTime = 0;
		m_IsAnimating = true;
	}
	
	void MoveRight()
	{
		if (!m_IsAnimating)
		{
			int nextColum = m_CurrentColum + 1;
			if (nextColum <= m_MaxColums)
			{
				AnimateToColum(nextColum);
			}
		}
	}
	
	void MoveLeft()
	{
		if (!m_IsAnimating)
		{
			int prevColum = m_CurrentColum - 1;
			if (prevColum >= 0)
			{
				AnimateToColum(prevColum);
			}
		}
	}
	
	void Update(float timeslice)
	{		
		if (!m_IsAnimating || !m_GridSpacer) 
			return;
		
		m_AnimationTime += timeslice;		
		if (m_AnimationTime >= m_AnimationDuration)
		{
			m_CurrentPosX = m_TargetPosX;
			m_GridSpacer.SetScreenPos(m_CurrentPosX, m_CurrentPosY);
			m_AnimationTime = 0;
			m_IsAnimating = false;
			
			m_GridSpacer.GetScreenPos(m_CurrentPosX, m_CurrentPosY);
		}
		else
		{
			float progress = m_AnimationTime / m_AnimationDuration;
			float easedProgress = ApplyEasing(progress);
			
			m_CurrentPosX = m_StartPosX + (m_TargetPosX - m_StartPosX) * easedProgress;
			m_GridSpacer.SetScreenPos(m_CurrentPosX, m_CurrentPosY);
			
			m_OnAnimationComplete.Invoke();
		}
	}
		
	void SetAnimationDuration(float duration)
	{
		m_AnimationDuration = duration;
	}
	
	void SetEasingType(AnimatedGridSpacerEasingType easing)
	{
		m_EasingType = easing;
	}
	
	bool IsAnimating()
	{
		return m_IsAnimating;
	}
	
	int GetCurrentRow()
	{
		return m_CurrentColum;
	}
}