//========= 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 //----------------------------------------------------------------------------- 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