summaryrefslogtreecommitdiff
path: root/serverbrowser/FavoriteGames.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'serverbrowser/FavoriteGames.cpp')
-rw-r--r--serverbrowser/FavoriteGames.cpp214
1 files changed, 214 insertions, 0 deletions
diff --git a/serverbrowser/FavoriteGames.cpp b/serverbrowser/FavoriteGames.cpp
new file mode 100644
index 0000000..0149baf
--- /dev/null
+++ b/serverbrowser/FavoriteGames.cpp
@@ -0,0 +1,214 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "pch_serverbrowser.h"
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CFavoriteGames::CFavoriteGames(vgui::Panel *parent) :
+ CBaseGamesPage(parent, "FavoriteGames", eFavoritesServer )
+{
+ m_bRefreshOnListReload = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CFavoriteGames::~CFavoriteGames()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: loads favorites list from disk
+//-----------------------------------------------------------------------------
+void CFavoriteGames::LoadFavoritesList()
+{
+ if ( steamapicontext->SteamMatchmaking() && steamapicontext->SteamMatchmaking()->GetFavoriteGameCount() == 0 )
+ {
+ // set empty message
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoFavoriteServers");
+ }
+ else
+ {
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoInternetGamesResponded");
+
+ }
+
+ if ( m_bRefreshOnListReload )
+ {
+ m_bRefreshOnListReload = false;
+ StartRefresh();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: returns true if the game list supports the specified ui elements
+//-----------------------------------------------------------------------------
+bool CFavoriteGames::SupportsItem(InterfaceItem_e item)
+{
+ switch (item)
+ {
+ case FILTERS:
+ case ADDSERVER:
+ return true;
+
+ case ADDCURRENTSERVER:
+ return !IsSteam() && BFiltersVisible();
+
+ case GETNEWLIST:
+ default:
+ return false;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: called when the current refresh list is complete
+//-----------------------------------------------------------------------------
+void CFavoriteGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
+{
+ SetRefreshing(false);
+ if ( steamapicontext->SteamMatchmaking() && steamapicontext->SteamMatchmaking()->GetFavoriteGameCount() == 0 )
+ {
+ // set empty message
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoFavoriteServers");
+ }
+ else
+ {
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoInternetGamesResponded");
+
+ }
+ m_pGameList->SortList();
+
+ BaseClass::RefreshComplete( hReq, response );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: opens context menu (user right clicked on a server)
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnOpenContextMenu(int itemID)
+{
+ CServerContextMenu *menu = ServerBrowserDialog().GetContextMenu(GetActiveList());
+
+ // get the server
+ int serverID = GetSelectedServerID();
+
+ if ( serverID != -1 )
+ {
+ // Activate context menu
+ menu->ShowMenu(this, serverID, true, true, true, false);
+ menu->AddMenuItem("RemoveServer", "#ServerBrowser_RemoveServerFromFavorites", new KeyValues("RemoveFromFavorites"), this);
+ }
+ else
+ {
+ // no selected rows, so don't display default stuff in menu
+ menu->ShowMenu( this,(uint32)-1, false, false, false, false );
+ }
+
+ menu->AddMenuItem("AddServerByName", "#ServerBrowser_AddServerByIP", new KeyValues("AddServerByName"), this);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: removes a server from the favorites
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnRemoveFromFavorites()
+{
+ if ( !steamapicontext->SteamMatchmakingServers() || !steamapicontext->SteamMatchmaking() )
+ return;
+
+ // iterate the selection
+ for ( int iGame = 0; iGame < m_pGameList->GetSelectedItemsCount(); iGame++ )
+ {
+ int itemID = m_pGameList->GetSelectedItem( iGame );
+ int serverID = m_pGameList->GetItemData(itemID)->userData;
+
+ gameserveritem_t *pServer = steamapicontext->SteamMatchmakingServers()->GetServerDetails( m_hRequest, serverID );
+
+ if ( pServer )
+ {
+ steamapicontext->SteamMatchmaking()->RemoveFavoriteGame( pServer->m_nAppID, pServer->m_NetAdr.GetIP(), pServer->m_NetAdr.GetConnectionPort(), pServer->m_NetAdr.GetQueryPort(), k_unFavoriteFlagFavorite );
+ }
+ }
+
+ UpdateStatus();
+ InvalidateLayout();
+ Repaint();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Adds a server by IP address
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnAddServerByName()
+{
+ // open the add server dialog
+ CDialogAddServer *dlg = new CDialogAddServer( &ServerBrowserDialog(), this );
+ dlg->MoveToCenterOfScreen();
+ dlg->DoModal();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Adds the currently connected server to the list
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnAddCurrentServer()
+{
+ gameserveritem_t *pConnected = ServerBrowserDialog().GetCurrentConnectedServer();
+
+ if ( pConnected && steamapicontext->SteamMatchmaking() )
+ {
+ steamapicontext->SteamMatchmaking()->AddFavoriteGame( pConnected->m_nAppID, pConnected->m_NetAdr.GetIP(), pConnected->m_NetAdr.GetConnectionPort(), pConnected->m_NetAdr.GetQueryPort(), k_unFavoriteFlagFavorite, time( NULL ) );
+ m_bRefreshOnListReload = true;
+
+ if ( GameSupportsReplay() )
+ {
+ // send command to propagate to the client so the client can send it on to the GC
+ char command[ 256 ];
+ Q_snprintf( command, Q_ARRAYSIZE( command ), "rfgc %s\n", pConnected->m_NetAdr.GetConnectionAddressString() );
+ g_pRunGameEngine->AddTextCommand( command );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Parse posted messages
+//
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnCommand(const char *command)
+{
+ if (!Q_stricmp(command, "AddServerByName"))
+ {
+ OnAddServerByName();
+ }
+ else if (!Q_stricmp(command, "AddCurrentServer" ))
+ {
+ OnAddCurrentServer();
+ }
+ else
+ {
+ BaseClass::OnCommand(command);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: enables adding server
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnConnectToGame()
+{
+ m_pAddCurrentServer->SetEnabled( true );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: disables adding current server
+//-----------------------------------------------------------------------------
+void CFavoriteGames::OnDisconnectFromGame( void )
+{
+ m_pAddCurrentServer->SetEnabled( false );
+}