summaryrefslogtreecommitdiff
path: root/vgui2/dme_controls/BaseAttributePanel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vgui2/dme_controls/BaseAttributePanel.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'vgui2/dme_controls/BaseAttributePanel.cpp')
-rw-r--r--vgui2/dme_controls/BaseAttributePanel.cpp365
1 files changed, 365 insertions, 0 deletions
diff --git a/vgui2/dme_controls/BaseAttributePanel.cpp b/vgui2/dme_controls/BaseAttributePanel.cpp
new file mode 100644
index 0000000..85f6b72
--- /dev/null
+++ b/vgui2/dme_controls/BaseAttributePanel.cpp
@@ -0,0 +1,365 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: base class for all element attribute panels
+// An attribute panel is a one line widget that can be used by a list
+// or tree control.
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+
+#include "dme_controls/BaseAttributePanel.h"
+#include "dme_controls/attributewidgetfactory.h"
+#include "tier1/KeyValues.h"
+#include "vgui_controls/Label.h"
+#include "movieobjects/dmeeditortypedictionary.h"
+#include "dme_controls/inotifyui.h"
+
+using namespace vgui;
+
+
+//-----------------------------------------------------------------------------
+// Lessfunc for columns.
+//-----------------------------------------------------------------------------
+bool CBaseAttributePanel::ColInfoLessFunc( const CBaseAttributePanel::colinfo_t& lhs, const CBaseAttributePanel::colinfo_t& rhs )
+{
+ return lhs.panel < rhs.panel;
+}
+
+
+//-----------------------------------------------------------------------------
+// CBaseAttributePanel constructor
+//-----------------------------------------------------------------------------
+CBaseAttributePanel::CBaseAttributePanel( vgui::Panel *parent, const AttributeWidgetInfo_t &info ) :
+ BaseClass( parent, info.m_pAttributeName ),
+ m_pType( 0 ),
+ m_hObject( info.m_pElement ),
+ m_hEditorInfo( info.m_pEditorInfo ),
+ m_hEditorTypeDict( info.m_pEditorTypeDictionary ),
+ m_pNotify( info.m_pNotify ),
+ m_nArrayIndex( info.m_nArrayIndex ),
+ m_ColumnSize( 0, 0, ColInfoLessFunc )
+{
+ Assert( info.m_pElement );
+
+ InitializeFlags( info );
+
+ Assert( info.m_pAttributeName );
+ Q_strncpy( m_szAttributeName, info.m_pAttributeName, sizeof( m_szAttributeName ) );
+
+ m_pType = new Label( this, "AttributeType", "" );
+ SetColumnSize( m_pType, 100 );
+
+ CDmAttribute *pAttribute = info.m_pElement->GetAttribute( info.m_pAttributeName );
+ m_AttributeType = pAttribute ? pAttribute->GetType() : AT_UNKNOWN;
+ if ( m_nArrayIndex >= 0 )
+ {
+ m_AttributeType = ArrayTypeToValueType( m_AttributeType );
+ }
+
+ m_pType->SetText( g_pDataModel->GetAttributeNameForType( m_AttributeType ) );
+
+ m_hFont = NULL;
+
+ // These are draggable
+ SetDragEnabled( true );
+}
+
+
+//-----------------------------------------------------------------------------
+// This only exists so every class always can chain PostConstructors
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::PostConstructor()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Initializes flags from the attribute editor info
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::InitializeFlags( const AttributeWidgetInfo_t &info )
+{
+ m_nFlags = 0;
+ if ( info.m_pEditorInfo )
+ {
+ if ( info.m_pEditorInfo->m_bHideType )
+ {
+ m_nFlags |= HIDETYPE;
+ }
+ if ( info.m_pEditorInfo->m_bHideValue )
+ {
+ m_nFlags |= HIDEVALUE;
+ }
+ if ( info.m_pEditorInfo->m_bIsReadOnly )
+ {
+ m_nFlags |= READONLY;
+ }
+ }
+
+ CDmAttribute *pAttribute = info.m_pElement->GetAttribute( info.m_pAttributeName );
+ if ( pAttribute && pAttribute->IsFlagSet( FATTRIB_READONLY ) )
+ {
+ m_nFlags |= READONLY;
+ }
+
+ if ( info.m_bAutoApply )
+ {
+ m_nFlags |= AUTOAPPLY;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Returns the editor info
+//-----------------------------------------------------------------------------
+CDmeEditorTypeDictionary *CBaseAttributePanel::GetEditorTypeDictionary()
+{
+ return m_hEditorTypeDict;
+}
+
+CDmeEditorAttributeInfo *CBaseAttributePanel::GetEditorInfo()
+{
+ return m_hEditorInfo;
+}
+
+
+//-----------------------------------------------------------------------------
+// Does the element have the attribute we're attempting to reference?
+//-----------------------------------------------------------------------------
+bool CBaseAttributePanel::HasAttribute() const
+{
+ return GetPanelElement()->HasAttribute( m_szAttributeName );
+}
+
+
+//-----------------------------------------------------------------------------
+// Returns the attribute array count
+//-----------------------------------------------------------------------------
+int CBaseAttributePanel::GetAttributeArrayCount() const
+{
+ CDmrGenericArrayConst array( GetPanelElement(), m_szAttributeName );
+ return array.IsValid() ? array.Count() : -1;
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets the font
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::SetFont( HFont font )
+{
+ m_hFont = font;
+ m_pType->SetFont(font);
+}
+
+//-----------------------------------------------------------------------------
+// Applies scheme settings
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ // set the color of the "type" column
+ m_pType->SetFgColor( Color ( 160, 160, 160, 255 ) );
+
+ if ( GetDirty() )
+ {
+ SetBgColor( pScheme->GetColor( "AttributeWidget.DirtyBgColor", Color( 100, 100, 200, 63 ) ) );
+ }
+ else
+ {
+ SetBgColor( pScheme->GetColor( "Panel.BgColor", Color( 0, 0, 0, 0 ) ) );
+ }
+ HFont font = pScheme->GetFont( "DmePropertyVerySmall", IsProportional() );
+ // m_pType->SetFont(font);
+
+ if ( !m_hFont )
+ {
+ m_hFont = font;
+ }
+ SetFont( m_hFont );
+
+}
+
+//-----------------------------------------------------------------------------
+// Returns the panel element
+//-----------------------------------------------------------------------------
+CDmElement *CBaseAttributePanel::GetPanelElement()
+{
+ return m_hObject;
+}
+
+const CDmElement *CBaseAttributePanel::GetPanelElement() const
+{
+ return m_hObject;
+}
+
+
+//-----------------------------------------------------------------------------
+// Gets/Sets the attribute value from a string
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::SetAttributeValueFromString( const char *pString )
+{
+ if ( m_nArrayIndex < 0 )
+ {
+ GetPanelElement()->SetValueFromString( m_szAttributeName, pString );
+ }
+ else
+ {
+ CDmrGenericArray array( GetPanelElement(), m_szAttributeName );
+ array.SetFromString( m_nArrayIndex, pString );
+ }
+}
+
+const char *CBaseAttributePanel::GetAttributeValueAsString( char *pBuf, int nLength )
+{
+ if ( m_nArrayIndex < 0 )
+ {
+ GetPanelElement()->GetValueAsString( m_szAttributeName, pBuf, nLength );
+ }
+ else
+ {
+ CDmrGenericArray array( GetPanelElement(), m_szAttributeName );
+ array.GetAsString( m_nArrayIndex, pBuf, nLength );
+ }
+ return pBuf;
+}
+
+
+//-----------------------------------------------------------------------------
+// Helper to get/set the attribute value for elements
+//-----------------------------------------------------------------------------
+CDmElement *CBaseAttributePanel::GetAttributeValueElement()
+{
+ return GetElement< CDmElement >( GetAttributeValue<DmElementHandle_t>( ) );
+}
+
+void CBaseAttributePanel::SetAttributeValueElement( CDmElement *pElement )
+{
+ return SetAttributeValue( pElement->GetHandle() );
+}
+
+
+void CBaseAttributePanel::SetDirty( bool dirty )
+{
+ SetFlag( DIRTY, dirty );
+ InvalidateLayout( false, true );
+}
+
+void CBaseAttributePanel::SetColumnSize( Panel *panel, int width )
+{
+ colinfo_t search;
+ search.panel = panel;
+ int idx = m_ColumnSize.Find( search );
+ if ( idx == m_ColumnSize.InvalidIndex() )
+ {
+ idx = m_ColumnSize.Insert( search );
+ }
+ m_ColumnSize[ idx ].width = width;
+}
+
+int CBaseAttributePanel::GetSizeForColumn( Panel *panel )
+{
+ colinfo_t search;
+ search.panel = panel;
+ int idx = m_ColumnSize.Find( search );
+ if ( idx == m_ColumnSize.InvalidIndex() )
+ {
+ return 100;
+ }
+ return m_ColumnSize[ idx ].width;
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a widget using editor attribute info
+//-----------------------------------------------------------------------------
+void CBaseAttributePanel::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ CUtlVector< Panel * > vispanels;
+
+ if ( HasFlag( HIDETYPE ) )
+ {
+ m_pType->SetVisible( false );
+ }
+ else
+ {
+ vispanels.AddToTail( m_pType );
+ }
+
+ vgui::Panel *dataPanel = GetDataPanel();
+ if ( dataPanel )
+ {
+ if ( HasFlag( HIDEVALUE ) )
+ {
+ dataPanel->SetVisible( false );
+ }
+ else
+ {
+ vispanels.AddToTail( dataPanel );
+ }
+ }
+
+ int c = vispanels.Count();
+
+ Assert( c >= 0 );
+ if ( c == 0 )
+ {
+ return;
+ }
+
+ int w, h;
+ GetSize( w, h );
+
+ int x = 1;
+ int y = 0;
+ w-= 2;
+
+ for ( int i = 0; i < c; ++i )
+ {
+ Panel *panel = vispanels[ i ];
+ int width = GetSizeForColumn( panel );
+ if ( i == c - 1 )
+ {
+ width = w - x;
+ }
+
+ panel->SetBounds( x, y, width, h );
+ x += width;
+ }
+}
+
+void CBaseAttributePanel::OnApplyChanges()
+{
+ Assert( !IsAutoApply() );
+
+ Apply();
+ SetDirty(false);
+}
+
+void CBaseAttributePanel::OnRefresh()
+{
+ Refresh();
+}
+
+void CBaseAttributePanel::OnCreateDragData( KeyValues *msg )
+{
+ if ( GetPanelElement() )
+ {
+ msg->SetInt( "root", GetPanelElement() ? GetPanelElement()->GetHandle() : DMELEMENT_HANDLE_INVALID );
+ msg->SetString( "type", g_pDataModel->GetAttributeNameForType( m_AttributeType ) );
+ msg->SetString( "attributename", m_szAttributeName );
+ if ( m_nArrayIndex >= 0 )
+ {
+ msg->SetInt( "arrayIndex", m_nArrayIndex );
+ }
+
+ if ( m_AttributeType != AT_ELEMENT && m_AttributeType != AT_ELEMENT_ARRAY )
+ {
+ char pTemp[512];
+ GetAttributeValueAsString( pTemp, sizeof( pTemp ) );
+ msg->SetString( "text", pTemp );
+ }
+ }
+}