diff options
Diffstat (limited to 'vgui2/dme_controls/BaseAttributePanel.cpp')
| -rw-r--r-- | vgui2/dme_controls/BaseAttributePanel.cpp | 365 |
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 ); + } + } +} |