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.
209 lines
4.9 KiB
209 lines
4.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $Workfile: $
|
|
// $Date: $
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
#include "cbase.h"
|
|
#include "iloadingdisc.h"
|
|
#include "vgui_controls/Frame.h"
|
|
#include "vgui_controls/Label.h"
|
|
#include "hud_numericdisplay.h"
|
|
#include "vgui/ISurface.h"
|
|
#include "vgui/ILocalize.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
extern vgui::ILocalize *g_pVGuiLocalize;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Displays the loading plaque
|
|
//-----------------------------------------------------------------------------
|
|
class CLoadingDiscPanel : public vgui::EditablePanel
|
|
{
|
|
typedef vgui::EditablePanel BaseClass;
|
|
public:
|
|
CLoadingDiscPanel( vgui::VPANEL parent );
|
|
~CLoadingDiscPanel();
|
|
|
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme )
|
|
{
|
|
BaseClass::ApplySchemeSettings( pScheme );
|
|
|
|
int w, h;
|
|
w = ScreenWidth();
|
|
h = ScreenHeight();
|
|
|
|
if ( w != m_ScreenSize[ 0 ] ||
|
|
h != m_ScreenSize[ 1 ] )
|
|
{
|
|
m_ScreenSize[ 0 ] = w;
|
|
m_ScreenSize[ 1 ] = h;
|
|
|
|
// Re-perform the layout if the screen size changed
|
|
LoadControlSettings( "resource/LoadingDiscPanel.res" );
|
|
}
|
|
|
|
// center the dialog
|
|
int wide, tall;
|
|
GetSize( wide, tall );
|
|
SetPos( ( w - wide ) / 2, ( h - tall ) / 2 );
|
|
}
|
|
|
|
virtual void PaintBackground()
|
|
{
|
|
SetBgColor( Color(0, 0, 0, 128) );
|
|
SetPaintBackgroundType( 2 );
|
|
BaseClass::PaintBackground();
|
|
}
|
|
|
|
virtual void SetText( const char *text )
|
|
{
|
|
m_pLoadingLabel->SetText( text );
|
|
}
|
|
|
|
private:
|
|
vgui::Label *m_pLoadingLabel;
|
|
int m_ScreenSize[ 2 ];
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Constructor
|
|
//-----------------------------------------------------------------------------
|
|
CLoadingDiscPanel::CLoadingDiscPanel( vgui::VPANEL parent ) : BaseClass( NULL, "CLoadingDiscPanel" )
|
|
{
|
|
int w, h;
|
|
w = ScreenWidth();
|
|
h = ScreenHeight();
|
|
|
|
SetParent( parent );
|
|
SetProportional( true );
|
|
SetScheme( "ClientScheme" );
|
|
SetVisible( false );
|
|
SetCursor( NULL );
|
|
|
|
m_pLoadingLabel = vgui::SETUP_PANEL(new vgui::Label( this, "LoadingLabel", "" ));
|
|
m_pLoadingLabel->SetPaintBackgroundEnabled( false );
|
|
|
|
LoadControlSettings( "resource/LoadingDiscPanel.res" );
|
|
|
|
// center the dialog
|
|
int wide, tall;
|
|
GetSize( wide, tall );
|
|
SetPos( ( w - wide ) / 2, ( h - tall ) / 2 );
|
|
|
|
m_ScreenSize[ 0 ] = w;
|
|
m_ScreenSize[ 1 ] = h;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Destructor
|
|
//-----------------------------------------------------------------------------
|
|
CLoadingDiscPanel::~CLoadingDiscPanel()
|
|
{
|
|
}
|
|
|
|
class CLoadingDisc : public ILoadingDisc
|
|
{
|
|
private:
|
|
CLoadingDiscPanel *loadingDiscPanel;
|
|
CLoadingDiscPanel *m_pPauseDiscPanel;
|
|
vgui::VPANEL m_hParent;
|
|
|
|
int m_nPrevTimeRemaining;
|
|
|
|
public:
|
|
CLoadingDisc( void )
|
|
{
|
|
loadingDiscPanel = NULL;
|
|
m_pPauseDiscPanel = NULL;
|
|
m_nPrevTimeRemaining = -1;
|
|
}
|
|
|
|
void Create( vgui::VPANEL parent )
|
|
{
|
|
// don't create now, only when it's needed
|
|
m_hParent = parent;
|
|
}
|
|
|
|
void Destroy( void )
|
|
{
|
|
if ( loadingDiscPanel )
|
|
{
|
|
loadingDiscPanel->SetParent( (vgui::Panel *)NULL );
|
|
loadingDiscPanel->MarkForDeletion();
|
|
loadingDiscPanel = NULL;
|
|
}
|
|
|
|
if ( m_pPauseDiscPanel )
|
|
{
|
|
m_pPauseDiscPanel->SetParent( (vgui::Panel *)NULL );
|
|
m_pPauseDiscPanel->MarkForDeletion();
|
|
m_pPauseDiscPanel = NULL;
|
|
}
|
|
|
|
m_hParent = NULL;
|
|
}
|
|
|
|
void SetLoadingVisible( bool bVisible )
|
|
{
|
|
// demand-create the dialog
|
|
if ( bVisible && !loadingDiscPanel )
|
|
{
|
|
loadingDiscPanel = vgui::SETUP_PANEL(new CLoadingDiscPanel( m_hParent ) );
|
|
}
|
|
|
|
if ( loadingDiscPanel )
|
|
{
|
|
loadingDiscPanel->SetVisible( bVisible );
|
|
}
|
|
}
|
|
|
|
|
|
void SetPausedVisible( bool bVisible, float flExpireTime /*= -1.f */)
|
|
{
|
|
if ( bVisible )
|
|
{
|
|
if ( !m_pPauseDiscPanel )
|
|
{
|
|
m_pPauseDiscPanel = vgui::SETUP_PANEL(new CLoadingDiscPanel( m_hParent ) );
|
|
}
|
|
|
|
if ( m_pPauseDiscPanel )
|
|
{
|
|
// Update when we have a timer
|
|
if ( flExpireTime != -1.f )
|
|
{
|
|
int nTime = (int)( flExpireTime - Plat_FloatTime() );
|
|
if ( nTime != m_nPrevTimeRemaining )
|
|
{
|
|
wchar_t wzString[256];
|
|
wchar_t wzTime[64];
|
|
char szString[256];
|
|
_snwprintf( wzTime, sizeof( wzTime ), L"%d", nTime );
|
|
g_pVGuiLocalize->ConstructString_safe( wzString, g_pVGuiLocalize->Find( "#GameUI_PausedTimer" ), 1, wzTime );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( wzString, szString, sizeof( szString ) );
|
|
m_pPauseDiscPanel->SetText( szString );
|
|
|
|
m_nPrevTimeRemaining = nTime;
|
|
}
|
|
}
|
|
else if ( m_pPauseDiscPanel->IsVisible() != bVisible )
|
|
{
|
|
m_pPauseDiscPanel->SetText( "#gameui_paused" );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( m_pPauseDiscPanel )
|
|
{
|
|
m_pPauseDiscPanel->SetVisible( bVisible );
|
|
}
|
|
}
|
|
};
|
|
|
|
static CLoadingDisc g_LoadingDisc;
|
|
ILoadingDisc *loadingdisc = ( ILoadingDisc * )&g_LoadingDisc;
|