You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
6.6 KiB
180 lines
6.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: A panel "metaclass" is a name given to a particular type of
|
|
// panel with particular instance data. Such panels tend to be dynamically
|
|
// added and removed from their parent panels.
|
|
//
|
|
// $Workfile: $
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#if !defined( PANELMETACLASSMGR_H )
|
|
#define PANELMETACLASSMGR_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tier0/dbg.h"
|
|
#include "basetypes.h"
|
|
#include <vgui/VGUI.h>
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
class KeyValues;
|
|
class Color;
|
|
|
|
namespace vgui
|
|
{
|
|
class Panel;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Class factory interface for metaclasses
|
|
//-----------------------------------------------------------------------------
|
|
abstract_class IPanelFactory
|
|
{
|
|
public:
|
|
// Creation, destruction methods
|
|
virtual vgui::Panel *Create( const char *pMetaClassName, KeyValues* pKeyValues, void *pInitData, vgui::Panel *pParent ) = 0;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Singleton class responsible for managing vgui panel metaclasses
|
|
// A metaclass is simply an association of panel implementation class with
|
|
// various initialization data
|
|
//-----------------------------------------------------------------------------
|
|
abstract_class IPanelMetaClassMgr
|
|
{
|
|
public:
|
|
// Call this to load up a file containing metaclass definitions
|
|
virtual void LoadMetaClassDefinitionFile( const char *pFileName ) = 0;
|
|
|
|
// Call this to install a new panel type
|
|
// MetaClasses will refer to the panel type to create along with
|
|
// various initialization data
|
|
virtual void InstallPanelType( const char *pPanelName, IPanelFactory *pFactory ) = 0;
|
|
|
|
// Creates a metaclass panel with the specified parent panel.
|
|
// Chain name is used as a filter of the metaclass data; if specified,
|
|
// it recursively iterates through the keyvalue sections and calls
|
|
// chainKeyValue on sections whose name matches the chain name
|
|
virtual vgui::Panel *CreatePanelMetaClass( const char *pMetaClassType,
|
|
int sortorder, void *pInitData, vgui::Panel *pParent, const char *pChainName = NULL ) = 0;
|
|
|
|
// removes a particular panel meta class
|
|
virtual void DestroyPanelMetaClass( vgui::Panel *pPanel ) = 0;
|
|
|
|
protected:
|
|
// Don't delete me!
|
|
virtual ~IPanelMetaClassMgr() {}
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Returns the panel meta class manager
|
|
//-----------------------------------------------------------------------------
|
|
IPanelMetaClassMgr *PanelMetaClassMgr();
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Helper class for simple construction of planel class factories
|
|
// This class is expected to be a singleton
|
|
// Note the panel must have a constructor of the following form:
|
|
// CPanel( vgui::Panel* );
|
|
// and it must have the following member function:
|
|
// bool CPanel::Init( KeyValues* pInitData )
|
|
// which returns true if the panel initialized successfully
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "tier0/memdbgon.h"
|
|
|
|
template< class CPanel, class CInitData >
|
|
class CPanelFactory : public IPanelFactory
|
|
{
|
|
public:
|
|
CPanelFactory( const char *pTypeName )
|
|
{
|
|
// Hook us up baby
|
|
Assert( pTypeName );
|
|
PanelMetaClassMgr()->InstallPanelType( pTypeName, this );
|
|
}
|
|
|
|
// Creation, destruction methods
|
|
virtual vgui::Panel *Create( const char *pMetaClassName, KeyValues* pKeyValues, void *pVoidInitData, vgui::Panel *pParent )
|
|
{
|
|
// NOTE: make sure this matches the panel allocation pattern;
|
|
// it will break if panels are deleted differently
|
|
CPanel* pPanel = new CPanel( pParent, pMetaClassName );
|
|
if (pPanel)
|
|
{
|
|
// Set parent before Init; it may be needed there...
|
|
CInitData* pInitData = (CInitData*)(pVoidInitData);
|
|
if (!pPanel->Init( pKeyValues, pInitData ))
|
|
{
|
|
delete pPanel;
|
|
pPanel = NULL;
|
|
}
|
|
}
|
|
return pPanel;
|
|
}
|
|
};
|
|
|
|
#include "tier0/memdbgoff.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Helper macro to make panel factories one line of code. Use like this:
|
|
// DECLARE_PANEL_FACTORY( CEntityImagePanel, CInitData, "image" );
|
|
// The type string is used in a panel script file to specify the type.
|
|
// CInitData is the type of the data to pass to the init function
|
|
//-----------------------------------------------------------------------------
|
|
#define DECLARE_PANEL_FACTORY( _PanelClass, _InitData, _nameString ) \
|
|
CPanelFactory< _PanelClass, _InitData > g_ ## _PanelClass ## Factory( _nameString )
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Helper class to make meta class panels
|
|
//-----------------------------------------------------------------------------
|
|
class CPanelWrapper
|
|
{
|
|
public:
|
|
CPanelWrapper();
|
|
~CPanelWrapper();
|
|
void Activate( char const* pMetaClassName, vgui::Panel *pParent, int sortorder, void *pVoidInitData );
|
|
void Deactivate( void );
|
|
vgui::Panel *GetPanel( );
|
|
|
|
private:
|
|
vgui::Panel *m_pPanel;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Macros for help with simple registration of panel metaclass
|
|
// Put DECLARE_METACLASS_PANEL() in your class definition
|
|
// and CONSTRUCT_METACLASS_PANEL() in your class constructor
|
|
//-----------------------------------------------------------------------------
|
|
#define DECLARE_METACLASS_PANEL( _memberName ) CPanelWrapper _memberName
|
|
#define CONSTRUCT_METACLASS_PANEL( _memberName, _metaClassName, _parentPanel, _sortorder, _initData ) \
|
|
_memberName.Activate( _metaClassName, _parentPanel, _sortorder, _initData )
|
|
#define DESTRUCT_METACLASS_PANEL( _memberName ) \
|
|
_memberName.Deactivate()
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Helper KeyValues parsing methods
|
|
//-----------------------------------------------------------------------------
|
|
bool ParseRGBA( KeyValues* pValues, const char* pFieldName, int& r, int& g, int& b, int& a );
|
|
bool ParseRGBA( KeyValues* pValues, const char* pFieldName, Color& c );
|
|
bool ParseCoord( KeyValues* pValues, const char* pFieldName, int& x, int& y );
|
|
bool ParseRect( KeyValues* pValues, const char* pFieldName, int& x, int& y, int& w, int& h );
|
|
|
|
|
|
/* FIXME: Why do we have KeyValues too!?!??! Bleah
|
|
bool ParseRGBA( KeyValues *pValues, const char* pFieldName, int& r, int& g, int& b, int& a );
|
|
bool ParseRGBA( KeyValues* pValues, const char* pFieldName, vgui::Color& c ); */
|
|
|
|
#endif // PANELMETACLASSMGR_H
|