source-engine/game/client/replay/vgui/replaybrowserbasepage.cpp

216 lines
5.6 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#if defined( REPLAY_ENABLED )
#include "vgui/IInput.h"
#include "vgui/ISurface.h"
#include "vgui_controls/TextEntry.h"
#include "replaybrowserbasepage.h"
#include "replaybrowserdetailspanel.h"
#include "replaybrowsermainpanel.h"
#include "replaybrowserlistpanel.h"
#include "replay/ireplaymoviemanager.h"
#include "replay/ireplaymanager.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
//-----------------------------------------------------------------------------
extern IReplayMovieManager *g_pReplayMovieManager;
//-----------------------------------------------------------------------------
CReplayBrowserBasePage::CReplayBrowserBasePage( Panel *pParent )
: BaseClass( pParent, "BasePage" )
{
m_pReplayList = new CReplayListPanel( this, "ReplayList" );
m_pReplayList->SetFirstColumnWidth( 0 );
m_pSearchTextEntry = new vgui::TextEntry( this, "SearchTextEntry" );
m_pSearchTextEntry->SelectAllOnFocusAlways( true );
m_pSearchTextEntry->AddActionSignalTarget( this );
m_pSearchTextEntry->SetCatchEnterKey( true );
InvalidateLayout( true, true );
m_pReplayList->AddReplaysToList();
ivgui()->AddTickSignal( GetVPanel(), 100 );
}
CReplayBrowserBasePage::~CReplayBrowserBasePage()
{
ivgui()->RemoveTickSignal( GetVPanel() );
}
void CReplayBrowserBasePage::OnTick()
{
if ( !IsVisible() )
return;
int nCursorX, nCursorY;
input()->GetCursorPos( nCursorX, nCursorY );
if ( input()->IsMouseDown( MOUSE_LEFT ) &&
!m_pSearchTextEntry->IsWithin( nCursorX, nCursorY ) &&
m_pSearchTextEntry->HasFocus() )
{
RequestFocus();
}
}
void CReplayBrowserBasePage::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
LoadControlSettings( "resource/ui/replaybrowser/basepage.res", "GAME" );
m_pSearchTextEntry->SetText( "#Replay_SearchText" );
}
void CReplayBrowserBasePage::OnPageShow()
{
BaseClass::OnPageShow();
m_pSearchTextEntry->SetText( "#Replay_SearchText" );
}
void CReplayBrowserBasePage::OnSelectionStarted()
{
PostActionSignal( new KeyValues("SelectionUpdate", "open", 1 ) );
}
void CReplayBrowserBasePage::OnSelectionEnded()
{
PostActionSignal( new KeyValues("SelectionUpdate", "open", 0 ) );
}
void CReplayBrowserBasePage::CleanupUIForReplayItem( ReplayItemHandle_t hReplayItem )
{
m_pReplayList->CleanupUIForReplayItem( hReplayItem );
}
void CReplayBrowserBasePage::AddReplay( ReplayHandle_t hReplay )
{
m_pReplayList->AddReplayItem( hReplay );
}
void CReplayBrowserBasePage::DeleteReplay( ReplayHandle_t hReplayItem )
{
IReplayItemManager *pItemManager;
if ( FindReplayItem( hReplayItem, &pItemManager ) )
{
ReplayUI_GetBrowserPanel()->AttemptToDeleteReplayItem( this, hReplayItem, pItemManager, -1 );
}
}
void CReplayBrowserBasePage::OnCancelSelection()
{
}
void CReplayBrowserBasePage::GoBack()
{
DeleteDetailsPanelAndShowReplayList();
}
void CReplayBrowserBasePage::OnReplayItemDeleted( KeyValues *pParams )
{
GoBack();
}
void CReplayBrowserBasePage::OnTextChanged( KeyValues *data )
{
wchar_t wszText[256];
m_pSearchTextEntry->GetText( wszText, ARRAYSIZE( wszText ) );
m_pReplayList->ApplyFilter( wszText );
InvalidateLayout();
}
void CReplayBrowserBasePage::OnCommand( const char *pCommand )
{
// User wants details on a replay?
if ( !V_strnicmp( pCommand, "details", 7 ) )
{
// Get rid of preview panel
m_pReplayList->ClearPreviewPanel();
QueryableReplayItemHandle_t hReplayItem = (QueryableReplayItemHandle_t)atoi( pCommand + 7 );
IReplayItemManager *pItemManager;
IQueryableReplayItem *pReplayItem = FindReplayItem( hReplayItem, &pItemManager ); Assert( pReplayItem );
if ( pReplayItem )
{
// Get performance
int iPerformance = -1;
const char *pPerformanceStr = V_strstr( pCommand + 8, "_" );
if ( pPerformanceStr )
{
iPerformance = atoi( pPerformanceStr + 1 );
}
m_hReplayDetailsPanel = vgui::SETUP_PANEL( new CReplayDetailsPanel( this, hReplayItem, iPerformance, pItemManager ) );
m_hReplayDetailsPanel->SetVisible( true );
m_hReplayDetailsPanel->MoveToFront();
m_pReplayList->SetVisible( false );
surface()->PlaySound( "replay\\showdetails.wav" );
}
}
// "back" button was hit in details panel?
else if ( FStrEq( pCommand, "back" ) )
{
GoBack();
}
BaseClass::OnCommand( pCommand );
}
void CReplayBrowserBasePage::DeleteDetailsPanelAndShowReplayList()
{
// Delete the panel
if ( m_hReplayDetailsPanel )
{
m_hReplayDetailsPanel->MarkForDeletion();
m_hReplayDetailsPanel = NULL;
}
m_pReplayList->SetVisible( true );
}
void CReplayBrowserBasePage::PerformLayout()
{
BaseClass::PerformLayout();
if ( m_pSearchTextEntry )
{
const bool bHasReplays = g_pReplayManager && g_pReplayManager->GetReplayCount();
const bool bHasMovies = g_pReplayMovieManager && g_pReplayMovieManager->GetMovieCount();
int aListPos[2];
m_pReplayList->GetPos( aListPos[0], aListPos[1] );
m_pSearchTextEntry->SetPos( aListPos[0] + m_pReplayList->GetWide() - m_pSearchTextEntry->GetWide(), YRES( 5 ) );
m_pSearchTextEntry->SetVisible( bHasReplays || bHasMovies );
}
// Invalidate the list too, because we might be laying out due to a replay being removed from the list.
m_pReplayList->InvalidateLayout();
}
void CReplayBrowserBasePage::FreeDetailsPanelMovieLock()
{
m_hReplayDetailsPanel->FreeMovieFileLock();
}
bool CReplayBrowserBasePage::IsDetailsViewOpen()
{
return m_hReplayDetailsPanel.Get() != NULL && m_hReplayDetailsPanel->IsVisible();
}
#endif