diff options
Diffstat (limited to 'serverbrowser/QuickListPanel.cpp')
| -rw-r--r-- | serverbrowser/QuickListPanel.cpp | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/serverbrowser/QuickListPanel.cpp b/serverbrowser/QuickListPanel.cpp new file mode 100644 index 0000000..0b08ca0 --- /dev/null +++ b/serverbrowser/QuickListPanel.cpp @@ -0,0 +1,317 @@ +//========= 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 ) +{ + if ( strlen ( pGameType ) == 0 ) + { + m_pGameTypeLabel->SetVisible( false ); + return; + } + + char gametype[ 512 ]; + Q_snprintf( gametype, sizeof( gametype ), "(%s)", pGameType ); + + m_pGameTypeLabel->SetText( gametype ); +} + +//----------------------------------------------------------------------------- +// 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) ); +} |