diff options
Diffstat (limited to 'mp/src/game/client/replay/vgui/replayinputpanel.cpp')
| -rw-r--r-- | mp/src/game/client/replay/vgui/replayinputpanel.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/mp/src/game/client/replay/vgui/replayinputpanel.cpp b/mp/src/game/client/replay/vgui/replayinputpanel.cpp new file mode 100644 index 00000000..7ec78ab1 --- /dev/null +++ b/mp/src/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
|