diff options
Diffstat (limited to 'game/client/replay/vgui/replaybrowserbasepage.cpp')
| -rw-r--r-- | game/client/replay/vgui/replaybrowserbasepage.cpp | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/game/client/replay/vgui/replaybrowserbasepage.cpp b/game/client/replay/vgui/replaybrowserbasepage.cpp new file mode 100644 index 0000000..0416147 --- /dev/null +++ b/game/client/replay/vgui/replaybrowserbasepage.cpp @@ -0,0 +1,216 @@ +//========= 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
\ No newline at end of file |