141 lines
3.7 KiB
C++
141 lines
3.7 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: The manager that deals with menus
|
|
//
|
|
// $Revision: $
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
|
|
#ifndef MENUMANAGER_H
|
|
#define MENUMANAGER_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "gamemanager.h"
|
|
#include "tier1/utldict.h"
|
|
#include "tier1/utlstack.h"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
namespace vgui
|
|
{
|
|
class Panel;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Interface used to create menus
|
|
//-----------------------------------------------------------------------------
|
|
abstract_class IMenuFactory
|
|
{
|
|
public:
|
|
// Returns the name of the menu it will create
|
|
virtual const char *GetMenuName() = 0;
|
|
|
|
// Creates the menu
|
|
virtual vgui::Panel *CreateMenu( vgui::Panel *pParent ) = 0;
|
|
|
|
// Used to build a list during construction
|
|
virtual IMenuFactory *GetNextFactory( ) = 0;
|
|
|
|
protected:
|
|
virtual ~IMenuFactory() {}
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Menu managemer
|
|
//-----------------------------------------------------------------------------
|
|
class CMenuManager : public CGameManager<>
|
|
{
|
|
public:
|
|
typedef vgui::Panel* (*MenuFactory_t)( vgui::Panel *pParent );
|
|
|
|
// Inherited from IGameManager
|
|
virtual bool Init();
|
|
virtual void Update( );
|
|
virtual void Shutdown();
|
|
|
|
// Push, pop menus
|
|
void PushMenu( const char *pMenuName );
|
|
void PopMenu( );
|
|
void PopAllMenus( );
|
|
|
|
// Pop the top menu, push specified menu
|
|
void SwitchToMenu( const char *pMenuName );
|
|
|
|
// Returns the name of the topmost panel
|
|
const char *GetTopmostPanelName();
|
|
|
|
// Call to register methods which can construct menus w/ particular ids
|
|
// NOTE: This method is not expected to be called directly. Use the REGISTER_MENU macro instead
|
|
// It returns the previous head of the list of factories
|
|
static IMenuFactory* RegisterMenu( IMenuFactory *pMenuFactory );
|
|
|
|
private:
|
|
void CleanUpAllMenus();
|
|
|
|
typedef unsigned char MenuFactoryIndex_t;
|
|
CUtlDict< IMenuFactory *, MenuFactoryIndex_t > m_MenuFactories;
|
|
CUtlStack< vgui::Panel * > m_nActiveMenu;
|
|
bool m_bPopRequested;
|
|
bool m_bPopAllRequested;
|
|
IMenuFactory *m_pPushRequested;
|
|
static IMenuFactory *m_pFirstFactory;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Singleton accessor
|
|
//-----------------------------------------------------------------------------
|
|
extern CMenuManager *g_pMenuManager;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Macro used to register menus with the menu manager
|
|
// For example, add the line REGISTER_MENU( "MainMenu", CMainMenu );
|
|
// into the class defining the main menu
|
|
//-----------------------------------------------------------------------------
|
|
template < class T >
|
|
class CMenuFactory : public IMenuFactory
|
|
{
|
|
public:
|
|
CMenuFactory( const char *pMenuName ) : m_pMenuName( pMenuName )
|
|
{
|
|
m_pNextFactory = CMenuManager::RegisterMenu( this );
|
|
}
|
|
|
|
// Returns the name of the menu it will create
|
|
virtual const char *GetMenuName()
|
|
{
|
|
return m_pMenuName;
|
|
}
|
|
|
|
// Creates the menu
|
|
virtual vgui::Panel *CreateMenu( vgui::Panel *pParent )
|
|
{
|
|
return new T( pParent, m_pMenuName );
|
|
}
|
|
|
|
// Used to build a list during construction
|
|
virtual IMenuFactory *GetNextFactory( )
|
|
{
|
|
return m_pNextFactory;
|
|
}
|
|
|
|
private:
|
|
const char* m_pMenuName;
|
|
IMenuFactory *m_pNextFactory;
|
|
};
|
|
|
|
#define REGISTER_MENU( _name, _className ) \
|
|
static CMenuFactory< _className > s_Factory ## _className( _name )
|
|
|
|
|
|
#endif // MENUMANAGER_H
|
|
|