summaryrefslogtreecommitdiff
path: root/engine/cl_demoactioneditors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/cl_demoactioneditors.cpp')
-rw-r--r--engine/cl_demoactioneditors.cpp1442
1 files changed, 1442 insertions, 0 deletions
diff --git a/engine/cl_demoactioneditors.cpp b/engine/cl_demoactioneditors.cpp
new file mode 100644
index 0000000..9d63fec
--- /dev/null
+++ b/engine/cl_demoactioneditors.cpp
@@ -0,0 +1,1442 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "client_pch.h"
+#include "shake.h"
+#include "tmessage.h"
+#include "cl_demoaction.h"
+#include "cl_demoactionmanager.h"
+#include "cl_demoactioneditors.h"
+#include "cl_demoaction_types.h"
+#include "cl_demoeditorpanel.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *parent -
+// *action -
+// newaction -
+//-----------------------------------------------------------------------------
+CBaseActionEditDialog::CBaseActionEditDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+: vgui::Frame( parent, CBaseDemoAction::NameForType( action->GetType() ) ),
+ m_pEditor( parent ),
+ m_pAction( action ),
+ m_bNewAction( newaction )
+{
+ if ( m_bNewAction )
+ {
+ SetTitle( va( "New %s Action", CBaseDemoAction::NameForType( action->GetType() ) ), true );
+ }
+ else
+ {
+ SetTitle( va( "Edit %s Action", CBaseDemoAction::NameForType( action->GetType() ) ), true );
+ }
+ m_pOK = new vgui::Button( this, "OK", "OK" );
+ m_pCancel = new vgui::Button( this, "Cancel", "Cancel" );
+
+ m_pActionName = new vgui::TextEntry( this, "ActionName" );
+ m_pStart = new vgui::TextEntry( this, "ActionStart" );
+
+ m_pStartType = new vgui::ComboBox( this, "ActionStartType", (int)NUM_TIMING_TYPES, false );
+
+ for ( int i = 0; i < (int)NUM_TIMING_TYPES; i++ )
+ {
+ m_pStartType->AddItem( CBaseDemoAction::NameForTimingType( (DEMOACTIONTIMINGTYPE)i ), NULL );
+ }
+
+ SetSizeable( false );
+ SetMoveable( true );
+}
+
+static bool g_BaseActionEditSaveChained = false;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionEditDialog::Init( void )
+{
+ // Fill in data from passed in action
+ m_pActionName->SetText( m_pAction->GetActionName() );
+ m_pStartType->ActivateItem( (int)m_pAction->GetTimingType() );
+
+ switch ( m_pAction->GetTimingType() )
+ {
+ default:
+ case ACTION_USES_NEITHER:
+ {
+ m_pStart->SetText( "" );
+ }
+ break;
+ case ACTION_USES_TICK:
+ {
+ m_pStart->SetText( va( "%i", m_pAction->GetStartTick() ) );
+ }
+ break;
+ case ACTION_USES_TIME:
+ {
+ m_pStart->SetText( va( "%.3f", m_pAction->GetStartTime() ) );
+ }
+ break;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionEditDialog::OnSaveChanges( void )
+{
+ bool bret = false;
+ // No baseclass chain
+ g_BaseActionEditSaveChained = true;
+
+ char actionname[ 512 ];
+ m_pActionName->GetText( actionname, sizeof( actionname ) );
+ if ( Q_strcmp( m_pAction->GetActionName(), actionname ) )
+ {
+ bret = true;
+ m_pAction->SetActionName( actionname );
+ }
+
+ char starttext[ 512 ];
+ m_pStart->GetText( starttext, sizeof( starttext ) );
+ char starttype[ 512 ];
+ m_pStartType->GetText( starttype, sizeof( starttype ) );
+
+ DEMOACTIONTIMINGTYPE timingType = CBaseDemoAction::TimingTypeForName( starttype );
+
+ if ( timingType != m_pAction->GetTimingType() )
+ {
+ bret = true;
+ m_pAction->SetTimingType( timingType );
+ }
+
+ switch ( timingType )
+ {
+ default:
+ case ACTION_USES_NEITHER:
+ {
+ }
+ break;
+ case ACTION_USES_TICK:
+ {
+ int tick = atoi( starttext );
+ if ( tick != m_pAction->GetStartTick() )
+ {
+ m_pAction->SetStartTick( tick );
+ bret = true;
+ }
+ }
+ break;
+ case ACTION_USES_TIME:
+ {
+ float t = (float)atof( starttext );
+ if ( t != m_pAction->GetStartTime() )
+ {
+ m_pAction->SetStartTime( t );
+ bret = true;
+ }
+ }
+ break;
+ }
+
+ return bret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionEditDialog::OnClose()
+{
+ if ( m_bNewAction )
+ {
+ demoaction->AddAction( m_pAction );
+ }
+
+ g_BaseActionEditSaveChained = false;
+ if ( OnSaveChanges() || m_bNewAction )
+ {
+ demoaction->SetDirty( true );
+ m_pEditor->OnRefresh();
+ }
+ Assert( g_BaseActionEditSaveChained );
+ MarkForDeletion();
+ BaseClass::OnClose();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionEditDialog::OnCancel()
+{
+ if ( m_bNewAction )
+ {
+ delete m_pAction;
+ }
+ // Nothing, just delete
+ MarkForDeletion();
+ BaseClass::OnClose();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *commands -
+//-----------------------------------------------------------------------------
+void CBaseActionEditDialog::OnCommand( char const *commands )
+{
+ if ( !Q_strcasecmp( commands, "OK" ) )
+ {
+ OnClose();
+ }
+ else if ( !Q_strcasecmp( commands, "Cancel" ) )
+ {
+ OnCancel();
+ }
+ else
+ {
+ BaseClass::OnCommand( commands );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *parent -
+// *action -
+// newaction -
+//-----------------------------------------------------------------------------
+CBaseActionWithTargetDialog::CBaseActionWithTargetDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+: CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pActionTarget = new vgui::TextEntry( this, "ActionTarget" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Slam text with text from action
+//-----------------------------------------------------------------------------
+void CBaseActionWithTargetDialog::Init( void )
+{
+ BaseClass::Init();
+
+ m_pActionTarget->SetText( m_pAction->GetActionTarget() );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionWithTargetDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char actiontarget[ 512 ];
+ m_pActionTarget->GetText( actiontarget, sizeof( actiontarget ) );
+
+ if ( Q_strcmp( m_pAction->GetActionTarget(), actiontarget ) )
+ {
+ bret = true;
+ m_pAction->SetActionTarget( actiontarget );
+ }
+
+ return bret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionSkipAheadDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionSkipAheadDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionSkipAhead *GetAction( void ) { return static_cast< CDemoActionSkipAhead * >( m_pAction ); }
+
+ vgui::ComboBox *m_pSkipType;
+ vgui::TextEntry *m_pSkip;
+};
+
+CBaseActionSkipAheadDialog::CBaseActionSkipAheadDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pSkip = new vgui::TextEntry( this, "ActionSkip" );
+
+ m_pSkipType = new vgui::ComboBox( this, "ActionSkipType", (int)2, false );
+ for ( int i = 1; i < (int)NUM_TIMING_TYPES; i++ )
+ {
+ m_pSkipType->AddItem( CBaseDemoAction::NameForTimingType( (DEMOACTIONTIMINGTYPE)i ), NULL );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionSkipAheadDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionSkipAheadDialog.res" );
+
+ BaseClass::Init();
+
+ if ( GetAction()->m_bUsingSkipTick )
+ {
+ m_pSkipType->SetText( "TimeUseTick" );
+ m_pSkip->SetText( va( "%i", GetAction()->m_nSkipToTick ) );
+ }
+ else
+ {
+ m_pSkipType->SetText( "TimeUseClock" );
+ m_pSkip->SetText( va( "%.3f", GetAction()->m_flSkipToTime ) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionSkipAheadDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char skiptype[ 512 ];
+ m_pSkipType->GetText( skiptype, sizeof( skiptype ) );
+
+ char skipto[ 512 ];
+ m_pSkip->GetText( skipto, sizeof( skipto ) );
+
+ float fskip = (float)atof( skipto );
+ int iskip = (int)atoi( skipto );
+
+ if ( !Q_strcasecmp( skiptype, "TimeUseTick" ) )
+ {
+ if ( GetAction()->m_nSkipToTick != iskip )
+ {
+ bret = true;
+ GetAction()->SetSkipToTick( iskip );
+ GetAction()->SetSkipToTime( -1.0f );
+ }
+ }
+ else
+ {
+ if ( GetAction()->m_flSkipToTime != fskip )
+ {
+ bret = true;
+ GetAction()->SetSkipToTime( fskip );
+ GetAction()->SetSkipToTick( -1 );
+ }
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_SKIPAHEAD, CBaseActionSkipAheadDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionStopPlaybackDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionStopPlaybackDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+ {
+ }
+
+ virtual void Init( void )
+ {
+ LoadControlSettings( "resource\\BaseActionStopPlaybackDialog.res" );
+
+ BaseClass::Init();
+ }
+private:
+ CDemoActionStopPlayback *GetAction( void ) { return static_cast< CDemoActionStopPlayback * >( m_pAction ); }
+};
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_STOPPLAYBACK, CBaseActionStopPlaybackDialog );
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Screen Fade
+//-----------------------------------------------------------------------------
+class CBaseActionScreenFadeStartDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionScreenFadeStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+ {
+ m_pDuration = new vgui::TextEntry( this, "ScreenFadeDuration" );
+ m_pHoldTime = new vgui::TextEntry( this, "ScreenFadeHoldTime" );
+
+ m_pFFADE_IN = new vgui::CheckButton( this, "ScreenFadeFFADE_IN", "Fade in" );
+ m_pFFADE_OUT = new vgui::CheckButton( this, "ScreenFadeFFADE_OUT", "Fade out" );
+ m_pFFADE_MODULATE = new vgui::CheckButton( this, "ScreenFadeFFADE_MODULATE", "Modulate" );
+ m_pFFADE_STAYOUT = new vgui::CheckButton( this, "ScreenFadeFFADE_STAYOUT", "Stay out" );
+ m_pFFADE_PURGE = new vgui::CheckButton( this, "ScreenFadeFFADE_Purge", "Purge" );
+
+ m_pColor = new vgui::TextEntry( this, "ScreenFadeColor" );
+ }
+
+ virtual void Init( void );
+
+ virtual bool OnSaveChanges( void );
+
+private:
+ CDemoActionScreenFadeStart *GetAction( void ) { return static_cast< CDemoActionScreenFadeStart * >( m_pAction ); }
+
+ bool CheckFlagDifference( vgui::CheckButton *check, bool oldval, int flag );
+
+ vgui::TextEntry *m_pDuration;
+ vgui::TextEntry *m_pHoldTime;
+
+ vgui::CheckButton *m_pFFADE_IN;
+ vgui::CheckButton *m_pFFADE_OUT;
+ vgui::CheckButton *m_pFFADE_MODULATE;
+ vgui::CheckButton *m_pFFADE_STAYOUT;
+ vgui::CheckButton *m_pFFADE_PURGE;
+
+ vgui::TextEntry *m_pColor;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionScreenFadeStartDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionScreenFadeStartDialog.res" );
+
+ BaseClass::Init();
+
+ ScreenFade_t const *f = GetAction()->GetScreenFade();
+
+ float duration = f->duration * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
+ float holdTime = f->holdTime * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
+ int fadein = f->fadeFlags & FFADE_IN;
+ int fadeout = f->fadeFlags & FFADE_OUT;
+ int fademodulate = f->fadeFlags & FFADE_MODULATE;
+ int fadestayout = f->fadeFlags & FFADE_STAYOUT;
+ int fadepurge = f->fadeFlags & FFADE_PURGE;
+ int r = f->r;
+ int g = f->g;
+ int b = f->b;
+ int a = f->a;
+
+ m_pDuration->SetText( va( "%.3f", duration ) );
+ m_pHoldTime->SetText( va( "%.3f", holdTime ) );
+ m_pColor->SetText( va( "%i %i %i %i", r, g, b, a ) );
+ m_pFFADE_IN->SetSelected( fadein != 0 );
+ m_pFFADE_OUT->SetSelected( fadeout != 0 );
+ m_pFFADE_MODULATE->SetSelected( fademodulate != 0 );
+ m_pFFADE_STAYOUT->SetSelected( fadestayout != 0 );
+ m_pFFADE_PURGE->SetSelected( fadepurge != 0 );
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionScreenFadeStartDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ // Grab current settings
+ ScreenFade_t *f = GetAction()->GetScreenFade();
+
+ float duration = f->duration * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
+ float holdTime = f->holdTime * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
+ bool fadein = f->fadeFlags & FFADE_IN;
+ bool fadeout = ( f->fadeFlags & FFADE_OUT ) != 0;
+ bool fademodulate = ( f->fadeFlags & FFADE_MODULATE ) != 0;
+ bool fadestayout = ( f->fadeFlags & FFADE_STAYOUT ) != 0;
+ bool fadepurge = ( f->fadeFlags & FFADE_PURGE ) != 0;
+ int r = f->r;
+ int g = f->g;
+ int b = f->b;
+ int a = f->a;
+
+ char sz[ 512 ];
+ m_pDuration->GetText( sz, sizeof( sz ) );
+ if ( (float)atof( sz ) != duration )
+ {
+ bret = true;
+ f->duration = (unsigned short)((float)(1<<SCREENFADE_FRACBITS) * (float)atof( sz ) );
+ }
+ m_pHoldTime->GetText( sz, sizeof( sz ) );
+ if ( (float)atof( sz ) != holdTime )
+ {
+ bret = true;
+ f->holdTime = (unsigned short)((float)(1<<SCREENFADE_FRACBITS) * (float)atof( sz ) );
+ }
+
+ int rr, gg, bb, aa;
+ m_pColor->GetText( sz, sizeof( sz ) );
+ if ( 4 == sscanf( sz, "%i %i %i %i", &rr, &gg, &bb, &aa ) )
+ {
+ rr = clamp( rr, 0, 255 );
+ gg = clamp( gg, 0, 255 );
+ bb = clamp( bb, 0, 255 );
+ aa = clamp( aa, 0, 255 );
+
+ if ( rr != r || gg != g || bb != b || aa != a )
+ {
+ bret = true;
+ f->r = rr;
+ f->g = gg;
+ f->b = bb;
+ f->a = aa;
+ }
+ }
+
+ if ( CheckFlagDifference( m_pFFADE_IN, fadein, FFADE_IN ) )
+ {
+ bret = true;
+ }
+ if ( CheckFlagDifference( m_pFFADE_OUT, fadeout, FFADE_OUT ) )
+ {
+ bret = true;
+ }
+ if ( CheckFlagDifference( m_pFFADE_MODULATE, fademodulate, FFADE_MODULATE ) )
+ {
+ bret = true;
+ }
+ if ( CheckFlagDifference( m_pFFADE_STAYOUT, fadestayout, FFADE_STAYOUT ) )
+ {
+ bret = true;
+ }
+ if ( CheckFlagDifference( m_pFFADE_PURGE, fadepurge, FFADE_PURGE ) )
+ {
+ bret = true;
+ }
+
+ return bret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *check -
+// oldval -
+// flag -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionScreenFadeStartDialog::CheckFlagDifference( vgui::CheckButton *check, bool oldval, int flag )
+{
+ bool bret = false;
+ if ( check->IsSelected() != oldval )
+ {
+ ScreenFade_t *f = GetAction()->GetScreenFade();
+
+ bret = true;
+ if ( check->IsSelected() )
+ {
+ f->fadeFlags |= flag;
+ }
+ else
+ {
+ f->fadeFlags &= ~flag;
+ }
+ }
+ return bret;
+}
+
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_SCREENFADE_START, CBaseActionScreenFadeStartDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose: Screen Fade
+//-----------------------------------------------------------------------------
+class CBaseActionTextMessageStartDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionTextMessageStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+ {
+ m_pFadeInTime = new vgui::TextEntry( this, "TextMessageFadeInTime" );
+ m_pFadeOutTime = new vgui::TextEntry( this, "TextMessageFadeOutTime" );
+ m_pHoldTime = new vgui::TextEntry( this, "TextMessageHoldTime" );
+ m_pFXTime = new vgui::TextEntry( this, "TextMessageFXTime" );
+
+ m_pMessageText = new vgui::TextEntry( this, "TextMessageText" );
+ m_pFontName = new vgui::ComboBox( this, "TextMessageFont", 6, false );
+
+ m_pX = new vgui::TextEntry( this, "TextMessageX" );
+ m_pY = new vgui::TextEntry( this, "TextMessageY" );
+
+ m_pColor1 = new vgui::TextEntry( this, "TextMessageColor1" );
+ m_pColor2 = new vgui::TextEntry( this, "TextMessageColor2" );
+
+ m_pEffectType = new vgui::ComboBox( this, "TextMessageEffect", 3, false );
+ }
+
+ virtual void Init( void );
+
+ virtual bool OnSaveChanges( void );
+
+private:
+ CDemoActionTextMessageStart *GetAction( void ) { return static_cast< CDemoActionTextMessageStart * >( m_pAction ); }
+
+ void FillInFonts();
+
+ bool SaveDifferingFloat( vgui::TextEntry *control, float *curval );
+ bool SaveDifferingInt( vgui::TextEntry *control, int *curval );
+ bool SaveDifferingColor( vgui::TextEntry *control, byte *r, byte *g, byte *b, byte *a );
+
+ enum
+ {
+ FADEINOUT = 0,
+ FLICKER,
+ WRITEOUT,
+
+ NUM_EFFECT_TYPES
+ };
+
+ struct EffectType
+ {
+ char const *name;
+ };
+
+ static EffectType s_EffectTypes[];
+
+ static int EffectTypeForName( char const *name );
+ static char const *NameForEffectType( int type );
+
+ vgui::TextEntry *m_pFadeInTime;
+ vgui::TextEntry *m_pFadeOutTime;
+ vgui::TextEntry *m_pHoldTime;
+ vgui::TextEntry *m_pFXTime;
+
+ vgui::TextEntry *m_pMessageText;
+ vgui::ComboBox *m_pFontName;
+
+ vgui::ComboBox *m_pEffectType;
+
+ vgui::TextEntry *m_pColor1;
+ vgui::TextEntry *m_pColor2;
+
+ vgui::TextEntry *m_pX;
+ vgui::TextEntry *m_pY;
+};
+
+CBaseActionTextMessageStartDialog::EffectType CBaseActionTextMessageStartDialog::s_EffectTypes[] =
+{
+ { "FADEINOUT" },
+ { "FLICKER" },
+ { "WRITEOUT " }
+};
+
+int CBaseActionTextMessageStartDialog::EffectTypeForName( char const *name )
+{
+ int c = NUM_EFFECT_TYPES;
+ int i;
+ for ( i = 0; i < c; i++ )
+ {
+ if ( !Q_strcasecmp( s_EffectTypes[ i ].name, name ) )
+ return i;
+ }
+ Assert( 0 );
+ return 0;
+}
+
+char const *CBaseActionTextMessageStartDialog::NameForEffectType( int type )
+{
+ Assert( type >= 0 && type < NUM_EFFECT_TYPES );
+
+ return s_EffectTypes[ type ].name;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionTextMessageStartDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionTextMessageStartDialog.res" );
+
+ BaseClass::Init();
+
+ client_textmessage_t *tm = GetAction()->GetTextMessage();
+
+ m_pX->SetText( va( "%f", tm->x ) );
+ m_pY->SetText( va( "%f", tm->y ) );
+
+ m_pFadeInTime->SetText( va( "%.3f", tm->fadein ) );
+ m_pFadeOutTime->SetText( va( "%.3f", tm->fadeout ) );
+ m_pHoldTime->SetText( va( "%.3f", tm->holdtime ) );
+ m_pFXTime->SetText( va( "%.3f", tm->fxtime ) );
+
+ m_pColor1->SetText( va( "%i %i %i %i", tm->r1, tm->g1, tm->b1, tm->a1 ) );
+ m_pColor2->SetText( va( "%i %i %i %i", tm->r2, tm->g2, tm->b2, tm->a2 ) );
+
+ m_pMessageText->SetText( GetAction()->GetMessageText() );
+
+ FillInFonts();
+
+ m_pFontName->SetText( GetAction()->GetFontName() );
+
+ int c = NUM_EFFECT_TYPES;
+ int i;
+ for ( i = 0; i < c ; i++ )
+ {
+ m_pEffectType->AddItem( NameForEffectType( i ), NULL );
+ }
+
+ m_pEffectType->SetText( NameForEffectType( tm->effect ) );
+}
+
+void CBaseActionTextMessageStartDialog::FillInFonts()
+{
+ m_pFontName->AddItem( "TextMessageDefault", NULL );
+
+ KeyValues *schemeFile = new KeyValues( "Fonts" );
+ if ( !schemeFile )
+ return;
+
+ if ( schemeFile->LoadFromFile( g_pFileSystem, "resource/SourceScheme.res" ) )
+ {
+ // Iterate fonts
+ for ( KeyValues *kv = schemeFile->FindKey("Fonts", true)->GetFirstSubKey();
+ kv != NULL;
+ kv = kv->GetNextKey() )
+ {
+ m_pFontName->AddItem( kv->GetName(), NULL );
+ }
+ }
+
+ schemeFile->deleteThis();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *control -
+// *curval -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionTextMessageStartDialog::SaveDifferingFloat( vgui::TextEntry *control, float *curval )
+{
+ bool bret = false;
+
+ Assert( curval && control );
+
+ char sz[ 512 ];
+ control->GetText( sz, sizeof( sz ) );
+
+ float fcontrol = (float)atof( sz );
+ if ( fcontrol != *curval )
+ {
+ *curval = fcontrol;
+ bret = true;
+ }
+
+ return bret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *control -
+// *curval -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionTextMessageStartDialog::SaveDifferingInt( vgui::TextEntry *control, int *curval )
+{
+ bool bret = false;
+
+ Assert( curval && control );
+
+ char sz[ 512 ];
+ control->GetText( sz, sizeof( sz ) );
+
+ int icontrol = atoi( sz );
+ if ( icontrol != *curval )
+ {
+ *curval = icontrol;
+ bret = true;
+ }
+
+ return bret;
+}
+
+bool CBaseActionTextMessageStartDialog::SaveDifferingColor( vgui::TextEntry *control, byte *r, byte *g, byte *b, byte *a )
+{
+ bool bret = false;
+
+ Assert( r && g && b && a && control );
+
+ char sz[ 512 ];
+ control->GetText( sz, sizeof( sz ) );
+
+ int rr, gg, bb, aa;
+ if ( sscanf( sz, "%i %i %i %i", &rr, &gg, &bb, &aa ) == 4 )
+ {
+ if ( *r != rr )
+ {
+ bret = true;
+ *r = rr;
+ }
+ if ( *g != gg )
+ {
+ bret = true;
+ *g = gg;
+ }
+ if ( *b != bb )
+ {
+ bret = true;
+ *b = bb;
+ }
+ if ( *a != aa )
+ {
+ bret = true;
+ *a = aa;
+ }
+ }
+
+ return bret;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseActionTextMessageStartDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ client_textmessage_t *tm = GetAction()->GetTextMessage();
+ bret |= SaveDifferingFloat( m_pFadeInTime, &tm->fadein );
+ bret |= SaveDifferingFloat( m_pFadeOutTime, &tm->fadeout );
+ bret |= SaveDifferingFloat( m_pHoldTime, &tm->holdtime );
+ bret |= SaveDifferingFloat( m_pFXTime, &tm->fxtime );
+
+ bret |= SaveDifferingFloat( m_pX, &tm->x );
+ bret |= SaveDifferingFloat( m_pY, &tm->y );
+
+ bret |= SaveDifferingColor( m_pColor1, &tm->r1, &tm->g1, &tm->b1, &tm->a1 );
+ bret |= SaveDifferingColor( m_pColor2, &tm->r2, &tm->g2, &tm->b2, &tm->a2 );
+
+ char sz[ 1024 ];
+ m_pEffectType->GetText( sz, sizeof( sz ) );
+ int iEffect = EffectTypeForName( sz );
+ if ( iEffect != tm->effect )
+ {
+ tm->effect = iEffect;
+ bret = true;
+ }
+
+ m_pMessageText->GetText( sz, sizeof( sz ) );
+ if ( Q_strcasecmp( sz, GetAction()->GetMessageText() ) )
+ {
+ GetAction()->SetMessageText( sz );
+ bret = true;
+ }
+
+ m_pFontName->GetText( sz, sizeof( sz ) );
+ if ( Q_strcasecmp( sz, GetAction()->GetFontName() ) )
+ {
+ GetAction()->SetFontName( sz );
+ bret = true;
+ }
+ return bret;
+}
+
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_TEXTMESSAGE_START, CBaseActionTextMessageStartDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionPlayCommandsDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionPlayCommandsDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionPlayCommands *GetAction( void ) { return static_cast< CDemoActionPlayCommands * >( m_pAction ); }
+
+ vgui::TextEntry *m_pCommands;
+};
+
+CBaseActionPlayCommandsDialog::CBaseActionPlayCommandsDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pCommands = new vgui::TextEntry( this, "Commands" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionPlayCommandsDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionPlayCommandsDialog.res" );
+
+ BaseClass::Init();
+
+ m_pCommands->SetText( GetAction()->GetCommandStream() );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionPlayCommandsDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char commands[ 512 ];
+ m_pCommands->GetText( commands, sizeof( commands ) );
+
+ if ( Q_strcasecmp( commands, GetAction()->GetCommandStream() ) )
+ {
+ bret = true;
+ GetAction()->SetCommandStream( commands );
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_PLAYCOMMANDS, CBaseActionPlayCommandsDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionCDTrackStartDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionCDTrackStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionCDTrackStart *GetAction( void ) { return static_cast< CDemoActionCDTrackStart * >( m_pAction ); }
+
+ vgui::TextEntry *m_pTrackNumber;
+};
+
+CBaseActionCDTrackStartDialog::CBaseActionCDTrackStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pTrackNumber = new vgui::TextEntry( this, "TrackNumber" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionCDTrackStartDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionCDTrackStartDialog.res" );
+
+ BaseClass::Init();
+
+ m_pTrackNumber->SetText( va( "%i", GetAction()->GetTrack() ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionCDTrackStartDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char track[ 512 ];
+ m_pTrackNumber->GetText( track, sizeof( track ) );
+ int itrack = atoi( track );
+
+ if ( itrack != GetAction()->GetTrack() )
+ {
+ bret = true;
+ GetAction()->SetTrack( itrack );
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_PLAYCDTRACK_START, CBaseActionCDTrackStartDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionPlaySoundStartDialog : public CBaseActionEditDialog
+{
+ DECLARE_CLASS_SIMPLE( CBaseActionPlaySoundStartDialog, CBaseActionEditDialog );
+
+public:
+ CBaseActionPlaySoundStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+
+ virtual void OnCommand( char const *command );
+
+private:
+ CDemoActionPlaySoundStart *GetAction( void ) { return static_cast< CDemoActionPlaySoundStart * >( m_pAction ); }
+
+ MESSAGE_FUNC_CHARPTR( OnFileSelected, "FileSelected", fullpath );
+
+ vgui::TextEntry *m_pSoundName;
+ vgui::Button *m_pChooseSound;
+
+ vgui::DHANDLE< vgui::FileOpenDialog > m_hFileOpenDialog;
+};
+
+CBaseActionPlaySoundStartDialog::CBaseActionPlaySoundStartDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pSoundName = new vgui::TextEntry( this, "SoundName" );
+ m_pChooseSound = new vgui::Button( this, "ChooseSound", "Choose..." );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionPlaySoundStartDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionPlaySoundStartDialog.res" );
+
+ BaseClass::Init();
+
+ m_pSoundName->SetText( GetAction()->GetSoundName() );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionPlaySoundStartDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char soundname[ 512 ];
+ m_pSoundName->GetText( soundname, sizeof( soundname ) );
+
+ if ( Q_strcasecmp( soundname, GetAction()->GetSoundName() ) )
+ {
+ bret = true;
+ GetAction()->SetSoundName( soundname );
+ }
+
+ return bret;
+}
+
+void CBaseActionPlaySoundStartDialog::OnFileSelected( char const *fullpath )
+{
+ if ( !fullpath || !fullpath[ 0 ] )
+ return;
+
+ char relativepath[ 512 ];
+ g_pFileSystem->FullPathToRelativePath( fullpath, relativepath, sizeof( relativepath ) );
+
+ Q_FixSlashes( relativepath );
+
+ char *soundname = relativepath;
+ if ( !Q_strnicmp( relativepath, "sound\\", strlen( "sound\\" ) ) )
+ {
+ soundname += strlen( "sound\\" );
+ }
+
+ m_pSoundName->SetText( soundname );
+
+ if ( m_hFileOpenDialog )
+ {
+ m_hFileOpenDialog->MarkForDeletion();
+ }
+}
+
+void CBaseActionPlaySoundStartDialog::OnCommand( char const *command )
+{
+ if ( !Q_strcasecmp( command, "choosesound" ) )
+ {
+ if ( !m_hFileOpenDialog.Get() )
+ {
+ m_hFileOpenDialog = new vgui::FileOpenDialog( this, "Choose .wav file", true );
+ }
+ if ( m_hFileOpenDialog )
+ {
+ char startPath[ MAX_PATH ];
+ Q_strncpy( startPath, com_gamedir, sizeof( startPath ) );
+ Q_FixSlashes( startPath );
+ m_hFileOpenDialog->SetStartDirectory( va( "%s/sound", startPath ) );
+ m_hFileOpenDialog->DoModal( false );
+ }
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_PLAYSOUND_START, CBaseActionPlaySoundStartDialog );
+
+class CBaseActionWithStopTimeDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+public:
+ CBaseActionWithStopTimeDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+
+private:
+ CBaseDemoActionWithStopTime *GetAction( void ) { return static_cast< CBaseDemoActionWithStopTime * >( m_pAction ); }
+
+ vgui::ComboBox *m_pStopType;
+ vgui::TextEntry *m_pStop;
+};
+
+CBaseActionWithStopTimeDialog::CBaseActionWithStopTimeDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : CBaseActionEditDialog( parent, action, newaction )
+{
+ m_pStop = new vgui::TextEntry( this, "ActionStop" );
+ m_pStopType = new vgui::ComboBox( this, "ActionStopType", (int)2, false );
+ for ( int i = 1; i < (int)NUM_TIMING_TYPES; i++ )
+ {
+ m_pStopType->AddItem( CBaseDemoAction::NameForTimingType( (DEMOACTIONTIMINGTYPE)i ), NULL );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionWithStopTimeDialog::Init( void )
+{
+ BaseClass::Init();
+
+ if ( GetAction()->m_bUsingStopTick )
+ {
+ m_pStopType->SetText( "TimeUseTick" );
+ m_pStop->SetText( va( "%i", GetAction()->m_nStopTick ) );
+ }
+ else
+ {
+ m_pStopType->SetText( "TimeUseClock" );
+ m_pStop->SetText( va( "%.3f", GetAction()->m_flStopTime ) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionWithStopTimeDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char stoptype[ 512 ];
+ m_pStopType->GetText( stoptype, sizeof( stoptype ) );
+
+ char stop[ 512 ];
+ m_pStop->GetText( stop, sizeof( stop ) );
+
+ float fstop = (float)atof( stop );
+ int istop = (int)atoi( stop );
+
+ if ( !Q_strcasecmp( stoptype, "TimeUseTick" ) )
+ {
+ if ( GetAction()->m_nStopTick != istop )
+ {
+ bret = true;
+ GetAction()->SetStopTick( istop );
+ GetAction()->SetStopTime( -1.0f );
+ }
+ }
+ else
+ {
+ if ( GetAction()->m_flStopTime != fstop )
+ {
+ bret = true;
+ GetAction()->SetStopTime( fstop );
+ GetAction()->SetStopTick( -1 );
+ }
+ }
+
+ return bret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionChangePlaybackRateDialog : public CBaseActionWithStopTimeDialog
+{
+ typedef CBaseActionWithStopTimeDialog BaseClass;
+
+public:
+ CBaseActionChangePlaybackRateDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionChangePlaybackRate *GetAction( void ) { return static_cast< CDemoActionChangePlaybackRate * >( m_pAction ); }
+
+ vgui::TextEntry *m_pRate;
+};
+
+CBaseActionChangePlaybackRateDialog::CBaseActionChangePlaybackRateDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+{
+ m_pRate = new vgui::TextEntry( this, "PlaybackRate" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionChangePlaybackRateDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionPlaybackRateDialog.res" );
+
+ BaseClass::Init();
+
+ m_pRate->SetText( va( "%f", GetAction()->GetPlaybackRate() ) );
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionChangePlaybackRateDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char rate[ 512 ];
+ m_pRate->GetText( rate, sizeof( rate ) );
+
+ float frate = (float)atof( rate );
+
+ if ( GetAction()->GetPlaybackRate() != frate )
+ {
+ bret = true;
+ GetAction()->SetPlaybackRate( frate );
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_CHANGEPLAYBACKRATE, CBaseActionChangePlaybackRateDialog );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionPauseDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionPauseDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionPausePlayback *GetAction( void ) { return static_cast< CDemoActionPausePlayback * >( m_pAction ); }
+
+ vgui::TextEntry *m_pPauseTime;
+};
+
+CBaseActionPauseDialog::CBaseActionPauseDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+{
+ m_pPauseTime = new vgui::TextEntry( this, "PauseTime" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionPauseDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionPauseDialog.res" );
+
+ BaseClass::Init();
+
+ m_pPauseTime->SetText( va( "%f", GetAction()->GetPauseTime() ) );
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionPauseDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char pausetime[ 512 ];
+ m_pPauseTime->GetText( pausetime, sizeof( pausetime ) );
+
+ float ftime = (float)atof( pausetime );
+
+ if ( GetAction()->GetPauseTime() != ftime )
+ {
+ bret = true;
+ GetAction()->SetPauseTime( ftime );
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_PAUSE, CBaseActionPauseDialog );
+
+
+// Fonts
+/*
+ // if a font fails to load then the subsequent fonts will replace
+ "Default"
+ "DefaultUnderline"
+ "DefaultSmall"
+ "DefaultVerySmall"
+ "DefaultLarge"
+ "Marlett"
+ "Trebuchet24"
+ "Trebuchet20"
+ "Trebuchet18"
+ "DefaultFixed"
+*/
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseActionZoomDialog : public CBaseActionEditDialog
+{
+ typedef CBaseActionEditDialog BaseClass;
+
+public:
+ CBaseActionZoomDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction );
+
+ virtual void Init( void );
+
+ // Returns true if changes were effected
+ virtual bool OnSaveChanges( void );
+private:
+ CDemoActionZoom *GetAction( void ) { return static_cast< CDemoActionZoom * >( m_pAction ); }
+
+ vgui::CheckButton *m_pSpline;
+ vgui::CheckButton *m_pStayout;
+
+ vgui::TextEntry *m_pFinalFOV;
+ vgui::TextEntry *m_pOutRate;
+ vgui::TextEntry *m_pInRate;
+ vgui::TextEntry *m_pHoldTime;
+};
+
+CBaseActionZoomDialog::CBaseActionZoomDialog( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction )
+ : BaseClass( parent, action, newaction )
+{
+ m_pFinalFOV = new vgui::TextEntry( this, "ZoomFOV" );
+ m_pOutRate = new vgui::TextEntry( this, "ZoomOut" );
+ m_pInRate = new vgui::TextEntry( this, "ZoomIn" );
+ m_pHoldTime = new vgui::TextEntry( this, "ZoomHold" );
+
+ m_pSpline = new vgui::CheckButton( this, "ZoomSpline", "Spline" );
+ m_pStayout = new vgui::CheckButton( this, "ZoomStayout", "Stay Out" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseActionZoomDialog::Init( void )
+{
+ LoadControlSettings( "resource\\BaseActionZoomDialog.res" );
+
+ BaseClass::Init();
+
+ m_pFinalFOV->SetText( va( "%f", GetAction()->m_flFinalFOV ) );
+ m_pOutRate->SetText( va( "%f", GetAction()->m_flFOVRateOut ) );
+ m_pInRate->SetText( va( "%f", GetAction()->m_flFOVRateIn ) );
+ m_pHoldTime->SetText( va( "%f", GetAction()->m_flHoldTime ) );
+
+ m_pSpline->SetSelected( GetAction()->m_bSpline );
+ m_pStayout->SetSelected( GetAction()->m_bStayout );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true if changes were effected
+//-----------------------------------------------------------------------------
+bool CBaseActionZoomDialog::OnSaveChanges( void )
+{
+ bool bret = BaseClass::OnSaveChanges();
+
+ char sz[ 512 ];
+ m_pFinalFOV->GetText( sz, sizeof( sz ) );
+ float f = (float)atof( sz );
+
+ if ( GetAction()->m_flFinalFOV != f )
+ {
+ bret = true;
+ GetAction()->m_flFinalFOV = f;
+ }
+
+ m_pOutRate->GetText( sz, sizeof( sz ) );
+ f = (float)atof( sz );
+
+ if ( GetAction()->m_flFOVRateOut != f )
+ {
+ bret = true;
+ GetAction()->m_flFOVRateOut = f;
+ }
+
+ m_pInRate->GetText( sz, sizeof( sz ) );
+ f = (float)atof( sz );
+
+ if ( GetAction()->m_flFOVRateIn != f )
+ {
+ bret = true;
+ GetAction()->m_flFOVRateIn = f;
+ }
+
+ m_pHoldTime->GetText( sz, sizeof( sz ) );
+ f = (float)atof( sz );
+
+ if ( GetAction()->m_flHoldTime != f )
+ {
+ bret = true;
+ GetAction()->m_flHoldTime = f;
+ }
+
+ if ( m_pSpline->IsSelected() != GetAction()->m_bSpline )
+ {
+ bret = true;
+ GetAction()->m_bSpline = m_pSpline->IsSelected();
+ }
+
+ if ( m_pStayout->IsSelected() != GetAction()->m_bStayout )
+ {
+ bret = true;
+ GetAction()->m_bStayout = m_pStayout->IsSelected();
+ }
+
+ return bret;
+}
+
+DECLARE_DEMOACTIONEDIT( DEMO_ACTION_ZOOM, CBaseActionZoomDialog ); \ No newline at end of file