You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.1 KiB
245 lines
7.1 KiB
//========= 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
|
|
|