summaryrefslogtreecommitdiff
path: root/public/panorama/layout/panel2dfactory.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/layout/panel2dfactory.h')
-rw-r--r--public/panorama/layout/panel2dfactory.h111
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