summaryrefslogtreecommitdiff
path: root/public/dme_controls/dmecontrols_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/dme_controls/dmecontrols_utils.h')
-rw-r--r--public/dme_controls/dmecontrols_utils.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/public/dme_controls/dmecontrols_utils.h b/public/dme_controls/dmecontrols_utils.h
new file mode 100644
index 0000000..5e3c175
--- /dev/null
+++ b/public/dme_controls/dmecontrols_utils.h
@@ -0,0 +1,138 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+
+#ifndef DMECONTROLS_UTILS_H
+#define DMECONTROLS_UTILS_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tier1/KeyValues.h"
+#include "datamodel/dmelement.h"
+#include "datamodel/dmattribute.h"
+#include "datamodel/dmattributevar.h"
+#include "movieobjects/timeutils.h"
+
+//-----------------------------------------------------------------------------
+// Helper method to insert + extract DmElement handles into keyvalues
+//-----------------------------------------------------------------------------
+inline void SetElementKeyValue( KeyValues *pKeyValues, const char *pName, CDmElement *pElement )
+{
+ pKeyValues->SetInt( pName, pElement ? pElement->GetHandle() : DMELEMENT_HANDLE_INVALID );
+}
+
+template< class T >
+T* GetElementKeyValue( KeyValues *pKeyValues, const char *pName )
+{
+ DmElementHandle_t h = (DmElementHandle_t)pKeyValues->GetInt( pName, DMELEMENT_HANDLE_INVALID );
+ return GetElement<T>( h );
+}
+
+inline KeyValues *CreateElementKeyValues( const char *pName, const char *pKey, CDmElement *pElement )
+{
+ return new KeyValues( pName, pKey, pElement ? ( int )pElement->GetHandle() : DMELEMENT_HANDLE_INVALID );
+}
+
+inline void AddStandardElementKeys( KeyValues *pKeyValues, CDmElement *pElement )
+{
+ SetElementKeyValue( pKeyValues, "dmeelement", pElement );
+
+ if ( pElement )
+ {
+ char buf[ 256 ];
+ UniqueIdToString( pElement->GetId(), buf, sizeof( buf ) );
+ pKeyValues->SetString( "text", buf );
+ pKeyValues->SetString( "type", pElement->GetTypeString() );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Helper method to insert + extract DmeTime_t into keyvalues
+//-----------------------------------------------------------------------------
+inline void SetDmeTimeKeyValue( KeyValues *pKeyValues, const char *pName, DmeTime_t t )
+{
+ pKeyValues->SetInt( pName, t.GetTenthsOfMS() );
+}
+
+inline DmeTime_t GetDmeTimeKeyValue( KeyValues *pKeyValues, const char *pName, DmeTime_t defaultTime = DMETIME_ZERO )
+{
+ return DmeTime_t( pKeyValues->GetInt( pName, defaultTime.GetTenthsOfMS() ) );
+}
+
+
+inline bool ElementTree_IsArrayItem( KeyValues *itemData )
+{
+ return !itemData->IsEmpty( "arrayIndex" );
+}
+
+inline CDmAttribute *ElementTree_GetAttribute( KeyValues *itemData )
+{
+ CDmElement *pOwner = GetElementKeyValue< CDmElement >( itemData, "ownerelement" );
+ if ( !pOwner )
+ return NULL;
+
+ const char *pAttributeName = itemData->GetString( "attributeName", "" );
+ return pOwner->GetAttribute( pAttributeName );
+}
+
+inline DmAttributeType_t ElementTree_GetAttributeType( KeyValues *itemData )
+{
+ CDmElement *pOwner = GetElementKeyValue< CDmElement >( itemData, "ownerelement" );
+ if ( !pOwner )
+ return AT_UNKNOWN;
+
+ const char *pAttributeName = itemData->GetString( "attributeName", "" );
+ CDmAttribute *pAttribute = pOwner->GetAttribute( pAttributeName );
+ if ( !pAttribute )
+ return AT_UNKNOWN;
+
+ return pAttribute->GetType();
+}
+
+
+
+inline bool ElementTree_GetDroppableItems( CUtlVector< KeyValues * >& msglist, const char *elementType, CUtlVector< CDmElement * >& list )
+{
+ int c = msglist.Count();
+ for ( int i = 0; i < c; ++i )
+ {
+ KeyValues *data = msglist[ i ];
+
+ CDmElement *e = GetElementKeyValue<CDmElement>( data, "dmeelement" );
+ if ( !e )
+ {
+ continue;
+ }
+
+ //if ( !e->IsA( elementType ) )
+ //{
+ // continue;
+ //}
+
+ list.AddToTail( e );
+ }
+
+ return list.Count() != 0;
+}
+
+inline void ElementTree_RemoveListFromArray( CDmAttribute *pArrayAttribute, CUtlVector< CDmElement * >& list )
+{
+ CDmrElementArray<> array( pArrayAttribute );
+ int c = array.Count();
+ for ( int i = c - 1 ; i >= 0 ; --i )
+ {
+ CDmElement *element = array[ i ];
+ if ( list.Find( element ) != list.InvalidIndex() )
+ {
+ array.Remove( i );
+ }
+ }
+}
+
+#endif // DMECONTROLS_UTILS_H