diff options
Diffstat (limited to 'public/panorama/layout/panel2dfactory.h')
| -rw-r--r-- | public/panorama/layout/panel2dfactory.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/public/panorama/layout/panel2dfactory.h b/public/panorama/layout/panel2dfactory.h new file mode 100644 index 0000000..361004d --- /dev/null +++ b/public/panorama/layout/panel2dfactory.h @@ -0,0 +1,111 @@ +//=========== 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
\ No newline at end of file |