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;
|
|
|