//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=======================================================================================//

#ifndef SLIDESHOWPANEL_H
#define SLIDESHOWPANEL_H
#ifdef _WIN32
#pragma once
#endif

#include "vgui_controls/EditablePanel.h"
#include "vgui_controls/ProgressBar.h"
#include "vgui_controls/ImagePanel.h"

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Allows fade from one image to another
//-----------------------------------------------------------------------------
class CCrossfadableImagePanel : public EditablePanel
{
	DECLARE_CLASS_SIMPLE( CCrossfadableImagePanel, EditablePanel );
public:
	CCrossfadableImagePanel( Panel* pParent, const char *pName );
	~CCrossfadableImagePanel();

	virtual void ApplySettings( KeyValues *pInResourceData );
	virtual void ApplySchemeSettings( IScheme *pScheme );
	virtual void PerformLayout();

	// A duplicate of the ImagePanel interface - the only difference being that
	// here we have blend times for SetImage().
	void SetImage( IImage *pImage, float flBlendTime = 0.0f );
	void SetImage( const char *pImageName, float flBlendTime = 0.0f );

	void SetShouldScaleImage( bool bState );
	void SetScaleAmount( float flScale );
	void SetDrawColor( Color clrDrawColor );

	IImage *GetImage();
	const char *GetImageName();
	void SetFillColor( Color c );
	float GetScaleAmount();
	bool GetShouldScaleImage();
	Color GetFillColor();
	Color GetDrawColor();

	virtual void InstallMouseHandler( Panel *pHandler );

private:
	virtual void OnSizeChanged( int nWide, int nTall );
	virtual void OnTick();

	inline ImagePanel *SrcImg()	{ return m_pImages[  m_iSrcImg ]; }
	inline ImagePanel *DstImg() { return m_pImages[ !m_iSrcImg ]; }

	void SetupImageBlend( float flBlendTime );

	float			m_flStartBlendTime;	// the gpGlobals->realtime when we started blending
	float			m_flBlendTime;		// amount of time to blend from one image to the next one
	float			m_flBlend;			// blend value in [0,1] where 0 maps to the source image, and 1 maps to the dest image
	bool			m_bBlending;		// are we currently transitioning/blending from one image to another?
	ImagePanel*		m_pImages[2];
	int				m_iSrcImg;	// 0 or 1
};

//-----------------------------------------------------------------------------
// Purpose: Displays a slideshow of images at a set interval
//-----------------------------------------------------------------------------
class CSlideshowPanel : public EditablePanel
{
	DECLARE_CLASS_SIMPLE( CSlideshowPanel, EditablePanel );
public:
	CSlideshowPanel( Panel *pParent, const char *pName );
	~CSlideshowPanel();

	// Pass in a vgui-relative path, like "training/screenshots/cp_dustbowl_", and
	// the slideshow panel will add "0.vmt", "1.vmt" etc. until it can't find anymore images.
	void FillWithImages( const char *pBasePath );

	void AddImage( const char *pImageName );
	void AddImage( IImage *pImage );

	void SetInterval( float flInterval );
	void SetTransitionTime( float flTransitionLength );

	CCrossfadableImagePanel *GetImagePanel()			{ return m_pImagePanel; }

	int GetImageCount() const							{ return m_vecImages.Count(); }

private:
	virtual void ApplySettings( KeyValues *pInResourceData );
	virtual void OnSizeChanged( int nWide, int nTall );
	virtual void OnTick();
	void UpdateNextTransitionTime();

	CCrossfadableImagePanel		*m_pImagePanel;
	CUtlVector< IImage * >		m_vecImages;
	float						m_flNextTransitionTime;	// gpGlobals->realtime of time when we should transition next
	float						m_flInterval;			// Amount of time between blend begins to next image, in seconds
	float						m_flTransitionLength;	// Length of each transition
	int							m_iCurImg;				// Current image index
};

#endif // SLIDESHOWPANEL_H