//========= Copyright © 1996-2005, 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<holdTime * (1.0f/(float)(1<fadeFlags & FFADE_IN ) ? true : false; bool fadeout = ( f->fadeFlags & FFADE_OUT ) ? true : false; bool fademodulate = ( f->fadeFlags & FFADE_MODULATE ) ? true : false; bool fadestayout = ( f->fadeFlags & FFADE_STAYOUT ) ? true : false; bool fadepurge = ( f->fadeFlags & FFADE_PURGE ) ? true : false; 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 ); m_pFFADE_OUT->SetSelected( fadeout ); m_pFFADE_MODULATE->SetSelected( fademodulate ); m_pFFADE_STAYOUT->SetSelected( fadestayout ); m_pFFADE_PURGE->SetSelected( fadepurge ); } //----------------------------------------------------------------------------- // 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<holdTime * (1.0f/(float)(1<fadeFlags & FFADE_IN ) ? true : false; bool fadeout = ( f->fadeFlags & FFADE_OUT ) ? true : false; bool fademodulate = ( f->fadeFlags & FFADE_MODULATE ) ? true : false; bool fadestayout = ( f->fadeFlags & FFADE_STAYOUT ) ? true : false; bool fadepurge = ( f->fadeFlags & FFADE_PURGE ) ? true : false; 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<GetText( sz, sizeof( sz ) ); if ( (float)atof( sz ) != holdTime ) { bret = true; f->holdTime = (unsigned short)((float)(1<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 ( StringHasPrefix( relativepath, "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 ); m_hFileOpenDialog->SetDeleteSelfOnClose( false ); } 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 );