summaryrefslogtreecommitdiff
path: root/vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp')
-rw-r--r--vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp1504
1 files changed, 1504 insertions, 0 deletions
diff --git a/vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp b/vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp
new file mode 100644
index 0000000..13d97cf
--- /dev/null
+++ b/vgui2/dme_controls/BaseAnimSetPresetFaderPanel.cpp
@@ -0,0 +1,1504 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+#include "dme_controls/BaseAnimSetPresetFaderPanel.h"
+#include "dme_controls/DmePresetGroupEditorPanel.h"
+#include "vgui_controls/InputDialog.h"
+#include "vgui_controls/Button.h"
+#include "vgui_controls/Slider.h"
+#include "vgui_controls/ComboBox.h"
+#include "vgui_controls/TextImage.h"
+#include "vgui_controls/TextEntry.h"
+#include "vgui_controls/MessageBox.h"
+#include "vgui_controls/Menu.h"
+#include "vgui_controls/PanelListPanel.h"
+#include "movieobjects/dmeanimationset.h"
+#include "tier1/KeyValues.h"
+#include "dme_controls/dmecontrols_utils.h"
+#include "vstdlib/random.h"
+#include "vgui/IInput.h"
+#include "vgui/ISurface.h"
+#include "dme_controls/BaseAnimSetAttributeSliderPanel.h"
+#include "dme_controls/BaseAnimationSetEditor.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+using namespace vgui;
+
+float ifm_fader_timescale = 5.0f;
+
+class CPresetSlider;
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Utility dialog, used to let user type in some text
+//-----------------------------------------------------------------------------
+class CAddPresetDialog : public vgui::BaseInputDialog
+{
+ DECLARE_CLASS_SIMPLE( CAddPresetDialog, vgui::BaseInputDialog );
+
+public:
+ CAddPresetDialog( vgui::Panel *parent );
+
+ void DoModal( CDmeAnimationSet *pAnimationSet, KeyValues *pContextKeyValues = NULL );
+
+protected:
+ // command buttons
+ virtual void OnCommand(const char *command);
+
+private:
+ vgui::TextEntry *m_pInput;
+ vgui::ComboBox *m_pPresetGroup;
+};
+
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CAddPresetDialog::CAddPresetDialog( vgui::Panel *parent ) : BaseClass( parent, "Enter Preset Name" )
+{
+ m_pInput = new TextEntry( this, "PresetName" );
+ m_pPresetGroup = new vgui::ComboBox( this, "PresetGroup", 8, true );
+ SetDeleteSelfOnClose( false );
+
+ LoadControlSettings( "resource/addpresetdialog.res" );
+}
+
+
+void CAddPresetDialog::DoModal( CDmeAnimationSet *pAnimationSet, KeyValues *pContextKeyValues )
+{
+ int nTextLength = m_pInput->GetTextLength() + 1;
+ char* pCurrentGroupName = (char*)_alloca( nTextLength * sizeof(char) );
+ m_pInput->GetText( pCurrentGroupName, nTextLength );
+
+ m_pPresetGroup->DeleteAllItems();
+
+ // Populate the combo box with preset group names
+ CDmrElementArray< CDmePresetGroup > presetGroupList = pAnimationSet->GetPresetGroups();
+ int nCount = presetGroupList.Count();
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CDmePresetGroup *pPresetGroup = presetGroupList[i];
+ if ( pPresetGroup->m_bIsReadOnly )
+ continue;
+
+ KeyValues *kv = new KeyValues( "entry" );
+ SetElementKeyValue( kv, "presetGroup", pPresetGroup );
+ int nItemID = m_pPresetGroup->AddItem( pPresetGroup->GetName(), kv );
+ if ( pCurrentGroupName && !Q_stricmp( pPresetGroup->GetName(), pCurrentGroupName ) )
+ {
+ m_pPresetGroup->ActivateItem( nItemID );
+ }
+ }
+
+ BaseClass::DoModal( pContextKeyValues );
+
+ m_pInput->SetText( "" );
+ m_pInput->RequestFocus();
+
+ PlaceUnderCursor( );
+}
+
+
+//-----------------------------------------------------------------------------
+// command handler
+//-----------------------------------------------------------------------------
+void CAddPresetDialog::OnCommand( const char *command )
+{
+ if ( !Q_stricmp( command, "OK" ) )
+ {
+ int nTextLength = m_pInput->GetTextLength() + 1;
+ char* txt = (char*)_alloca( nTextLength * sizeof(char) );
+ m_pInput->GetText( txt, nTextLength );
+
+ nTextLength = m_pPresetGroup->GetTextLength() + 1;
+ char* pPresetGroupName = (char*)_alloca( nTextLength * sizeof(char) );
+ m_pPresetGroup->GetText( pPresetGroupName, nTextLength );
+
+ KeyValues *pCurrentGroup = m_pPresetGroup->GetActiveItemUserData();
+ CDmePresetGroup *pPresetGroup = pCurrentGroup ? GetElementKeyValue<CDmePresetGroup>( pCurrentGroup, "presetGroup" ) : NULL;
+ if ( pPresetGroup && Q_stricmp( pPresetGroup->GetName(), pPresetGroupName ) )
+ {
+ pPresetGroup = NULL;
+ }
+ KeyValues *kv = new KeyValues( "PresetNameSelected", "text", txt );
+ kv->SetString( "presetGroupName", pPresetGroupName );
+ SetElementKeyValue( kv, "presetGroup", pPresetGroup );
+
+ if ( m_pContextKeyValues )
+ {
+ kv->AddSubKey( m_pContextKeyValues );
+ m_pContextKeyValues = NULL;
+ }
+ PostActionSignal( kv );
+ CloseModal();
+ return;
+ }
+
+ if ( !Q_stricmp( command, "Cancel") )
+ {
+ CloseModal();
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+
+
+//-----------------------------------------------------------------------------
+//
+// CPresetSliderEdgeButton: The buttons that lie on either side of the PresetSlider
+//
+//-----------------------------------------------------------------------------
+class CPresetSliderEdgeButton : public Button
+{
+ DECLARE_CLASS_SIMPLE( CPresetSliderEdgeButton, Button );
+public:
+ CPresetSliderEdgeButton( CPresetSlider *parent, const char *panelName, const char *text );
+
+private:
+ virtual void OnCursorMoved(int x, int y);
+ virtual void OnMousePressed( vgui::MouseCode code );
+ virtual void OnMouseReleased( vgui::MouseCode code );
+ virtual void OnMouseDoublePressed( vgui::MouseCode code );
+
+ CPresetSlider *m_pSlider;
+};
+
+
+//-----------------------------------------------------------------------------
+//
+// CPresetSlider: The actual preset slider itself!
+//
+//-----------------------------------------------------------------------------
+class CPresetSlider : public Slider
+{
+ DECLARE_CLASS_SIMPLE( CPresetSlider, Slider );
+
+public:
+
+ friend class CPresetSliderEdgeButton;
+
+ CPresetSlider( CBaseAnimSetPresetFaderPanel *parent, const char *panelName, CDmePreset *pPreset );
+ ~CPresetSlider();
+
+ void SetControlValues( );
+
+ void SetGradientColor( const Color& clr );
+
+ float GetCurrent();
+ void SetPos( float frac );
+
+ AttributeDict_t *GetAttributeDict();
+
+ bool IsPreviewSlider();
+ bool IsDragging();
+
+ void UpdateProceduralValues();
+
+ CDmePreset *GetPreset();
+
+protected:
+
+ virtual void Paint();
+ virtual void PaintBackground();
+ virtual void ApplySchemeSettings( IScheme *scheme );
+ virtual void GetTrackRect( int &x, int &y, int &w, int &h );
+ virtual void PerformLayout();
+ virtual void OnMousePressed(MouseCode code);
+ virtual void OnMouseDoublePressed(MouseCode code);
+ virtual void OnMouseReleased(MouseCode code);
+ virtual void OnKeyCodeTyped( KeyCode code );
+ virtual void OnCursorMoved(int x, int y);
+
+ MESSAGE_FUNC( OnShowContextMenu, "OnShowContextMenu" );
+ MESSAGE_FUNC( OnRename, "OnRename" );
+ MESSAGE_FUNC( OnDelete, "OnDelete" );
+
+ MESSAGE_FUNC( OnOverwrite, "OnOverwrite" );
+
+ MESSAGE_FUNC_PARAMS( OnInputCompleted, "InputCompleted", params );
+
+ MESSAGE_FUNC( OnDeleteConfirmed, "OnDeleteConfirmed" );
+ MESSAGE_FUNC( OnOverwriteConfirmed, "OnOverwriteConfirmed" );
+
+private:
+ void OnRenameCompleted( const char *pText, KeyValues *pContextKeyValues );
+
+ void OnDragCompleted( float flValue );
+ void UpdateTickPos( int x, int y );
+
+ CBaseAnimSetPresetFaderPanel *m_pParent;
+
+ Color m_GradientColor;
+ Color m_ZeroColor;
+ Color m_TextColor;
+ Color m_TextColorFocus;
+ TextImage *m_pName;
+ float m_flCurrent;
+
+ bool m_bSuppressCompletion;
+
+ CPresetSliderEdgeButton *m_pEdgeButtons[ 2 ];
+
+ vgui::DHANDLE< vgui::Menu > m_hContextMenu;
+ vgui::DHANDLE< vgui::InputDialog > m_hInputDialog;
+
+ AttributeDict_t m_AttributeLookup;
+
+ vgui::DHANDLE< MessageBox > m_hConfirm;
+ CDmeHandle< CDmePreset > m_hSelf;
+
+ static bool s_bResetMousePosOnMouseUp;
+ static int s_nMousePosX;
+ static int s_nMousePosY;
+};
+
+
+//-----------------------------------------------------------------------------
+//
+// CPresetSliderEdgeButton: The buttons that lie on either side of the PresetSlider
+//
+//-----------------------------------------------------------------------------
+CPresetSliderEdgeButton::CPresetSliderEdgeButton( CPresetSlider *parent, const char *panelName, const char *text ) :
+ BaseClass( (Panel *)parent, panelName, text ), m_pSlider( parent )
+{
+ SetPaintBorderEnabled( false );
+}
+
+void CPresetSliderEdgeButton::OnCursorMoved(int x, int y)
+{
+ LocalToScreen( x, y );
+ m_pSlider->ScreenToLocal( x, y );
+ m_pSlider->OnCursorMoved( x, y );
+}
+
+void CPresetSliderEdgeButton::OnMousePressed( vgui::MouseCode code )
+{
+ BaseClass::OnMousePressed( code );
+ PostMessage( m_pSlider->GetVPanel(), new KeyValues( "MousePressed", "code", code ) );
+ PostMessage( m_pSlider->GetVPanel(), new KeyValues( "MouseReleased", "code", code ), 0.001f );
+}
+
+void CPresetSliderEdgeButton::OnMouseReleased( vgui::MouseCode code )
+{
+ BaseClass::OnMouseReleased( code );
+ PostMessage( m_pSlider->GetVPanel(), new KeyValues( "MouseReleased", "code", code ) );
+}
+
+void CPresetSliderEdgeButton::OnMouseDoublePressed( vgui::MouseCode code )
+{
+ BaseClass::OnMouseDoublePressed( code );
+ PostMessage( m_pSlider->GetVPanel(), new KeyValues( "MouseDoublePressed", "code", code ) );
+ PostMessage( m_pSlider->GetVPanel(), new KeyValues( "MouseReleased", "code", code ), 0.001f );
+}
+
+
+//-----------------------------------------------------------------------------
+//
+// CPresetSlider: The actual preset slider itself!
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// Static members
+//-----------------------------------------------------------------------------
+bool CPresetSlider::s_bResetMousePosOnMouseUp = false;
+int CPresetSlider::s_nMousePosX;
+int CPresetSlider::s_nMousePosY;
+
+
+//-----------------------------------------------------------------------------
+// Constructor, destructor
+//-----------------------------------------------------------------------------
+CPresetSlider::CPresetSlider( CBaseAnimSetPresetFaderPanel *parent, const char *panelName, CDmePreset *preset ) :
+ BaseClass( (Panel *)parent, panelName ), m_pParent( parent ), m_bSuppressCompletion( false )
+{
+ Assert( preset );
+ m_hSelf = preset;
+
+ SetRange( 0, 1000 );
+ SetDragOnRepositionNob( true );
+
+ SetPaintBackgroundEnabled( true );
+
+ m_pName = new TextImage( panelName );
+
+ m_pEdgeButtons[ 0 ] = new CPresetSliderEdgeButton( this, "PresetSliderLeftEdge", "" );
+ m_pEdgeButtons[ 1 ] = new CPresetSliderEdgeButton( this, "PresetSliderRightEdge", "" );
+
+ SetBgColor( Color( 128, 128, 128, 128 ) );
+
+ m_ZeroColor = Color( 69, 69, 69, 255 );
+ m_GradientColor = Color( 194, 120, 0, 255 );
+
+ m_TextColor = Color( 200, 200, 200, 255 );
+ m_TextColorFocus = Color( 208, 143, 40, 255 );
+}
+
+CPresetSlider::~CPresetSlider()
+{
+ delete m_pName;
+}
+
+CDmePreset *CPresetSlider::GetPreset()
+{
+ return m_hSelf;
+}
+
+// #define PRORCEDURAL_PRESET_TIMING
+
+void CPresetSlider::UpdateProceduralValues()
+{
+ if ( !m_hSelf->IsProcedural() )
+ return;
+#if defined( PRORCEDURAL_PRESET_TIMING )
+ double st = Plat_FloatTime();
+#endif
+ // Figure out what we need to do
+ int nPresetType = m_hSelf->GetProceduralPresetType();
+ switch ( nPresetType )
+ {
+ default:
+ Assert( 0 );
+ break;
+ case PROCEDURAL_PRESET_REVEAL:
+ case PROCEDURAL_PRESET_PASTE:
+ case PROCEDURAL_PRESET_JITTER:
+ case PROCEDURAL_PRESET_SMOOTH:
+ case PROCEDURAL_PRESET_SHARPEN:
+ case PROCEDURAL_PRESET_SOFTEN:
+ case PROCEDURAL_PRESET_STAGGER:
+ // These are handled elsewhere right now... at some point we'll copy in values at head position in order to do ctrl-key preview mode
+ break;
+ case PROCEDURAL_PRESET_IN_CROSSFADE:
+ {
+ m_pParent->ProceduralPreset_UpdateCrossfade( m_hSelf, true );
+ }
+ break;
+ case PROCEDURAL_PRESET_OUT_CROSSFADE:
+ {
+ m_pParent->ProceduralPreset_UpdateCrossfade( m_hSelf, false );
+ }
+ break;
+ }
+#if defined( PRORCEDURAL_PRESET_TIMING )
+ double ed = Plat_FloatTime();
+ Msg( "Update %.3f msec\n", 1000.0 * ( ed - st ) );
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Reads the sliders, sets control values into the attribute dictionary
+//-----------------------------------------------------------------------------
+void CPresetSlider::SetControlValues( )
+{
+ m_AttributeLookup.Purge();
+ if ( !m_hSelf.Get() )
+ return;
+
+ CDmrElementArray< CDmElement > values = m_hSelf->GetControlValues();
+
+ int nControlValueCount = values.Count();
+ for ( int i = 0; i < nControlValueCount; ++i )
+ {
+ CDmElement *v = values[ i ];
+
+ AnimationControlAttributes_t val;
+ val.m_pAttribute[ANIM_CONTROL_VALUE] = v->GetAttribute( "value" );
+ val.m_pAttribute[ANIM_CONTROL_BALANCE] = v->GetAttribute( "balance" );
+ val.m_pAttribute[ANIM_CONTROL_MULTILEVEL] = v->GetAttribute( "multilevel" );
+ val.m_pValue[ANIM_CONTROL_VALUE] = v->GetValue< float >( "value" );
+ val.m_pValue[ANIM_CONTROL_BALANCE] = v->GetValue< float >( "balance" );
+ val.m_pValue[ANIM_CONTROL_MULTILEVEL] = v->GetValue< float >( "multilevel" );
+
+ m_AttributeLookup.Insert( v->GetName(), val );
+ }
+}
+
+
+AttributeDict_t *CPresetSlider::GetAttributeDict()
+{
+ return &m_AttributeLookup;
+}
+
+void CPresetSlider::OnMouseDoublePressed(MouseCode code)
+{
+ if ( code != MOUSE_LEFT )
+ {
+ BaseClass::OnMouseDoublePressed( code );
+ return;
+ }
+}
+
+void CPresetSlider::OnMousePressed(MouseCode code)
+{
+ if ( code == MOUSE_RIGHT )
+ return;
+
+ BaseClass::OnMousePressed( code );
+
+ if ( !_dragging )
+ return;
+
+ SetCursor( dc_blank );
+ int mx, my;
+ input()->GetCursorPos( mx, my );
+ int tx, ty, tw, th;
+ GetTrackRect( tx, ty, tw, th );
+
+ ScreenToLocal( mx, my );
+
+ // Off right?
+ bool offright = mx >= ( tx + tw ) ? true : false;
+
+ bool ctrldown = input()->IsKeyDown( KEY_LCONTROL ) || input()->IsKeyDown( KEY_RCONTROL );
+ if ( !ctrldown && !offright )
+ {
+ if ( mx >= tx )
+ {
+ Assert( !s_bResetMousePosOnMouseUp );
+ s_bResetMousePosOnMouseUp = true;
+ s_nMousePosX = mx;
+ s_nMousePosY = my;
+ LocalToScreen( s_nMousePosX, s_nMousePosY );
+
+ int offset = mx - tx;
+ mx -= offset;
+ LocalToScreen( mx, my );
+ input()->SetCursorPos( mx, my );
+ }
+ SetPos( 0 );
+ }
+}
+
+void CPresetSlider::OnMouseReleased(MouseCode code)
+{
+ if ( code == MOUSE_RIGHT )
+ {
+ OnShowContextMenu();
+ return;
+ }
+
+ float flLastValue = GetCurrent();
+ bool bWasDragging = _dragging;
+ BaseClass::OnMouseReleased( code );
+ if ( bWasDragging )
+ {
+ OnDragCompleted( flLastValue );
+ SetCursor( dc_arrow );
+ }
+
+ if( s_bResetMousePosOnMouseUp )
+ {
+ s_bResetMousePosOnMouseUp = false;
+ input()->SetCursorPos( s_nMousePosX, s_nMousePosY );
+ }
+}
+
+void CPresetSlider::OnKeyCodeTyped( KeyCode code )
+{
+ if ( code != KEY_ESCAPE || !_dragging )
+ {
+ BaseClass::OnKeyCodeTyped( code );
+ return;
+ }
+
+ m_bSuppressCompletion = true;
+ OnMouseReleased( MOUSE_LEFT );
+ m_bSuppressCompletion = false;
+ SetCursor( dc_arrow );
+}
+
+void CPresetSlider::OnDragCompleted( float flValue )
+{
+ if ( m_bSuppressCompletion )
+ return;
+
+ char sz[ 128 ];
+ m_pName->GetText( sz, sizeof( sz ) );
+ // Msg( "CPresetSlider slider drag completed %s [%.3f ]\n", sz, flValue );
+ // Apply settings to attribute sliders
+
+ m_pParent->ApplyPreset( flValue, m_AttributeLookup );
+}
+
+void CPresetSlider::OnRename()
+{
+ if ( m_hInputDialog.Get() )
+ {
+ delete m_hInputDialog.Get();
+ }
+
+ m_hInputDialog = new InputDialog( this, "Rename Preset", "Name:", GetName() );
+ if ( m_hInputDialog.Get() )
+ {
+ KeyValues *pContextKeyValues = new KeyValues( "RenamePreset" );
+ m_hInputDialog->SetSmallCaption( true );
+ m_hInputDialog->SetMultiline( false );
+ m_hInputDialog->DoModal( pContextKeyValues );
+ }
+ else
+ {
+ Assert( 0 );
+ }
+}
+
+void CPresetSlider::OnRenameCompleted( const char *pText, KeyValues *pContextKeyValues )
+{
+ if ( !pText || !*pText )
+ {
+ Warning( "Can't rename preset for %s to an empty name\n", GetName() );
+ return;
+ }
+
+ // No change( case sensitive)
+ if ( !Q_strcmp( GetName(), pText ) )
+ return;
+
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Rename Preset" );
+
+ SetName( pText );
+ m_pName->SetText( pText );
+ m_pName->ResizeImageToContent();
+
+ //
+ Assert( m_hSelf.Get() );
+ if ( m_hSelf.Get() )
+ {
+ m_hSelf->SetName( pText );
+ }
+}
+
+void CPresetSlider::OnInputCompleted( KeyValues *pParams )
+{
+ const char *pText = pParams->GetString( "text", NULL );
+
+ KeyValues *pContextKeyValues = pParams->FindKey( "RenamePreset" );
+ if ( pContextKeyValues )
+ {
+ OnRenameCompleted( pText, pContextKeyValues );
+ return;
+ }
+
+ Assert( 0 );
+}
+
+void CPresetSlider::OnDelete()
+{
+ if ( m_hConfirm.Get() )
+ delete m_hConfirm.Get();
+
+ char sz[ 256 ];
+ Q_snprintf( sz, sizeof( sz ), "Delete '%s'?", GetName() );
+
+ m_hConfirm = new MessageBox( "Delete Preset", sz, this );
+ Assert( m_hConfirm.Get() );
+ if ( m_hConfirm )
+ {
+ m_hConfirm->SetCancelButtonVisible( true );
+ m_hConfirm->SetCancelButtonText( "#VGui_Cancel" );
+ m_hConfirm->SetCommand( new KeyValues( "OnDeleteConfirmed" ) );
+ m_hConfirm->AddActionSignalTarget( this );
+ m_hConfirm->DoModal();
+ }
+}
+
+void CPresetSlider::OnDeleteConfirmed()
+{
+ m_pParent->OnDeletePreset( m_hSelf.Get() );
+}
+
+void CPresetSlider::OnOverwrite()
+{
+ if ( m_hConfirm.Get() )
+ delete m_hConfirm.Get();
+
+ char sz[ 256 ];
+ Q_snprintf( sz, sizeof( sz ), "Overwrite '%s'?", GetName() );
+
+ m_hConfirm = new MessageBox( "Overwrite Preset", sz, this );
+ Assert( m_hConfirm.Get() );
+ if ( m_hConfirm )
+ {
+ m_hConfirm->ShowMessageBoxOverCursor( true );
+ m_hConfirm->SetCancelButtonVisible( true );
+ m_hConfirm->SetCancelButtonText( "#VGui_Cancel" );
+ m_hConfirm->SetCommand( new KeyValues( "OnOverwriteConfirmed" ) );
+ m_hConfirm->AddActionSignalTarget( this );
+ m_hConfirm->DoModal();
+ }
+}
+
+void CPresetSlider::OnOverwriteConfirmed()
+{
+ m_pParent->OnOverwritePreset( m_hSelf.Get() );
+}
+
+void CPresetSlider::OnShowContextMenu()
+{
+ if ( m_hContextMenu.Get() )
+ {
+ delete m_hContextMenu.Get();
+ m_hContextMenu = NULL;
+ }
+
+ m_hContextMenu = new Menu( this, "ActionMenu" );
+
+ bool bIsReadOnly = m_hSelf.Get() ? m_hSelf->IsReadOnly() : false;
+ bool bCanOverwrite = !bIsReadOnly;
+ if ( m_hSelf->IsProcedural() )
+ {
+ switch ( m_hSelf->GetProceduralPresetType() )
+ {
+ default:
+ break;
+ case PROCEDURAL_PRESET_REVEAL:
+ bCanOverwrite = true;
+ break;
+ }
+ }
+
+ if ( bCanOverwrite )
+ {
+ m_hContextMenu->AddMenuItem( "Overwrite", new KeyValues( "OnOverwrite" ), this );
+ m_hContextMenu->AddSeparator();
+ }
+ if ( !bIsReadOnly )
+ {
+ m_hContextMenu->AddMenuItem( "Rename...", new KeyValues( "OnRename" ), this );
+ if ( Q_stricmp( GetName(), "Default" ) )
+ {
+ m_hContextMenu->AddMenuItem( "Delete...", new KeyValues( "OnDelete" ), this );
+ }
+
+ m_hContextMenu->AddSeparator();
+ }
+
+ m_hContextMenu->AddMenuItem( "Add...", new KeyValues( "AddPreset" ), m_pParent );
+ m_hContextMenu->AddMenuItem( "Change Crossfade Speed...", new KeyValues( "SetPresetCrossfadeSpeed" ), m_pParent );
+
+ m_hContextMenu->AddSeparator();
+
+ m_hContextMenu->AddMenuItem( "Manage...", new KeyValues( "ManagePresets" ), m_pParent );
+
+ Menu::PlaceContextMenu( this, m_hContextMenu.Get() );
+}
+
+void CPresetSlider::UpdateTickPos( int x, int y )
+{
+ int tx, ty, tw, th;
+ GetTrackRect( tx, ty, tw, th );
+
+ bool bIsCtrlKeyDown = vgui::input()->IsKeyDown( KEY_LCONTROL ) || vgui::input()->IsKeyDown( KEY_RCONTROL );
+ bool bIsAltKeyDown = vgui::input()->IsKeyDown( KEY_LALT ) || vgui::input()->IsKeyDown( KEY_RALT );
+ if ( bIsCtrlKeyDown && bIsAltKeyDown && !_dragging )
+ {
+ x = tx + tw;
+ }
+
+ float previewValue = 0.0f;
+ if ( x > tx )
+ {
+ if ( x >= ( tx + tw ) || tw <= 0 )
+ {
+ previewValue = 1.0f;
+ }
+ else
+ {
+ previewValue = (float)( x - tx ) / (float)tw;
+ }
+ }
+
+ SetPos( previewValue );
+}
+
+void CPresetSlider::OnCursorMoved(int x, int y)
+{
+ UpdateTickPos( x, y );
+}
+
+bool CPresetSlider::IsDragging()
+{
+ return _dragging;
+}
+
+bool CPresetSlider::IsPreviewSlider()
+{
+ VPANEL capturePanel = input()->GetMouseCapture();
+ if ( capturePanel )
+ {
+ if ( capturePanel != GetVPanel() )
+ return false;
+ return true;
+ }
+
+ VPANEL appModal = input()->GetAppModalSurface();
+ if ( appModal )
+ return false;
+
+ int mx, my;
+ input()->GetCursorPos( mx, my );
+
+ /*
+ VPANEL topMost = IsWithinTraverse( mx, my, true );
+ if ( topMost && topMost != GetVPanel() )
+ {
+ const char *name = ipanel()->GetName( topMost );
+ return false;
+ }
+ */
+
+ return IsWithin( mx, my );
+}
+
+float CPresetSlider::GetCurrent()
+{
+ return GetValue() * 0.001f;
+}
+
+void CPresetSlider::SetPos( float frac )
+{
+ SetValue( (int)( frac * 1000.0f + 0.5f ), false );
+}
+
+void CPresetSlider::ApplySchemeSettings( IScheme *scheme )
+{
+ BaseClass::ApplySchemeSettings( scheme );
+
+ m_pName->SetFont( scheme->GetFont( "DefaultBold" ) );
+ m_pName->SetColor( m_TextColor );
+ m_pName->ResizeImageToContent();
+
+ SetFgColor( Color( 194, 120, 0, 255 ) );
+ SetThumbWidth( 3 );
+
+ Color fullColor1( Color( 118, 71, 41, 255 ) );
+ Color fullColor2( Color( 194, 120, 0, 255 ) );
+ m_pEdgeButtons[ 0 ]->SetDefaultColor( m_ZeroColor, m_ZeroColor );
+ m_pEdgeButtons[ 1 ]->SetDefaultColor( fullColor1, fullColor1 );
+ m_pEdgeButtons[ 0 ]->SetDepressedColor( m_ZeroColor, m_ZeroColor );
+ m_pEdgeButtons[ 1 ]->SetDepressedColor( fullColor2, fullColor2 );
+ m_pEdgeButtons[ 0 ]->SetArmedColor( m_ZeroColor, m_ZeroColor );
+ m_pEdgeButtons[ 1 ]->SetArmedColor( fullColor1, fullColor1 );
+ m_pEdgeButtons[ 0 ]->SetButtonActivationType( Button::ACTIVATE_ONPRESSED );
+ m_pEdgeButtons[ 1 ]->SetButtonActivationType( Button::ACTIVATE_ONPRESSED );
+}
+
+void CPresetSlider::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ int w, h;
+ GetSize( w, h );
+
+ int btnSize = 9;
+ m_pEdgeButtons[ 0 ]->SetBounds( 3, ( h - btnSize ) / 2, btnSize, btnSize );
+ m_pEdgeButtons[ 1 ]->SetBounds( w - 12, ( h - btnSize ) / 2, btnSize, btnSize );
+}
+
+void CPresetSlider::GetTrackRect( int &x, int &y, int &w, int &h )
+{
+ GetSize( w, h );
+ x = 15;
+ y = 2;
+ w -= 30;
+ h -= 4;
+}
+
+
+void CPresetSlider::SetGradientColor( const Color& clr )
+{
+ m_GradientColor = clr;
+}
+
+void CPresetSlider::Paint()
+{
+ if ( !IsPreviewSlider() )
+ return;
+
+ bool bIsCtrlKeyDown = vgui::input()->IsKeyDown( KEY_LCONTROL ) || vgui::input()->IsKeyDown( KEY_RCONTROL );
+ if ( !IsDragging() && !bIsCtrlKeyDown )
+ return;
+
+ int mx, my;
+ input()->GetCursorPos( mx, my );
+ ScreenToLocal( mx, my );
+ UpdateTickPos( mx, my );
+
+ // horizontal nob
+ int x, y;
+ int wide,tall;
+ GetTrackRect( x, y, wide, tall );
+
+ Color col = GetFgColor();
+ surface()->DrawSetColor( col );
+ surface()->DrawFilledRect( _nobPos[0], 1, _nobPos[1], GetTall() - 1 );
+ surface()->DrawSetColor( m_ZeroColor );
+ surface()->DrawFilledRect( _nobPos[0] - 1, y + 1, _nobPos[0], y + tall - 1 );
+}
+
+void CPresetSlider::PaintBackground()
+{
+ int w, h;
+ GetSize( w, h );
+
+ bool hasFocus = IsPreviewSlider();
+ bool bIsCtrlKeyDown = vgui::input()->IsKeyDown( KEY_LCONTROL ) || vgui::input()->IsKeyDown( KEY_RCONTROL );
+ bool bIsAltKeyDown = vgui::input()->IsKeyDown( KEY_LALT ) || vgui::input()->IsKeyDown( KEY_RALT );
+ if ( hasFocus && ( IsDragging() || bIsCtrlKeyDown ) )
+ {
+ int tx, ty, tw, th;
+ GetTrackRect( tx, ty, tw, th );
+
+ surface()->DrawSetColor( Color( 0, 0, 0, 255 ) );
+ surface()->DrawOutlinedRect( tx, ty, tx + tw, ty + th );
+ surface()->DrawSetColor( m_GradientColor );
+
+ ++tx;
+ ++ty;
+ tw -= 2;
+ th -= 2;
+
+ // Gradient fill rectangle
+ int fillw = (int)( (float)tw * GetCurrent() + 0.5f );
+
+ int minAlpha = 15;
+ float alphaTarget = 255.0f;
+
+ int curAlpha = max( (int)(GetCurrent() * alphaTarget), minAlpha );
+
+ if ( _dragging )
+ {
+ surface()->DrawFilledRectFade( tx, ty, tx + fillw, ty + th, minAlpha, curAlpha, true );
+ surface()->DrawSetColor( m_ZeroColor );
+ surface()->DrawFilledRect( tx + fillw + 1, ty, tx + tw, ty + th );
+ }
+ else
+ {
+ surface()->DrawSetColor( bIsAltKeyDown ? m_GradientColor : m_ZeroColor );
+ surface()->DrawFilledRect( tx, ty, tx + tw, ty + th );
+ }
+ }
+
+ int cw, ch;
+ m_pName->SetColor( hasFocus ? m_TextColorFocus : m_TextColor );
+ m_pName->GetContentSize( cw, ch );
+ m_pName->SetPos( ( w - cw ) * 0.5f, ( h - ch ) * 0.5f );
+ m_pName->Paint();
+}
+
+
+//-----------------------------------------------------------------------------
+// Slider list panel
+//-----------------------------------------------------------------------------
+class CSliderListPanel : public PanelListPanel
+{
+ DECLARE_CLASS_SIMPLE( CSliderListPanel, vgui::PanelListPanel );
+
+public:
+ CSliderListPanel( CBaseAnimSetPresetFaderPanel *parent, vgui::Panel *pParent, const char *panelName );
+
+ virtual void OnMouseReleased( vgui::MouseCode code );
+ virtual void OnMousePressed( vgui::MouseCode code );
+
+private:
+ MESSAGE_FUNC( OnShowContextMenu, "OnShowContextMenu" );
+ vgui::DHANDLE< vgui::Menu > m_hContextMenu;
+ CBaseAnimSetPresetFaderPanel *m_pParent;
+};
+
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CSliderListPanel::CSliderListPanel( CBaseAnimSetPresetFaderPanel *pFader, vgui::Panel *pParent, const char *panelName ) :
+ BaseClass( pParent, panelName )
+{
+ m_pParent = pFader;
+}
+
+
+//-----------------------------------------------------------------------------
+// Context menu!
+//-----------------------------------------------------------------------------
+void CSliderListPanel::OnMousePressed( MouseCode code )
+{
+ if ( code == MOUSE_RIGHT )
+ return;
+
+ BaseClass::OnMousePressed( code );
+}
+
+void CSliderListPanel::OnMouseReleased( MouseCode code )
+{
+ if ( code == MOUSE_RIGHT )
+ {
+ OnShowContextMenu();
+ return;
+ }
+
+ BaseClass::OnMouseReleased( code );
+}
+
+
+//-----------------------------------------------------------------------------
+// Shows the slider context menu
+//-----------------------------------------------------------------------------
+void CSliderListPanel::OnShowContextMenu()
+{
+ if ( m_hContextMenu.Get() )
+ {
+ delete m_hContextMenu.Get();
+ m_hContextMenu = NULL;
+ }
+
+ m_hContextMenu = new Menu( this, "ActionMenu" );
+
+ m_hContextMenu->AddMenuItem( "Add...", new KeyValues( "AddPreset" ), m_pParent );
+ m_hContextMenu->AddMenuItem( "Change Crossfade Speed...", new KeyValues( "SetPresetCrossfadeSpeed" ), m_pParent );
+
+ m_hContextMenu->AddSeparator();
+
+ m_hContextMenu->AddMenuItem( "Manage...", new KeyValues( "ManagePresets" ), m_pParent );
+
+ Menu::PlaceContextMenu( this, m_hContextMenu.Get() );
+}
+
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CBaseAnimSetPresetFaderPanel::CBaseAnimSetPresetFaderPanel( vgui::Panel *parent, const char *className, CBaseAnimationSetEditor *editor ) :
+ BaseClass( parent, className ),
+ m_flLastFrameTime( 0.0f ),
+ m_pSliders( NULL ),
+ m_pWorkspace( NULL )
+{
+ m_hEditor = editor;
+
+ m_pWorkspace = new EditablePanel( this, "PresetWorkspace" );
+ m_pWorkspace->SetPaintBackgroundEnabled( false );
+ m_pWorkspace->SetPaintEnabled( false );
+ m_pWorkspace->SetPaintBorderEnabled( false );
+
+ m_pSliders = new CSliderListPanel( this, m_pWorkspace, "PresetSliders" );
+ m_pSliders->SetFirstColumnWidth( 0 );
+ m_pSliders->SetAutoResize
+ (
+ Panel::PIN_TOPLEFT,
+ Panel::AUTORESIZE_DOWNANDRIGHT,
+ 0, 24,
+ 0, 0
+ );
+ m_pSliders->SetPos( 0, 24 );
+ m_pSliders->SetVerticalBufferPixels( 0 );
+
+ m_pFilter = new TextEntry( m_pWorkspace, "PresetFilter" );
+ m_pFilter->AddActionSignalTarget( this );
+ m_pFilter->SetAutoResize
+ (
+ Panel::PIN_TOPLEFT,
+ Panel::AUTORESIZE_RIGHT,
+ 2, 2,
+ 2, 22
+ );
+ m_pFilter->SetPos( 0, 0 );
+
+ m_pWorkspace->SetAutoResize
+ (
+ Panel::PIN_TOPLEFT,
+ Panel::AUTORESIZE_DOWNANDRIGHT,
+ 0, 0,
+ 0, 0
+ );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: refreshes dialog on text changing
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnTextChanged( )
+{
+ int nLength = m_pFilter->GetTextLength();
+ m_Filter.SetLength( nLength );
+ if ( nLength > 0 )
+ {
+ m_pFilter->GetText( m_Filter.GetForModify(), nLength+1 );
+ }
+ PopulateList( true );
+}
+
+
+//-----------------------------------------------------------------------------
+// Called from the input dialogs used by this class
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnInputCompleted( KeyValues *pParams )
+{
+ const char *pText = pParams->GetString( "text", NULL );
+ KeyValues *pContextKeyValues = pParams->FindKey( "CrossfadeSpeed" );
+ if ( pContextKeyValues )
+ {
+ float f = Q_atof( pText );
+ if ( f > 0.0f )
+ {
+ ifm_fader_timescale = f;
+ }
+ else
+ {
+ Warning( "Crossfade [%f] invalid, must be a postive number\n", f );
+ }
+ return;
+ }
+
+ Assert( 0 );
+}
+
+
+//-----------------------------------------------------------------------------
+// Called from the add preset name dialogs used by this class
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnPresetNameSelected( KeyValues *pParams )
+{
+ const char *pText = pParams->GetString( "text", NULL );
+ if ( !pText || !*pText )
+ {
+ vgui::MessageBox *pError = new MessageBox( "Add Preset Error", "Can't add preset with an empty name\n", this );
+ pError->SetDeleteSelfOnClose( true );
+ pError->DoModal();
+ return;
+ }
+
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Add Preset" );
+
+ CDmePresetGroup *pPresetGroup = GetElementKeyValue<CDmePresetGroup>( pParams, "presetGroup" );
+ if ( !pPresetGroup )
+ {
+ const char *pGroupName = pParams->GetString( "presetGroupName" );
+ if ( !pGroupName )
+ return;
+
+ pPresetGroup = m_AnimSet->FindOrAddPresetGroup( pGroupName );
+ }
+
+ if ( pPresetGroup->m_bIsReadOnly )
+ {
+ vgui::MessageBox *pError = new MessageBox( "Add Preset Error", "Can't add preset to a read-only preset group!\n", this );
+ pError->SetDeleteSelfOnClose( true );
+ pError->DoModal();
+ return;
+ }
+
+ if ( pPresetGroup->FindPreset( pText ) )
+ {
+ vgui::MessageBox *pError = new MessageBox( "Add Preset Error", "A preset with that name already exists!\n", this );
+ pError->SetDeleteSelfOnClose( true );
+ pError->DoModal();
+ return;
+ }
+
+ CDmePreset *pPreset = pPresetGroup->FindOrAddPreset( pText );
+ AddNewPreset( pPreset );
+ guard.Release();
+
+ ChangeAnimationSet( m_AnimSet );
+}
+
+
+//-----------------------------------------------------------------------------
+// The 'set crossfade speed' context menu option
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnSetCrossfadeSpeed()
+{
+ if ( m_hInputDialog.Get() )
+ {
+ delete m_hInputDialog.Get();
+ }
+
+ char sz[32 ];
+ Q_snprintf( sz, sizeof( sz ), "%f", ifm_fader_timescale );
+ m_hInputDialog = new InputDialog( this, "Crossfade Speed", "Fader Crossfade Rate:", sz );
+ if ( m_hInputDialog.Get() )
+ {
+ KeyValues *pContextKeyValues = new KeyValues( "CrossfadeSpeed" );
+ m_hInputDialog->SetSmallCaption( true );
+ m_hInputDialog->SetMultiline( false );
+ m_hInputDialog->DoModal( pContextKeyValues );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// The 'add preset' context menu option
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnAddPreset()
+{
+ if ( !m_AnimSet.Get() )
+ return;
+
+ if ( !m_hAddPresetDialog.Get() )
+ {
+ m_hAddPresetDialog = new CAddPresetDialog( this );
+ m_hAddPresetDialog->AddActionSignalTarget( this );
+ }
+
+ m_hAddPresetDialog->DoModal( m_AnimSet, NULL );
+}
+
+
+//-----------------------------------------------------------------------------
+// Called by the preset group editor panel when it changes presets
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnPresetsChanged()
+{
+ ChangeAnimationSet( m_AnimSet );
+}
+
+
+//-----------------------------------------------------------------------------
+// Brings up the preset manager
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::OnManagePresets()
+{
+ if ( !m_hPresetEditor.Get() )
+ {
+ m_hPresetEditor = new CDmePresetGroupEditorFrame( this, "Manage Presets" );
+ m_hPresetEditor->AddActionSignalTarget( this );
+ m_hPresetEditor->SetVisible( false );
+ m_hPresetEditor->SetDeleteSelfOnClose( false );
+ m_hPresetEditor->MoveToCenterOfScreen();
+ }
+
+ m_hPresetEditor->SetAnimationSet( m_AnimSet );
+ m_hPresetEditor->DoModal( );
+}
+
+void CBaseAnimSetPresetFaderPanel::ApplySchemeSettings( IScheme *scheme )
+{
+ BaseClass::ApplySchemeSettings( scheme );
+ m_pSliders->SetBgColor( Color( 42, 42, 42, 255 ) );
+}
+
+void CBaseAnimSetPresetFaderPanel::GetPreviewFader( FaderPreview_t& fader )
+{
+ Q_memset( &fader, 0, sizeof( fader ) );
+
+ fader.isbeingdragged = false;
+
+ fader.holdingctrl = input()->IsKeyDown( KEY_LCONTROL ) || input()->IsKeyDown( KEY_RCONTROL );
+ int mx, my;
+ input()->GetCursorPos( mx, my );
+ if ( !IsWithin( mx, my ) )
+ {
+ fader.holdingctrl = false;
+ }
+
+ // Walk through sliders and figure out which is under the mouse
+ CPresetSlider *mouseOver = NULL;
+
+ for ( int i = m_pSliders->FirstItem(); i != m_pSliders->InvalidItemID(); i = m_pSliders->NextItem(i) )
+ {
+ CPresetSlider *slider = static_cast< CPresetSlider * >( m_pSliders->GetItemPanel( i ) );
+ if ( !slider || !slider->IsPreviewSlider() )
+ continue;
+
+ mouseOver = slider;
+ fader.isbeingdragged = slider->IsDragging();
+ break;
+ }
+
+ if ( mouseOver )
+ {
+ // Deal with procedural presets here
+ if ( fader.holdingctrl ||
+ fader.isbeingdragged )
+ {
+ mouseOver->UpdateProceduralValues();
+ }
+
+ fader.name = mouseOver->GetName();
+ fader.amount = mouseOver->GetCurrent();
+ fader.values = mouseOver->GetAttributeDict();
+ fader.preset = mouseOver->GetPreset();
+ }
+}
+
+void CBaseAnimSetPresetFaderPanel::PopulateList( bool bChanged )
+{
+ if ( !m_AnimSet.Get() )
+ {
+ m_CurrentPresetList.RemoveAll();
+ m_pSliders->DeleteAllItems();
+ return;
+ }
+
+ CDmrElementArray< CDmePresetGroup > presetGroups = m_AnimSet->GetPresetGroups();
+ Assert( presetGroups.IsValid() );
+
+ int c = presetGroups.Count();
+
+ bool bNeedRebuild = false;
+ int slot = 0;
+ for ( int i = 0 ; i < c; ++i )
+ {
+ CDmePresetGroup *pPresetGroup = presetGroups[ i ];
+ Assert( pPresetGroup );
+ if ( !pPresetGroup || !pPresetGroup->m_bIsVisible )
+ continue;
+
+ CDmrElementArray< CDmePreset > presets = pPresetGroup->GetPresets();
+
+ int cp = presets.Count();
+ for ( int j = 0; j < cp; ++j )
+ {
+ CDmePreset *pPreset = presets[ j ];
+ Assert( pPreset );
+
+ const char *pElementName = pPreset->GetName();
+ if ( Q_stricmp( pElementName, "Default" ) )
+ {
+ if ( m_Filter.Length() && !Q_stristr( pElementName, m_Filter.Get() ) )
+ continue;
+ }
+
+ if ( slot >= m_CurrentPresetList.Count() )
+ {
+ bNeedRebuild = true;
+ break;
+ }
+
+ if ( pPreset != m_CurrentPresetList[ slot ] )
+ {
+ bNeedRebuild = true;
+ break;
+ }
+
+ ++slot;
+ }
+ }
+
+ if ( slot != m_CurrentPresetList.Count() )
+ {
+ bNeedRebuild = true;
+ }
+
+ if ( bNeedRebuild )
+ {
+ m_CurrentPresetList.RemoveAll();
+ m_pSliders->DeleteAllItems();
+
+ for ( int i = 0 ; i < c; ++i )
+ {
+ CDmePresetGroup *pPresetGroup = presetGroups[ i ];
+ Assert( pPresetGroup );
+ if ( !pPresetGroup || !pPresetGroup->m_bIsVisible )
+ continue;
+
+ CDmrElementArray< CDmePreset > presets = pPresetGroup->GetPresets();
+
+ int cp = presets.Count();
+ for ( int j = 0; j < cp; ++j )
+ {
+ CDmePreset *pPreset = presets[ j ];
+ Assert( pPreset );
+
+ const char *pElementName = pPreset->GetName();
+ if ( Q_stricmp( pElementName, "Default" ) )
+ {
+ if ( m_Filter.Length() && !Q_stristr( pElementName, m_Filter.Get() ) )
+ continue;
+ }
+
+ CPresetSlider *pSlider = new CPresetSlider( this, pPreset->GetName(), pPreset );
+ pSlider->SetPos( 0 );
+ pSlider->SetSize( 100, 20 );
+ pSlider->SetGradientColor( Color( 194, 120, 0, 255 ) );
+
+ pSlider->SetControlValues( );
+
+ m_pSliders->AddItem( NULL, pSlider );
+
+ m_CurrentPresetList.AddToTail( pPreset->GetHandle() );
+ }
+ }
+ }
+ else
+ {
+ UpdateControlValues();
+ }
+}
+
+void CBaseAnimSetPresetFaderPanel::ChangeAnimationSet( CDmeAnimationSet *newAnimSet )
+{
+ bool bChanged = m_AnimSet != newAnimSet;
+ m_AnimSet = newAnimSet;
+ PopulateList( bChanged );
+}
+
+void CBaseAnimSetPresetFaderPanel::UpdateControlValues()
+{
+ for ( int i = m_pSliders->FirstItem(); i != m_pSliders->InvalidItemID(); i = m_pSliders->NextItem(i) )
+ {
+ CPresetSlider *pSlider = static_cast< CPresetSlider * >( m_pSliders->GetItemPanel( i ) );
+ if ( pSlider )
+ {
+ pSlider->SetControlValues( );
+ }
+ }
+}
+
+void CBaseAnimSetPresetFaderPanel::ApplyPreset( float flScale, AttributeDict_t& dict )
+{
+ CBaseAnimSetAttributeSliderPanel *sliderPanel = m_hEditor->GetAttributeSlider();
+ if ( sliderPanel )
+ {
+ sliderPanel->ApplyPreset( flScale, dict );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Reads the current animation set control values, creates presets
+//-----------------------------------------------------------------------------
+void CBaseAnimSetPresetFaderPanel::SetPresetFromSliders( CDmePreset *pPreset )
+{
+ if ( !m_AnimSet.Get() )
+ return;
+
+ CBaseAnimSetAttributeSliderPanel *pSliderPanel = m_hEditor->GetAttributeSlider();
+ if ( !pSliderPanel )
+ return;
+
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Set Preset" );
+
+ const CDmrElementArray< CDmElement > controlList = m_AnimSet->GetControls();
+
+ // Now set values for each known control
+ int numControls = controlList.Count();
+ for ( int i = 0; i < numControls; ++i )
+ {
+ CDmElement *pControl = controlList[ i ];
+
+ if ( pControl->GetValue<bool>( "transform" ) )
+ continue;
+
+ // Facial sliders below
+ AttributeValue_t value;
+ bool bIsDefault = !pSliderPanel->GetAttributeSliderValue( &value, pControl->GetName() );
+ if ( !bIsDefault )
+ {
+ float flDefaultValue = pControl->GetValue< float >( "defaultValue" );
+ float flDefaultBalance = pControl->GetValue< float >( "defaultBalance" );
+ float flDefaultMultilevel = pControl->GetValue< float >( "defaultMultilevel" );
+ bIsDefault = ( value.m_pValue[ANIM_CONTROL_VALUE] == flDefaultValue ) &&
+ ( value.m_pValue[ANIM_CONTROL_BALANCE] == flDefaultBalance ) &&
+ ( value.m_pValue[ANIM_CONTROL_MULTILEVEL] == flDefaultMultilevel );
+ }
+
+ // Blow away preset values for controls that contain the default values
+ if ( bIsDefault )
+ {
+ pPreset->RemoveControlValue( pControl->GetName() );
+ continue;
+ }
+
+ bool bIsCombo = pControl->GetValue< bool >( "combo" );
+ bool bIsMulti = pControl->GetValue< bool >( "multi" );
+
+ // Stamp the control value
+ CDmElement *pControlValue = pPreset->FindOrAddControlValue( pControl->GetName() );
+ pControlValue->SetValue< float >( "value", value.m_pValue[ANIM_CONTROL_VALUE] );
+ if ( bIsCombo )
+ {
+ pControlValue->SetValue< float >( "balance", value.m_pValue[ANIM_CONTROL_BALANCE] );
+ }
+ else
+ {
+ pControlValue->RemoveAttribute( "balance" );
+ }
+
+ if ( bIsMulti )
+ {
+ pControlValue->SetValue< float >( "multilevel", value.m_pValue[ANIM_CONTROL_MULTILEVEL] );
+ }
+ else
+ {
+ pControlValue->RemoveAttribute( "multilevel" );
+ }
+ }
+}
+
+void CBaseAnimSetPresetFaderPanel::AddNewPreset( CDmePreset *pPreset )
+{
+ if ( !pPreset )
+ return;
+
+ SetPresetFromSliders( pPreset );
+
+ CPresetSlider *pSlider = new CPresetSlider( this, pPreset->GetName(), pPreset );
+ if ( pSlider )
+ {
+ pSlider->SetPos( 0 );
+ pSlider->SetSize( 100, 20 );
+ pSlider->SetGradientColor( Color( 194, 120, 0, 255 ) );
+ pSlider->SetControlValues( );
+ m_pSliders->AddItem( NULL, pSlider );
+ }
+}
+
+void CBaseAnimSetPresetFaderPanel::OnAddNewPreset( KeyValues *pKeyValues )
+{
+ CDmePreset *pPreset = GetElementKeyValue<CDmePreset>( pKeyValues, "preset" );
+
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Overwrite Preset" );
+ AddNewPreset( pPreset );
+ guard.Release();
+
+ ChangeAnimationSet( m_AnimSet );
+}
+
+void CBaseAnimSetPresetFaderPanel::AddNewPreset( const char *pGroupName, const char *pName )
+{
+ if ( !m_AnimSet.Get() )
+ return;
+
+ CBaseAnimSetAttributeSliderPanel *sliderPanel = m_hEditor->GetAttributeSlider();
+ if ( !sliderPanel )
+ return;
+
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Add Preset" );
+
+ CDmePresetGroup *pPresetGroup = m_AnimSet->FindOrAddPresetGroup( pGroupName );
+ CDmePreset *pPreset = pPresetGroup->FindOrAddPreset( pName );
+ AddNewPreset( pPreset );
+ guard.Release();
+
+ ChangeAnimationSet( m_AnimSet );
+}
+
+void CBaseAnimSetPresetFaderPanel::OnOverwritePreset( CDmePreset *pPreset )
+{
+ SetPresetFromSliders( pPreset );
+ UpdateControlValues();
+}
+
+void CBaseAnimSetPresetFaderPanel::OnDeletePreset( CDmePreset *pPreset )
+{
+ {
+ // Delete it from various things
+ CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, "Delete Preset" );
+ m_AnimSet->RemovePreset( pPreset );
+ }
+
+ ChangeAnimationSet( m_AnimSet );
+}
+
+void CBaseAnimSetPresetFaderPanel::ProceduralPreset_UpdateCrossfade( CDmePreset *pPreset, bool bFadeIn )
+{
+ // Handled by derived class in SFM
+}