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.
111 lines
4.3 KiB
111 lines
4.3 KiB
//=========== Copyright Valve Corporation, All rights reserved. ===============// |
|
// |
|
// Purpose: |
|
//=============================================================================// |
|
|
|
#ifndef PANEL2DFACTORY_H |
|
#define PANEL2DFACTORY_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "utlsymbol.h" |
|
#include "tier1/utlrbtree.h" |
|
#include "panorama/panoramasymbol.h" |
|
|
|
|
|
namespace panorama |
|
{ |
|
class IUIPanel; |
|
class IUIPanelClient; |
|
class IUIEngine; |
|
class CPanel2DFactory; |
|
|
|
#ifdef DBGFLAG_VALIDATE |
|
void ValidatePanel2DFactory( CValidator &validator ); |
|
#endif |
|
|
|
void RegisterPanelFactoriesWithEngine( IUIEngine *pEngine ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Used by DECLARE_PANEL2D_FACTORY macro to create a linked list of instancing functions |
|
//----------------------------------------------------------------------------- |
|
typedef panorama::IUIPanelClient *(*PANEL2DCREATEFUNC)(const char *pchName, panorama::IUIPanel *parent); |
|
typedef CPanoramaSymbol( *PANELSYMBOLFUNC )(); |
|
class CPanel2DFactory |
|
{ |
|
public: |
|
CPanel2DFactory( CPanoramaSymbol *pSym, char const *pchLayoutName, PANEL2DCREATEFUNC func, void *pChrisBoydBS, PANELSYMBOLFUNC symParentFunc ); |
|
|
|
static bool BRegisteredLocalName( CUtlSymbol symName ); |
|
CPanoramaSymbol BaseClassSymbol() { return m_funcSymParent(); } |
|
|
|
private: |
|
friend class CUIEngine; |
|
IUIPanelClient *CreatePanelInternal( const char *pchID, panorama::IUIPanel *parent ); |
|
|
|
PANELSYMBOLFUNC m_funcSymParent; |
|
|
|
PANEL2DCREATEFUNC m_funcCreate; |
|
}; |
|
|
|
|
|
// This is the macro which implements creation of each type of panel. It creates a function which instances an object of the specified type |
|
// It them hooks that function up to the helper list so that objects can create the elements by name, with no header file dependency, etc. |
|
// Params: className = name of class to create |
|
// layoutName = name used in the layout file |
|
#define REGISTER_PANEL2D_FACTORY( className, layoutName ) \ |
|
panorama::CPanoramaSymbol className::m_symbol; \ |
|
static panorama::IUIPanelClient *Create_##layoutName( const char *pchID, panorama::IUIPanel *parent ) \ |
|
{ \ |
|
return new className( ToPanel2D(parent), pchID ); \ |
|
}; \ |
|
namespace panorama { className *g_##layoutName##LinkerHack = NULL; } \ |
|
panorama::CPanel2DFactory g_##layoutName##_Helper( &className::m_symbol, #layoutName, Create_##layoutName, panorama::g_##layoutName##LinkerHack, &className::BaseClass::GetPanelSymbol ); |
|
|
|
// Can be used to register a name so it can be used as a top level panel in XML, but can't be created through a layout file |
|
#define REGISTER_PANEL2D( className, layoutName ) \ |
|
panorama::CPanoramaSymbol className::m_symbol; \ |
|
namespace panorama { className *g_##layoutName##LinkerHack = NULL; } \ |
|
panorama::CPanel2DFactory g_##layoutName##_Helper( &className::m_symbol, #layoutName, NULL, panorama::g_##layoutName##LinkerHack, &className::BaseClass::GetPanelSymbol ); |
|
|
|
|
|
// Can be used to reserve a panel name w/o a panel class |
|
#define REGISTER_PANEL_NAME( layoutName ) \ |
|
panorama::CPanoramaSymbol k_symPanel##layoutName; \ |
|
panorama::CPanoramaSymbol Get_##layoutName##_Symbol() { return k_symPanel##layoutName; } \ |
|
panorama::CPanel2DFactory g_##layoutName##_Helper( &k_symPanel##layoutName, #layoutName, NULL, NULL, &Get_##layoutName##_Symbol ); |
|
|
|
|
|
|
|
#define DECLARE_PANEL2D( className, baseClassName ) \ |
|
public: \ |
|
typedef baseClassName BaseClass; \ |
|
typedef className ThisClass; \ |
|
static panorama::CPanoramaSymbol m_symbol; \ |
|
\ |
|
static panorama::CPanoramaSymbol GetPanelSymbol() { return className::m_symbol; } \ |
|
virtual panorama::CPanoramaSymbol GetPanelType() const { return className::m_symbol; } \ |
|
private: |
|
|
|
|
|
#define DECLARE_PANEL2D_NO_BASE( className ) \ |
|
public: \ |
|
typedef className ThisClass; \ |
|
typedef className BaseClass; \ |
|
static panorama::CPanoramaSymbol m_symbol; \ |
|
\ |
|
static panorama::CPanoramaSymbol GetPanelSymbol() { return className::m_symbol; } \ |
|
virtual panorama::CPanoramaSymbol GetPanelType() const { return className::m_symbol; } \ |
|
private: |
|
|
|
} // namespace panorama |
|
|
|
inline uint32 HashItem( const panorama::CPanoramaSymbol &item ) |
|
{ |
|
return ::HashItem( (UtlSymId_t)item ); |
|
} |
|
|
|
|
|
#endif // PANEL2DFACTORY_H
|