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

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

#include "dme_controls/AnimSetAttributeValue.h"
#include "datamodel/dmehandle.h"
#include "vgui_controls/EditablePanel.h"


//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CPresetSlider;
class CBaseAnimationSetEditor;
class CDmeAnimationSet;
class CSliderListPanel;
class CAddPresetDialog;
class CDmePreset;
class CDmePresetGroupEditorFrame;

namespace vgui
{
	class InputDialog;
}

struct FaderPreview_t
{
	FaderPreview_t() :
		name( 0 ),
		amount( 0 ),
		isbeingdragged( false ),
		holdingctrl( false ),
		values( 0 )
	{
	}
	const char		*name;
	float			amount;
	bool			isbeingdragged;
	bool			holdingctrl;
	AttributeDict_t *values;
	CDmeHandle< CDmePreset > preset;
};


//-----------------------------------------------------------------------------
// Base class for the preset fader panel
//-----------------------------------------------------------------------------
class CBaseAnimSetPresetFaderPanel : public vgui::EditablePanel
{
	DECLARE_CLASS_SIMPLE( CBaseAnimSetPresetFaderPanel, vgui::EditablePanel );
public:
	CBaseAnimSetPresetFaderPanel( vgui::Panel *parent, const char *className, CBaseAnimationSetEditor *editor );

	void	GetPreviewFader( FaderPreview_t& fader );

	void	ChangeAnimationSet( CDmeAnimationSet *newAnimSet );
	void	UpdateControlValues();

	void	ApplyPreset( float flScale, AttributeDict_t& dict );

	// Takes slider current values and creates a new preset
	void	AddNewPreset( const char *pGroupName, const char *pName );
	void	SetPresetFromSliders( CDmePreset *pPreset );
	virtual void	OnOverwritePreset( CDmePreset *pPreset );
	void	OnDeletePreset( CDmePreset *pPreset );

	virtual void ApplySchemeSettings( vgui::IScheme *scheme );

	virtual void ProceduralPreset_UpdateCrossfade( CDmePreset *pPreset, bool bFadeIn );

protected:
	MESSAGE_FUNC( OnTextChanged, "TextChanged" );
	MESSAGE_FUNC( OnAddPreset, "AddPreset" );
	MESSAGE_FUNC_PARAMS( OnAddNewPreset, "AddNewPreset", params );
	MESSAGE_FUNC( OnPresetsChanged, "PresetsChanged" );
	MESSAGE_FUNC( OnSetCrossfadeSpeed, "SetPresetCrossfadeSpeed" );
	MESSAGE_FUNC( OnManagePresets, "ManagePresets" );
	MESSAGE_FUNC_PARAMS( OnInputCompleted, "InputCompleted", params );
	MESSAGE_FUNC_PARAMS( OnPresetNameSelected, "PresetNameSelected", params );

protected:
	void OnAddCompleted( const char *pText, KeyValues *pContextKeyValues );
	void PopulateList( bool bChanged );
	void AddNewPreset( CDmePreset *pPreset );

	vgui::DHANDLE< CBaseAnimationSetEditor > m_hEditor;
	vgui::EditablePanel						*m_pWorkspace;
	vgui::TextEntry							*m_pFilter;
	CSliderListPanel						*m_pSliders;
	CDmeHandle< CDmeAnimationSet >			m_AnimSet;
	float									m_flLastFrameTime;
	CUtlString								m_Filter;
	vgui::DHANDLE< vgui::InputDialog >		m_hInputDialog;
	vgui::DHANDLE< CAddPresetDialog >		m_hAddPresetDialog;
	vgui::DHANDLE< CDmePresetGroupEditorFrame > m_hPresetEditor;

	CUtlVector< CDmeHandle< CDmePreset > >	m_CurrentPresetList;
};

#endif // BASEANIMSETPRESETFADERPANEL_H