diff options
Diffstat (limited to 'game/client/tf/vgui/tf_matchmaking_dashboard.h')
| -rw-r--r-- | game/client/tf/vgui/tf_matchmaking_dashboard.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/game/client/tf/vgui/tf_matchmaking_dashboard.h b/game/client/tf/vgui/tf_matchmaking_dashboard.h new file mode 100644 index 0000000..57a54e1 --- /dev/null +++ b/game/client/tf/vgui/tf_matchmaking_dashboard.h @@ -0,0 +1,158 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TF_MATCHMAKING_DASHBOARD_H +#define TF_MATCHMAKING_DASHBOARD_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tf_match_join_handlers.h" +#include <vgui_controls/EditablePanel.h> +#include "tf_controls.h" +#include <vgui_controls/PHandle.h> +#include "local_steam_shared_object_listener.h" + +CUtlVector< class CTFMatchmakingPopup* >& CreateMMPopupPanels( bool bRecreate = false ); +class CTFMatchmakingDashboard* GetMMDashboard(); +class CMMDashboardParentManager* GetMMDashboardParentManager(); + +bool BInEndOfMatch(); + +//----------------------------------------------------------------------------- +// Purpose: Popup that goes underneath the dashboard and displays anything +// important the user needs to know about +//----------------------------------------------------------------------------- +class CTFMatchmakingPopup : public CExpandablePanel + , public CGameEventListener + , public IMatchJoiningHandler +{ + friend class CTFMatchmakingPopupState; + friend class CTFMatchmakingDashboard; + DECLARE_CLASS_SIMPLE( CTFMatchmakingPopup, CExpandablePanel ); +public: + + CTFMatchmakingPopup( const char* pszName, const char* pszResFile ); + virtual ~CTFMatchmakingPopup(); + + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE; + virtual void OnThink() OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + virtual void OnTick() OVERRIDE; + + virtual void OnEnter(); + virtual void OnUpdate(); + virtual void OnExit(); + virtual void Update(); + + virtual void FireGameEvent( IGameEvent *pEvent ) OVERRIDE; + +private: + + virtual void MatchFound() {} // We dont need to do anything special + virtual bool ShouldBeActve() const = 0; + void UpdateRematchtime(); + void UpdateAutoJoinTime(); + + bool m_bActive; + const char* m_pszResFile; +}; + +//----------------------------------------------------------------------------- +// Purpose: Matchmaking panel that contains controls for matchmaking +//----------------------------------------------------------------------------- +class CTFMatchmakingDashboard : public CExpandablePanel +{ +public: + DECLARE_CLASS_SIMPLE( CTFMatchmakingDashboard, CExpandablePanel ); + CTFMatchmakingDashboard(); + virtual ~CTFMatchmakingDashboard(); + + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + virtual void OnTick() OVERRIDE; +}; + +//----------------------------------------------------------------------------- +// CMMDashboardParentManager +// Purpose: This guy keeps the MM dashboard as the top-most panel but does so +// *without making it a popup*. This is important because popups look +// awful whenever they overlap and transparency is involved. This class +// does its dirty work by keeping track of the top-most fullscreen popup +// and setting that panel as the MM dashboard's parent. When that popup +// goes away, we set the parent to the next popup on the stack, or to +// the GameUI if none are active. If we're in-game, then we parent to +// the our special popup container. Why not always just parent to that +// single popup container? Because we want the MINIMUM mouse focus area +// possible because the dashboard is not a rectangle (it grows/shrinks). +// +// +// If anything draws on top of the MM dashboard and you dont want it to +// have that panel add itself to this class using PushModalFullscreenPopup +// when it goes visible and PopModalFullscreenPopup when it hides itself +//----------------------------------------------------------------------------- +class CMMDashboardParentManager : public CGameEventListener +{ +public: + friend class CTFMatchmakingDashboard; + friend class CTFMatchmakingPopup; + + CMMDashboardParentManager(); + + virtual void FireGameEvent( IGameEvent *event ) OVERRIDE; + + void PushModalFullscreenPopup( vgui::Panel* pPanel ); + void PopModalFullscreenPopup( vgui::Panel* pPanel ); + void UpdateParenting(); +private: + + void AddPanel( CExpandablePanel* pPanel ); + void RemovePanel( CExpandablePanel* pPanel ); + + void AttachToGameUI(); + void AttachToTopMostPopup(); + + bool m_bAttachedToGameUI; + + class CUtlSortVectorPanelZPos + { + public: + bool Less( const vgui::Panel* lhs, const vgui::Panel* rhs, void * ) + { + return lhs->GetZPos() < rhs->GetZPos(); + } + }; + + CUtlSortVector< CExpandablePanel*, CUtlSortVectorPanelZPos > m_vecPanels; + CUtlVector< vgui::Panel* > m_vecFullscreenPopups; + + vgui::PHandle m_pHUDPopup; +}; + +class IMMPopupFactory +{ +public: + virtual CTFMatchmakingPopup* Create() const = 0; + static CUtlVector< IMMPopupFactory* > s_vecPopupFactories; +}; + +template< typename Type > +class CMMPopupFactoryImplementation : public IMMPopupFactory +{ +public: + CMMPopupFactoryImplementation( const char* pszName, const char* pszResFile ) : m_pszName( pszName ), m_pszResFile( pszResFile ) + { s_vecPopupFactories.AddToTail( this ); } + + virtual CTFMatchmakingPopup* Create() const OVERRIDE { return new Type( m_pszName, m_pszResFile ); } +private: + const char* m_pszName; + const char* m_pszResFile; +}; + +#define REG_MM_POPUP_FACTORY( type, name, resfile ) CMMPopupFactoryImplementation< type > g_##type##Factory( name, resfile ); + +#endif // TF_MATCHMAKING_DASHBOARD_H |