Team Fortress 2 Source Code as on 22/4/2020
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.
 
 
 
 
 
 

370 lines
14 KiB

//========= 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 );
}
}