source-engine/serverbrowser/BaseGamesPage.h

326 lines
8.9 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#ifndef BASEGAMESPAGE_H
#define BASEGAMESPAGE_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/utldict.h"
#include "engine/iserversinfo.h"
class CBaseGamesPage;
//-----------------------------------------------------------------------------
// Purpose: Acts like a regular ListPanel but forwards enter key presses
// to its outer control.
//-----------------------------------------------------------------------------
class CGameListPanel : public vgui::ListPanel
{
public:
DECLARE_CLASS_SIMPLE( CGameListPanel, vgui::ListPanel );
CGameListPanel( CBaseGamesPage *pOuter, const char *pName );
virtual void OnKeyCodePressed(vgui::KeyCode code);
private:
CBaseGamesPage *m_pOuter;
};
class CQuickListMapServerList : public CUtlVector< int >
{
public:
CQuickListMapServerList() : CUtlVector< int >( 1, 0 )
{
}
CQuickListMapServerList( const CQuickListMapServerList& src )
{
CopyArray( src.Base(), src.Count() );
}
CQuickListMapServerList &operator=( const CQuickListMapServerList &src )
{
CopyArray( src.Base(), src.Count() );
return *this;
}
};
class CCheckBoxWithStatus : public vgui::CheckButton
{
public:
DECLARE_CLASS_SIMPLE( CCheckBoxWithStatus, vgui::CheckButton );
CCheckBoxWithStatus(Panel *parent, const char *panelName, const char *text) : vgui::CheckButton( parent, panelName, text )
{
}
virtual void OnCursorEntered();
virtual void OnCursorExited();
};
struct serverping_t
{
int m_nPing;
int iPanelIndex;
};
struct gametypes_t
{
const char *pPrefix;
const char *pGametypeName;
};
//-----------------------------------------------------------------------------
// Purpose: Base property page for all the games lists (internet/favorites/lan/etc.)
//-----------------------------------------------------------------------------
class CBaseGamesPage : public vgui::PropertyPage, public IGameList, public IServerListResponse //, public ISteamMatchmakingPingResponse
{
DECLARE_CLASS_SIMPLE( CBaseGamesPage, vgui::PropertyPage );
public:
enum EPageType
{
eInternetServer,
eLANServer,
eFriendsServer,
eFavoritesServer,
eHistoryServer,
eSpectatorServer
};
// Column indices
enum
{
k_nColumn_Password = 0,
k_nColumn_Secure = 1,
k_nColumn_Replay = 2,
k_nColumn_Name = 3,
k_nColumn_IPAddr = 4,
k_nColumn_GameDesc = 5,
k_nColumn_Players = 6,
k_nColumn_Bots = 7,
k_nColumn_Map = 8,
k_nColumn_Ping = 9,
};
CBaseGamesPage( vgui::Panel *parent, const char *name, EPageType eType, const char *pCustomResFilename=NULL);
~CBaseGamesPage();
virtual void PerformLayout();
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
// gets information about specified server
virtual newgameserver_t *GetServer(unsigned int serverID);
virtual const char *GetConnectCode();
uint32 GetServerFilters( MatchMakingKeyValuePair_t **pFilters );
virtual void SetRefreshing(bool state);
// loads filter settings from disk
virtual void LoadFilterSettings();
// Called by CGameList when the enter key is pressed.
// This is overridden in the add server dialog - since there is no Connect button, the message
// never gets handled, but we want to add a server when they dbl-click or press enter.
virtual bool OnGameListEnterPressed();
int GetSelectedItemsCount();
// adds a server to the favorites
MESSAGE_FUNC( OnAddToFavorites, "AddToFavorites" );
virtual void StartRefresh();
virtual void UpdateDerivedLayouts( void );
void PrepareQuickListMap( newgameserver_t *server, int iListID );
void SelectQuickListServers( void );
vgui::Panel *GetActiveList( void );
virtual bool IsQuickListButtonChecked()
{
return m_pQuickListCheckButton ? m_pQuickListCheckButton->IsSelected() : false;
}
STEAM_CALLBACK( CBaseGamesPage, OnFavoritesMsg, FavoritesListChanged_t, m_CallbackFavoritesMsg );
// applies games filters to current list
void ApplyGameFilters();
void OnLoadingStarted()
{
StopRefresh();
}
protected:
virtual void OnCommand(const char *command);
virtual void OnKeyCodePressed(vgui::KeyCode code);
virtual int GetRegionCodeToFilter() { return 255; }
MESSAGE_FUNC( OnItemSelected, "ItemSelected" );
// updates server count UI
void UpdateStatus();
// ISteamMatchmakingServerListResponse callbacks
virtual void ServerResponded( newgameserver_t &server );
virtual void RefreshComplete( NServerResponse response );
// ISteamMatchmakingPingResponse callbacks
//virtual void ServerResponded( gameserveritem_t &server );
//virtual void ServerFailedToRespond() {}
virtual void ServerResponded( int iServer, gameserveritem_t *pServerItem );
// Removes server from list
void RemoveServer( serverdisplay_t &server );
virtual bool BShowServer( serverdisplay_t &server ) { return server.m_bDoNotRefresh; }
void ClearServerList();
// filtering methods
// returns true if filters passed; false if failed
virtual bool CheckPrimaryFilters( newgameserver_t &server);
virtual bool CheckSecondaryFilters( newgameserver_t &server );
virtual bool CheckTagFilter( newgameserver_t &server ) { return true; }
virtual bool CheckWorkshopFilter( newgameserver_t &server ) { return true; }
virtual int GetInvalidServerListID();
virtual void OnSaveFilter(KeyValues *filter);
virtual void OnLoadFilter(KeyValues *filter);
virtual void UpdateFilterSettings();
// whether filter settings limit which master server to query
CGameID &GetFilterAppID() { return m_iLimitToAppID; }
virtual void GetNewServerList();
virtual void StopRefresh();
virtual bool IsRefreshing();
virtual void OnPageShow();
virtual void OnPageHide();
// called when Connect button is pressed
MESSAGE_FUNC( OnBeginConnect, "ConnectToServer" );
// called to look at game info
MESSAGE_FUNC( OnViewGameInfo, "ViewGameInfo" );
// refreshes a single server
MESSAGE_FUNC_INT( OnRefreshServer, "RefreshServer", serverID );
// If true, then we automatically select the first item that comes into the games list.
bool m_bAutoSelectFirstItemInGameList;
CGameListPanel *m_pGameList;
vgui::PanelListPanel *m_pQuickList;
vgui::ComboBox *m_pLocationFilter;
// command buttons
vgui::Button *m_pConnect;
vgui::Button *m_pRefreshAll;
vgui::Button *m_pRefreshQuick;
vgui::Button *m_pAddServer;
vgui::Button *m_pAddCurrentServer;
vgui::Button *m_pAddToFavoritesButton;
vgui::ToggleButton *m_pFilter;
CUtlMap<uint64, int> m_mapGamesFilterItem;
CUtlMap<int, serverdisplay_t> m_mapServers;
CUtlMap<netadr_t, int> m_mapServerIP;
CUtlVector<newgameserver_t> m_serversInfo;
CUtlVector<MatchMakingKeyValuePair_t> m_vecServerFilters;
CUtlDict< CQuickListMapServerList, int > m_quicklistserverlist;
int m_iServerRefreshCount;
CUtlVector<serverping_t> m_vecServersFound;
EPageType m_eMatchMakingType;
HServerListRequest m_hRequest;
int GetSelectedServerID( KeyValues **pKV = NULL );
void ClearQuickList( void );
bool TagsExclude( void );
enum eWorkshopMode {
// These correspond to the dropdown indices
eWorkshop_None = 0,
eWorkshop_WorkshopOnly = 1,
eWorkshop_SubscribedOnly = 2
};
eWorkshopMode WorkshopMode();
void HideReplayFilter( void );
protected:
virtual void CreateFilters();
virtual void UpdateGameFilter();
MESSAGE_FUNC_PTR_CHARPTR( OnTextChanged, "TextChanged", panel, text );
MESSAGE_FUNC_PTR_INT( OnButtonToggled, "ButtonToggled", panel, state );
void UpdateFilterAndQuickListVisibility();
bool BFiltersVisible() { return m_bFiltersVisible; }
private:
void RequestServersResponse( int iServer, EMatchMakingServerResponse response, bool bLastServer ); // callback for matchmaking interface
void RecalculateFilterString();
void SetQuickListEnabled( bool bEnabled );
void SetFiltersVisible( bool bVisible );
// If set, it uses the specified resfile name instead of its default one.
const char *m_pCustomResFilename;
// filter controls
vgui::ComboBox *m_pGameFilter;
vgui::TextEntry *m_pMapFilter;
vgui::TextEntry *m_pMaxPlayerFilter;
vgui::ComboBox *m_pPingFilter;
vgui::ComboBox *m_pSecureFilter;
vgui::ComboBox *m_pTagsIncludeFilter;
vgui::ComboBox *m_pWorkshopFilter;
vgui::CheckButton *m_pNoFullServersFilterCheck;
vgui::CheckButton *m_pNoEmptyServersFilterCheck;
vgui::CheckButton *m_pNoPasswordFilterCheck;
CCheckBoxWithStatus *m_pQuickListCheckButton;
vgui::Label *m_pFilterString;
char m_szComboAllText[64];
vgui::CheckButton *m_pReplayFilterCheck;
KeyValues *m_pFilters; // base filter data
bool m_bFiltersVisible; // true if filter section is currently visible
vgui::HFont m_hFont;
int m_nImageIndexPassword;
int m_nImageIndexSecure;
int m_nImageIndexSecureVacBanned;
int m_nImageIndexReplay;
// filter data
char m_szGameFilter[32];
char m_szMapFilter[32];
int m_iMaxPlayerFilter;
int m_iPingFilter;
bool m_bFilterNoFullServers;
bool m_bFilterNoEmptyServers;
bool m_bFilterNoPasswordedServers;
int m_iSecureFilter;
bool m_bFilterReplayServers;
CGameID m_iLimitToAppID;
};
#endif // BASEGAMESPAGE_H