This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/client/panelmetaclassmgr.h
2020-08-04 13:13:01 -04:00

172 lines
7.0 KiB
C++

//========= 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 <vgui/VGUI.h>
#include "basetypes.h"
#include "tier0/dbg.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