diff options
Diffstat (limited to 'game/client/replay/vgui/replayinputpanel.cpp')
| -rw-r--r-- | game/client/replay/vgui/replayinputpanel.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/game/client/replay/vgui/replayinputpanel.cpp b/game/client/replay/vgui/replayinputpanel.cpp new file mode 100644 index 0000000..7fab825 --- /dev/null +++ b/game/client/replay/vgui/replayinputpanel.cpp @@ -0,0 +1,245 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +//=======================================================================================// + +#include "cbase.h" + +#if defined( REPLAY_ENABLED ) + +#include "replayinputpanel.h" +#include "replaybrowsermainpanel.h" +#include "replay/replay.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/TextEntry.h" +#include "vgui/IInput.h" +#include "vgui/ILocalize.h" +#include "ienginevgui.h" +#include "vgui_int.h" +#include "vgui/ISurface.h" +#include "iclientmode.h" +#include "replay/ireplaymanager.h" +#include "econ/econ_controls.h" + +#if defined( TF_CLIENT_DLL ) +#include "tf_item_inventory.h" +#endif + +using namespace vgui; + +//----------------------------------------------------------------------------- + +static bool s_bPanelVisible = false; + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Purpose: Player input dialog for a replay +//----------------------------------------------------------------------------- +class CReplayInputPanel : public EditablePanel +{ +private: + DECLARE_CLASS_SIMPLE( CReplayInputPanel, EditablePanel ); + +public: + CReplayInputPanel( Panel *pParent, const char *pName, ReplayHandle_t hReplay ); + ~CReplayInputPanel(); + + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void PerformLayout(); + virtual void OnCommand( const char *command ); + virtual void OnKeyCodePressed( KeyCode code ); + virtual void OnKeyCodeTyped( KeyCode code ); + + MESSAGE_FUNC( OnSetFocus, "SetFocus" ); + +private: + Panel *m_pDlg; + TextEntry *m_pTitleEntry; + ReplayHandle_t m_hReplay; +}; + +//----------------------------------------------------------------------------- +// Purpose: CReplayInputPanel implementation +//----------------------------------------------------------------------------- +CReplayInputPanel::CReplayInputPanel( Panel *pParent, const char *pName, ReplayHandle_t hReplay ) +: BaseClass( pParent, pName ), + m_hReplay( hReplay ), + m_pDlg( NULL ), + m_pTitleEntry( NULL ) +{ + SetScheme( "ClientScheme" ); + SetProportional( true ); +} + +CReplayInputPanel::~CReplayInputPanel() +{ +} + +void CReplayInputPanel::ApplySchemeSettings( IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + LoadControlSettings( "resource/ui/replayinputpanel.res", "GAME" ); + + // Cache off the dlg pointer + m_pDlg = FindChildByName( "Dlg" ); + + // Setup some action sigsies + m_pDlg->FindChildByName( "SaveButton" )->AddActionSignalTarget( this ); + m_pDlg->FindChildByName( "CancelButton" )->AddActionSignalTarget( this ); + + m_pTitleEntry = static_cast< TextEntry * >( m_pDlg->FindChildByName( "TitleInput" ) ); + m_pTitleEntry->SelectAllOnFocusAlways( true ); + m_pTitleEntry->SetSelectionBgColor( GetSchemeColor( "Yellow", Color( 255, 255, 255, 255), pScheme ) ); + m_pTitleEntry->SetSelectionTextColor( Color( 255, 255, 255, 255 ) ); + + if ( m_hReplay != REPLAY_HANDLE_INVALID ) + { + CReplay *pReplay = g_pReplayManager->GetReplay( m_hReplay ); + m_pTitleEntry->SetText( pReplay->m_wszTitle ); + } +} + +void CReplayInputPanel::PerformLayout() +{ + BaseClass::PerformLayout(); + + SetWide( ScreenWidth() ); + SetTall( ScreenHeight() ); + + // Center + m_pDlg->SetPos( ( ScreenWidth() - m_pDlg->GetWide() ) / 2, ( ScreenHeight() - m_pDlg->GetTall() ) / 2 ); +} + +void CReplayInputPanel::OnKeyCodeTyped( KeyCode code ) +{ + if ( code == KEY_ESCAPE ) + { + OnCommand( "cancel" ); + } + + BaseClass::OnKeyCodeTyped( code ); +} + +void CReplayInputPanel::OnKeyCodePressed( KeyCode code ) +{ + if ( code == KEY_ENTER ) + { + OnCommand( "save" ); + } + + BaseClass::OnKeyCodePressed( code ); +} + +void CReplayInputPanel::OnSetFocus() +{ + m_pTitleEntry->RequestFocus(); +} + +void CReplayInputPanel::OnCommand( const char *command ) +{ + bool bCloseWindow = false; + bool bLocalPlayerDead = false; + if ( !Q_strnicmp( command, "save", 4 ) ) + { + if ( m_hReplay != REPLAY_HANDLE_INVALID ) + { + // Store the title + CReplay *pReplay = g_pReplayManager->GetReplay( m_hReplay ); + if ( pReplay ) + { + m_pTitleEntry->GetText( pReplay->m_wszTitle, sizeof( pReplay->m_wszTitle ) ); + } + + // Cache to disk + g_pReplayManager->FlagReplayForFlush( pReplay, false ); + + // Add the replay to the browser + CReplayBrowserPanel* pReplayBrowser = ReplayUI_GetBrowserPanel(); + if ( pReplayBrowser ) + { + pReplayBrowser->OnSaveReplay( m_hReplay ); + } + + // Display a message - if we somehow disconnect, we can crash here if local player isn't checked + C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); + if ( pLocalPlayer ) + { + g_pClientMode->DisplayReplayMessage( pLocalPlayer->IsAlive() ? "#Replay_ReplaySavedAlive" : "#Replay_ReplaySavedDead", -1.0f, false, "replay\\saved.wav", false ); + + // Check to see if player's dead - used later to determine if we should show items window + bLocalPlayerDead = !pLocalPlayer->IsAlive(); + } + } + bCloseWindow = true; + } + else if ( !Q_strnicmp( command, "cancel", 6 ) ) + { + bCloseWindow = true; + } + + // Close the window? + if ( bCloseWindow ) + { + s_bPanelVisible = false; + SetVisible( false ); + TFModalStack()->PopModal( this ); + MarkForDeletion(); + + // This logic is perhaps a smidge of a hack. We have to be careful about executing "gameui_hide" + // since it will hide the item pickup panel. If there are no items to be picked up, we can safely + // hide the gameui panel, but we have to call CheckForRoomAndForceDiscard() (as ShowItemsPickedUp() + // does if no items are picked up). Otherwise, skip the "gameui_hide" call and show the item pickup + // panel. +#if defined( TF_CLIENT_DLL ) + if ( TFInventoryManager()->GetNumItemPickedUpItems() == 0 ) + { + TFInventoryManager()->CheckForRoomAndForceDiscard(); + engine->ClientCmd_Unrestricted( "gameui_hide" ); + } + else if ( bLocalPlayerDead ) + { + // Now show the items pickup screen if player's dead + TFInventoryManager()->ShowItemsPickedUp(); + } +#endif + } + + BaseClass::OnCommand( command ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool IsReplayInputPanelVisible() +{ + return s_bPanelVisible; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void ShowReplayInputPanel( ReplayHandle_t hReplay ) +{ + vgui::DHANDLE< CReplayInputPanel > hReplayInputPanel; + + hReplayInputPanel = vgui::SETUP_PANEL( new CReplayInputPanel( NULL, "ReplayInputPanel", hReplay ) ); + hReplayInputPanel->SetVisible( true ); + hReplayInputPanel->MakePopup(); + hReplayInputPanel->MoveToFront(); + hReplayInputPanel->SetKeyBoardInputEnabled(true); + hReplayInputPanel->SetMouseInputEnabled(true); + TFModalStack()->PushModal( hReplayInputPanel ); + engine->ClientCmd_Unrestricted( "gameui_hide" ); + s_bPanelVisible = true; +} + +//----------------------------------------------------------------------------- +// Purpose: Test the replay input dialog +//----------------------------------------------------------------------------- +CON_COMMAND_F( open_replayinputpanel, "Open replay input panel test", FCVAR_NONE ) +{ + ShowReplayInputPanel( NULL ); +} + +#endif |