318 lines
8.4 KiB
C++
318 lines
8.4 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
#include "pch_serverbrowser.h"
|
|
|
|
using namespace vgui;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Invisible panel that forwards up mouse movement
|
|
//-----------------------------------------------------------------------------
|
|
class CMouseMessageForwardingPanel : public vgui::Panel
|
|
{
|
|
DECLARE_CLASS_SIMPLE( CMouseMessageForwardingPanel, vgui::Panel );
|
|
public:
|
|
CMouseMessageForwardingPanel( Panel *parent, const char *name );
|
|
|
|
virtual void PerformLayout( void );
|
|
virtual void OnMousePressed( vgui::MouseCode code );
|
|
virtual void OnMouseDoublePressed( vgui::MouseCode code );
|
|
virtual void OnMouseWheeled(int delta);
|
|
};
|
|
|
|
CMouseMessageForwardingPanel::CMouseMessageForwardingPanel( Panel *parent, const char *name ) : BaseClass( parent, name )
|
|
{
|
|
// don't draw an
|
|
SetPaintEnabled(false);
|
|
SetPaintBackgroundEnabled(false);
|
|
SetPaintBorderEnabled(false);
|
|
}
|
|
|
|
void CMouseMessageForwardingPanel::PerformLayout()
|
|
{
|
|
// fill out the whole area
|
|
int w, t;
|
|
GetParent()->GetSize(w, t);
|
|
SetBounds(0, 0, w, t);
|
|
}
|
|
|
|
void CMouseMessageForwardingPanel::OnMousePressed( vgui::MouseCode code )
|
|
{
|
|
if ( GetParent() )
|
|
{
|
|
GetParent()->OnMousePressed( code );
|
|
}
|
|
}
|
|
|
|
void CMouseMessageForwardingPanel::OnMouseDoublePressed( vgui::MouseCode code )
|
|
{
|
|
if ( GetParent() )
|
|
{
|
|
GetParent()->OnMouseDoublePressed( code );
|
|
}
|
|
}
|
|
|
|
void CMouseMessageForwardingPanel::OnMouseWheeled(int delta)
|
|
{
|
|
if ( GetParent() )
|
|
{
|
|
GetParent()->OnMouseWheeled( delta );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
CQuickListPanel::CQuickListPanel( vgui::Panel* pParent, const char *pElementName ) : BaseClass( pParent, pElementName )
|
|
{
|
|
SetParent( pParent );
|
|
|
|
m_pListPanelParent = pParent;
|
|
|
|
CMouseMessageForwardingPanel *panel = new CMouseMessageForwardingPanel(this, NULL);
|
|
panel->SetZPos(3);
|
|
|
|
m_pLatencyImage = new ImagePanel( this, "latencyimage" );
|
|
m_pPlayerCountLabel = new Label( this, "playercount", "" );
|
|
m_pOtherServersLabel = new Label( this, "otherservercount", "" );
|
|
m_pServerNameLabel = new Label( this, "servername", "" );
|
|
m_pBGroundPanel = new Panel( this, "background" );
|
|
m_pMapImage = new ImagePanel( this, "mapimage" );
|
|
m_pGameTypeLabel = new Label( this, "gametype", "" );
|
|
m_pMapNameLabel = new Label( this, "mapname", "" );
|
|
m_pLatencyLabel = new Label( this, "latencytext", "" );
|
|
m_pReplayImage = new ImagePanel( this, "replayimage" );
|
|
|
|
const char *pPathID = "PLATFORM";
|
|
|
|
if ( g_pFullFileSystem->FileExists( "servers/QuickListPanel.res", "MOD" ) )
|
|
{
|
|
pPathID = "MOD";
|
|
}
|
|
|
|
LoadControlSettings( "servers/QuickListPanel.res", pPathID );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::ApplySchemeSettings(IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
|
|
if ( pScheme && m_pBGroundPanel )
|
|
{
|
|
m_pBGroundPanel->SetBgColor( pScheme->GetColor("QuickListBGDeselected", Color(255, 255, 255, 0 ) ) );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::SetRefreshing( void )
|
|
{
|
|
if ( m_pServerNameLabel )
|
|
{
|
|
m_pServerNameLabel->SetText( g_pVGuiLocalize->Find("#ServerBrowser_QuickListRefreshing") );
|
|
}
|
|
|
|
if ( m_pPlayerCountLabel )
|
|
{
|
|
m_pPlayerCountLabel->SetVisible( false );
|
|
}
|
|
if ( m_pOtherServersLabel )
|
|
{
|
|
m_pOtherServersLabel->SetVisible( false );
|
|
}
|
|
|
|
if ( m_pLatencyImage )
|
|
{
|
|
m_pLatencyImage->SetVisible( false );
|
|
}
|
|
|
|
if ( m_pReplayImage )
|
|
{
|
|
m_pReplayImage->SetVisible( false );
|
|
}
|
|
|
|
if ( m_pLatencyLabel )
|
|
{
|
|
m_pLatencyLabel->SetVisible( false );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::SetMapName( const char *pMapName )
|
|
{
|
|
Q_strncpy( m_szMapName, pMapName, sizeof( m_szMapName ) );
|
|
|
|
if ( m_pMapNameLabel )
|
|
{
|
|
m_pMapNameLabel->SetText( pMapName );
|
|
m_pMapNameLabel->SizeToContents();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::SetGameType( const char *pGameType )
|
|
{
|
|
m_pGameTypeLabel->SetVisible( false );
|
|
|
|
if ( strlen ( pGameType ) == 0 || !m_pMapNameLabel )
|
|
return;
|
|
|
|
char gametype[ 512 ];
|
|
Q_snprintf( gametype, sizeof( gametype ), "%s (%s)", m_szMapName, pGameType );
|
|
|
|
m_pMapNameLabel->SetText( gametype );
|
|
m_pMapNameLabel->SizeToContents();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::SetServerInfo ( KeyValues *pKV, int iListID, int iTotalServers )
|
|
{
|
|
if ( pKV == NULL )
|
|
return;
|
|
|
|
m_iListID = iListID;
|
|
|
|
m_pServerNameLabel->SetText( pKV->GetString( "name", " " ) );
|
|
|
|
int iPing = pKV->GetInt( "ping", 0 );
|
|
|
|
if ( iPing <= 100 )
|
|
{
|
|
m_pLatencyImage->SetImage( "../vgui/icon_con_high.vmt" );
|
|
}
|
|
else if ( iPing <= 150 )
|
|
{
|
|
m_pLatencyImage->SetImage( "../vgui/icon_con_medium.vmt" );
|
|
}
|
|
else
|
|
{
|
|
m_pLatencyImage->SetImage( "../vgui/icon_con_low.vmt" );
|
|
}
|
|
|
|
m_pLatencyImage->SetVisible( false );
|
|
|
|
if ( GameSupportsReplay() )
|
|
{
|
|
if ( pKV->GetInt( "Replay", 0 ) > 0 )
|
|
{
|
|
m_pReplayImage->SetVisible( true );
|
|
}
|
|
}
|
|
|
|
char ping[ 512 ];
|
|
Q_snprintf( ping, sizeof( ping ), "%d ms", iPing );
|
|
|
|
m_pLatencyLabel->SetText( ping );
|
|
m_pLatencyLabel->SetVisible( true );
|
|
|
|
wchar_t players[ 512 ];
|
|
wchar_t playercount[16];
|
|
wchar_t *pwszPlayers = g_pVGuiLocalize->Find("#ServerBrowser_Players");
|
|
|
|
g_pVGuiLocalize->ConvertANSIToUnicode( pKV->GetString( "players", " " ), playercount, sizeof( playercount ) );
|
|
|
|
_snwprintf( players, ARRAYSIZE( players ), L"%ls %ls", playercount, pwszPlayers );
|
|
|
|
m_pPlayerCountLabel->SetText( players );
|
|
m_pPlayerCountLabel->SetVisible( true );
|
|
|
|
|
|
// Now setup the other server count
|
|
if ( iTotalServers == 2 )
|
|
{
|
|
m_pOtherServersLabel->SetText( g_pVGuiLocalize->Find("#ServerBrowser_QuickListOtherServer") );
|
|
m_pOtherServersLabel->SetVisible( true );
|
|
}
|
|
else if ( iTotalServers > 2 )
|
|
{
|
|
wchar_t *pwszServers = g_pVGuiLocalize->Find("#ServerBrowser_QuickListOtherServers");
|
|
_snwprintf( playercount, Q_ARRAYSIZE(playercount), L"%d", (iTotalServers-1) );
|
|
g_pVGuiLocalize->ConstructString( players, sizeof( players ), pwszServers, 1, playercount );
|
|
m_pOtherServersLabel->SetText( players );
|
|
m_pOtherServersLabel->SetVisible( true );
|
|
}
|
|
else
|
|
{
|
|
m_pOtherServersLabel->SetVisible( false );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CQuickListPanel::SetImage( const char *pMapName )
|
|
{
|
|
char path[ 512 ];
|
|
Q_snprintf( path, sizeof( path ), "materials/vgui/maps/menu_thumb_%s.vmt", pMapName );
|
|
|
|
char map[ 512 ];
|
|
Q_snprintf( map, sizeof( map ), "maps/%s.bsp", pMapName );
|
|
|
|
if ( g_pFullFileSystem->FileExists( map, "MOD" ) == false )
|
|
{
|
|
pMapName = "default_download";
|
|
}
|
|
else
|
|
{
|
|
if ( g_pFullFileSystem->FileExists( path, "MOD" ) == false )
|
|
{
|
|
pMapName = "default";
|
|
}
|
|
}
|
|
|
|
if ( m_pMapImage )
|
|
{
|
|
char imagename[ 512 ];
|
|
Q_snprintf( imagename, sizeof( imagename ), "..\\vgui\\maps\\menu_thumb_%s", pMapName );
|
|
|
|
m_pMapImage->SetImage ( imagename );
|
|
m_pMapImage->SetMouseInputEnabled( false );
|
|
}
|
|
}
|
|
|
|
void CQuickListPanel::OnMousePressed( vgui::MouseCode code )
|
|
{
|
|
if ( m_pListPanelParent )
|
|
{
|
|
vgui::PanelListPanel *pParent = dynamic_cast < vgui::PanelListPanel *> ( m_pListPanelParent );
|
|
|
|
if ( pParent )
|
|
{
|
|
pParent->SetSelectedPanel( this );
|
|
m_pListPanelParent->CallParentFunction( new KeyValues("ItemSelected", "itemID", -1 ) );
|
|
}
|
|
|
|
if ( code == MOUSE_RIGHT )
|
|
{
|
|
m_pListPanelParent->CallParentFunction( new KeyValues("OpenContextMenu", "itemID", -1 ) );
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void CQuickListPanel::OnMouseDoublePressed( vgui::MouseCode code )
|
|
{
|
|
if ( code == MOUSE_RIGHT )
|
|
return;
|
|
|
|
// call the panel
|
|
OnMousePressed( code );
|
|
|
|
m_pListPanelParent->CallParentFunction( new KeyValues("ConnectToServer", "code", code) );
|
|
}
|