diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vgui2/dme_controls/AttributeWidgetFactory.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'vgui2/dme_controls/AttributeWidgetFactory.cpp')
| -rw-r--r-- | vgui2/dme_controls/AttributeWidgetFactory.cpp | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/vgui2/dme_controls/AttributeWidgetFactory.cpp b/vgui2/dme_controls/AttributeWidgetFactory.cpp new file mode 100644 index 0000000..3a9292f --- /dev/null +++ b/vgui2/dme_controls/AttributeWidgetFactory.cpp @@ -0,0 +1,370 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#include "dme_controls/AttributeWidgetFactory.h" +#include "tier1/utldict.h" +#include "tier1/KeyValues.h" +#include "movieobjects/dmeeditortypedictionary.h" +#include "dme_controls/AttributeTextEntry.h" +#include "dme_controls/AttributeFilePickerPanel.h" +#include "dme_controls/AttributeBoolChoicePanel.h" +#include "dme_controls/AttributeIntChoicePanel.h" +#include "dme_controls/AttributeStringChoicePanel.h" +#include "dme_controls/AttributeElementPanel.h" +#include "dme_controls/AttributeElementPickerPanel.h" +#include "dme_controls/AttributeMDLPickerPanel.h" +#include "dme_controls/AttributeSequencePickerPanel.h" +#include "dme_controls/AttributeSoundPickerPanel.h" +#include "dme_controls/AttributeAssetPickerPanel.h" +#include "dme_controls/AttributeShaderPickerPanel.h" +#include "dme_controls/AttributeSurfacePropertyPickerPanel.h" +#include "dme_controls/AttributeDetailTypePickerPanel.h" +#include "dme_controls/AttributeColorPickerPanel.h" +#include "dme_controls/AttributeInterpolatorChoicePanel.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + + +//----------------------------------------------------------------------------- +// Forward declaration +//----------------------------------------------------------------------------- +class CAttributeWidgetFactoryList; + + +using namespace vgui; + + +//----------------------------------------------------------------------------- +// CAttributeWidgetFactoryList class definition +//----------------------------------------------------------------------------- +class CAttributeWidgetFactoryList : public IAttributeWidgetFactoryList +{ +public: + // Inherited from IAttributeWidgetFactoryList + virtual IAttributeWidgetFactory *GetWidgetFactory( const char *pWidgetName ); + virtual IAttributeWidgetFactory *GetWidgetFactory( CDmElement *object, CDmAttribute *pAttribute, CDmeEditorTypeDictionary *pTypeDictionary ); + virtual IAttributeWidgetFactory *GetArrayWidgetFactory( CDmElement *object, CDmAttribute *pAttribute, CDmeEditorTypeDictionary *pTypeDictionary ); + virtual void ApplyChanges( vgui::Panel *pWidget, vgui::Panel *pSender = NULL ); + virtual void Refresh( vgui::Panel *pWidget, vgui::Panel *pSender = NULL ); + + // Adds a widget to the factory + void AddWidgetFactory( IAttributeWidgetFactory *pFactory, const char *pWidgetName ); + + // Finds a widget factory by name + IAttributeWidgetFactory *FindWidgetFactory( const char *pWidgetName ); + + // Creates a widget using editor attribute info +// vgui::Panel *CreateWidget( vgui::Panel *parent, CDmElement *obj, INotifyUI *pNotify, CDmeEditorAttributeInfo *pWidgetInfo, bool bAutoApply ); + +private: + CUtlDict< IAttributeWidgetFactory*, unsigned short > m_Factories; +}; + + +//----------------------------------------------------------------------------- +// Singleton instance +//----------------------------------------------------------------------------- +static CAttributeWidgetFactoryList *g_pWidgetFactoryFactoryList; +IAttributeWidgetFactoryList *attributewidgetfactorylist; + +CAttributeWidgetFactoryList *GetWidgetFactoryManager() +{ + if ( !g_pWidgetFactoryFactoryList ) + { + g_pWidgetFactoryFactoryList = new CAttributeWidgetFactoryList; + attributewidgetfactorylist = g_pWidgetFactoryFactoryList; + } + return g_pWidgetFactoryFactoryList; +} + + +//----------------------------------------------------------------------------- +// Standard implementation of a widget factory +//----------------------------------------------------------------------------- +template < class T > +class CAttributeWidgetFactory : public IAttributeWidgetFactory +{ +public: + CAttributeWidgetFactory( const char *pWidgetName ) + { + GetWidgetFactoryManager()->AddWidgetFactory( this, pWidgetName ); + } + + // Backward compat + virtual vgui::Panel *Create( vgui::Panel *pParent, const AttributeWidgetInfo_t &info ) + { + CBaseAttributePanel *newPanel = new T( pParent, info ); + if ( newPanel ) + { + newPanel->PostConstructor(); + } + return newPanel; + } +}; + + +//----------------------------------------------------------------------------- +// create all the AttributeWidgetFactorys +//----------------------------------------------------------------------------- + +// An Attribute Widget Factory for: text entry +static CAttributeWidgetFactory<CAttributeTextPanel> g_AttributeTextWidgetFactory( "text" ); + +// An Attribute Widget Factory for: picking files +static CAttributeWidgetFactory<CAttributeDmeFilePickerPanel> g_AttributeFilePickerWidgetFactory( "filepicker" ); + +// An Attribute Widget Factory for: choosing integers +static CAttributeWidgetFactory<CAttributeBoolChoicePanel> g_AttributeBoolChoiceWidgetFactory( "boolchoice" ); + +// An Attribute Widget Factory for: choosing integers +static CAttributeWidgetFactory<CAttributeIntChoicePanel> g_AttributeIntChoiceWidgetFactory( "intchoice" ); + +// An Attribute Widget Factory for: choosing strings +static CAttributeWidgetFactory<CAttributeStringChoicePanel> g_AttributeStringChoiceWidgetFactory( "stringchoice" ); + +// An Attribute Widget Factory for: elements +static CAttributeWidgetFactory<CAttributeElementPanel> g_AttributeElementWidgetFactory( "element" ); + +// An Attribute Widget Factory for: picking elements +static CAttributeWidgetFactory<CAttributeElementPickerPanel> g_AttributeElementPickerWidgetFactory( "elementchoice" ); + +// An Attribute Widget Factory for: picking MDLs +static CAttributeWidgetFactory<CAttributeMDLPickerPanel> g_AttributeMDLPickerWidgetFactory( "mdlpicker" ); + +// An Attribute Widget Factory for: picking sequences +static CAttributeWidgetFactory<CAttributeSequencePickerPanel> g_AttributeSequencePickerWidgetFactory( "sequencepicker" ); + +// An Attribute Widget Factory for: picking sounds +static CAttributeWidgetFactory<CAttributeSoundPickerPanel> g_AttributeSoundPickerWidgetFactory( "soundpicker" ); + +// An Attribute Widget Factory for: picking bsps +static CAttributeWidgetFactory<CAttributeBspPickerPanel> g_AttributeBspPickerWidgetFactory( "bsppicker" ); + +// An Attribute Widget Factory for: picking vmts +static CAttributeWidgetFactory<CAttributeVmtPickerPanel> g_AttributeVmtPickerWidgetFactory( "vmtpicker" ); + +// An Attribute Widget Factory for: picking vtfs +static CAttributeWidgetFactory<CAttributeVtfPickerPanel> g_AttributeVtfPickerWidgetFactory( "vtfpicker" ); + +// An Attribute Widget Factory for: picking tgas +static CAttributeWidgetFactory<CAttributeTgaFilePickerPanel> g_AttributeTgaPickerWidgetFactory( "tgapicker" ); + +// An Attribute Widget Factory for: picking shaders +static CAttributeWidgetFactory<CAttributeShaderPickerPanel> g_AttributeShaderPickerWidgetFactory( "shaderpicker" ); + +// An Attribute Widget Factory for: picking surface properties +static CAttributeWidgetFactory<CAttributeSurfacePropertyPickerPanel> g_AttributeSurfacePropertyPickerWidgetFactory( "surfacepropertypicker" ); + +// An Attribute Widget Factory for: picking surface properties +static CAttributeWidgetFactory<CAttributeColorPickerPanel> g_AttributeColorPickerWidgetFactory( "colorpicker" ); + +// An Attribute Widget Factory for: picking avis +static CAttributeWidgetFactory<CAttributeAviFilePickerPanel> g_AttributeAviPickerWidgetFactory( "avipicker" ); + +// An Attribute Widget Factory for: picking sht +static CAttributeWidgetFactory<CAttributeShtFilePickerPanel> g_AttributeShtPickerWidgetFactory( "shtpicker" ); + +// An Attribute Widget Factory for: picking detail types +static CAttributeWidgetFactory<CAttributeDetailTypePickerPanel> g_AttributeDetailTypePickerWidgetFactory( "detailtypepicker" ); + +// An Attribute Widget Factory for: picking color correction lookup files +static CAttributeWidgetFactory<CAttributeRawFilePickerPanel> g_AttributeRawPickerWidgetFactory( "rawpicker" ); + +// An Attribute Widget Factory for: choosing interpolator types (left and right) +static CAttributeWidgetFactory<CAttributeInterpolatorChoicePanel> g_AttributeInterpolatorChoiceWidgetFactory( "interpolatorchoice" ); + + +//----------------------------------------------------------------------------- +// Name-based widget factories +//----------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- +// g_AttributeWidgetFactories +// Purpose: a mapping of all attribute types to AttributeWidgetFactories + +struct DefaultAttributeFactoryEntry_t +{ + int attributeType; + IAttributeWidgetFactory *factory; +}; + +static DefaultAttributeFactoryEntry_t g_AttributeWidgetFactories[] = +{ + + { AT_UNKNOWN, NULL }, + + { AT_ELEMENT, &g_AttributeElementWidgetFactory }, + { AT_INT, &g_AttributeTextWidgetFactory }, + { AT_FLOAT, &g_AttributeTextWidgetFactory }, + { AT_BOOL, &g_AttributeTextWidgetFactory }, + { AT_STRING, &g_AttributeTextWidgetFactory }, + { AT_VOID, &g_AttributeTextWidgetFactory }, + { AT_OBJECTID, &g_AttributeTextWidgetFactory }, + { AT_COLOR, &g_AttributeColorPickerWidgetFactory }, + { AT_VECTOR2, &g_AttributeTextWidgetFactory }, + { AT_VECTOR3, &g_AttributeTextWidgetFactory }, + { AT_VECTOR4, &g_AttributeTextWidgetFactory }, + { AT_QANGLE, &g_AttributeTextWidgetFactory }, + { AT_QUATERNION, &g_AttributeTextWidgetFactory }, + { AT_VMATRIX, &g_AttributeTextWidgetFactory }, + + { AT_ELEMENT_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_INT_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_FLOAT_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_BOOL_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_STRING_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_VOID_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_ELEMENT_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_OBJECTID_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_COLOR_ARRAY, &g_AttributeColorPickerWidgetFactory }, + { AT_VECTOR2_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_VECTOR3_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_VECTOR4_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_QANGLE_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_QUATERNION_ARRAY, &g_AttributeTextWidgetFactory }, + { AT_VMATRIX_ARRAY, &g_AttributeTextWidgetFactory }, + +}; + + +//----------------------------------------------------------------------------- +// +// CAttributeWidgetFactoryList +// +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// Adds a widget to the factory +//----------------------------------------------------------------------------- +void CAttributeWidgetFactoryList::AddWidgetFactory( IAttributeWidgetFactory *pFactory, const char *pWidgetName ) +{ + m_Factories.Insert( pWidgetName, pFactory ); +} + + +//----------------------------------------------------------------------------- +// Finds a widget factory by name +//----------------------------------------------------------------------------- +IAttributeWidgetFactory *CAttributeWidgetFactoryList::FindWidgetFactory( const char *pWidgetName ) +{ + unsigned short i = m_Factories.Find( pWidgetName ); + if ( i != m_Factories.InvalidIndex() ) + return m_Factories[i]; + return NULL; +} + + +//----------------------------------------------------------------------------- +// Returns a factory requested by name +//----------------------------------------------------------------------------- +IAttributeWidgetFactory *CAttributeWidgetFactoryList::GetWidgetFactory( const char *pWidgetName ) +{ + return FindWidgetFactory( pWidgetName ); +} + + +//----------------------------------------------------------------------------- +// Returns a factory used to create widget for the attribute passed in +//----------------------------------------------------------------------------- +IAttributeWidgetFactory *CAttributeWidgetFactoryList::GetWidgetFactory( CDmElement *object, + CDmAttribute *pAttribute, CDmeEditorTypeDictionary *pTypeDictionary ) +{ + if ( !object ) + return NULL; + + DmAttributeType_t attributeType = pAttribute->GetType(); + IAttributeWidgetFactory *pFactory = g_AttributeWidgetFactories[ attributeType ].factory; + + // Override behavior with editor info, if it exists + if ( pTypeDictionary ) + { + const char *pAttributeName = pAttribute->GetName(); + CDmeEditorAttributeInfo *pEditorInfo = pTypeDictionary->GetAttributeInfo( object, pAttributeName ); + if ( pEditorInfo ) + { + if ( !pEditorInfo->m_bIsVisible ) + return NULL; + + if ( pEditorInfo->GetWidgetName() ) + { + IAttributeWidgetFactory *pOverriddenFactory = g_pWidgetFactoryFactoryList->FindWidgetFactory( pEditorInfo->GetWidgetName() ); + if ( pOverriddenFactory ) + { + pFactory = pOverriddenFactory; + } + } + } + } + return pFactory; +} + + +//----------------------------------------------------------------------------- +// Returns a factory used to create widgets for entries in an attribute array +//----------------------------------------------------------------------------- +IAttributeWidgetFactory *CAttributeWidgetFactoryList::GetArrayWidgetFactory( CDmElement *object, + CDmAttribute *pAttribute, CDmeEditorTypeDictionary *pTypeDictionary ) +{ + if ( !object ) + return NULL; + + DmAttributeType_t attributeType = ArrayTypeToValueType( pAttribute->GetType() ); + IAttributeWidgetFactory *pFactory = g_AttributeWidgetFactories[ attributeType ].factory; + + // Override behavior with editor info, if it exists + if ( pTypeDictionary ) + { + CDmeEditorAttributeInfo *pEditorInfo = pTypeDictionary->GetAttributeArrayInfo( object, pAttribute->GetName() ); + if ( pEditorInfo ) + { + if ( !pEditorInfo->m_bIsVisible ) + return NULL; + + if ( pEditorInfo->GetWidgetName() ) + { + IAttributeWidgetFactory *pOverriddenFactory = g_pWidgetFactoryFactoryList->FindWidgetFactory( pEditorInfo->GetWidgetName() ); + if ( pOverriddenFactory ) + { + pFactory = pOverriddenFactory; + } + } + } + } + + return pFactory; +} + + +//----------------------------------------------------------------------------- +// Applies changes to a widget +//----------------------------------------------------------------------------- +void CAttributeWidgetFactoryList::ApplyChanges( vgui::Panel *pWidget, vgui::Panel *pSender ) +{ + CBaseAttributePanel *pPanel = dynamic_cast< CBaseAttributePanel *>( pWidget ); + if ( pPanel && pPanel->GetDirty() ) + { + Assert( !pPanel->IsAutoApply() ); + vgui::ipanel()->SendMessage( pWidget->GetVPanel(), new KeyValues( "ApplyChanges" ), pSender ? pSender->GetVPanel() : NULL ); + } +} + + +//----------------------------------------------------------------------------- +// Refreshes a widget when attributes change +//----------------------------------------------------------------------------- +void CAttributeWidgetFactoryList::Refresh( vgui::Panel *pWidget, vgui::Panel *pSender ) +{ + if ( pWidget ) + { + vgui::ipanel()->SendMessage( pWidget->GetVPanel(), new KeyValues( "Refresh" ), pSender ? pWidget->GetVPanel() : NULL ); + } +} + |