diff options
Diffstat (limited to 'public/dme_controls/BaseAttributePanel.h')
| -rw-r--r-- | public/dme_controls/BaseAttributePanel.h | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/public/dme_controls/BaseAttributePanel.h b/public/dme_controls/BaseAttributePanel.h new file mode 100644 index 0000000..624ce2a --- /dev/null +++ b/public/dme_controls/BaseAttributePanel.h @@ -0,0 +1,275 @@ +//========= 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: $ +// +//=============================================================================// + +#ifndef BASEATTRIBUTEPANEL_H +#define BASEATTRIBUTEPANEL_H +#ifdef _WIN32 +#pragma once +#endif + +#include "datamodel/dmattribute.h" +#include "vgui_controls/Panel.h" +#include "datamodel/dmehandle.h" + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class CDmElement; +class IDmNotify; +class IElementPropertiesChoices; +struct AttributeWidgetInfo_t; +class CDmeEditorAttributeInfo; +class CDmeEditorTypeDictionary; + +namespace vgui +{ + class Label; +} + +using namespace vgui; + + +//----------------------------------------------------------------------------- +// CBaseAttributePanel +//----------------------------------------------------------------------------- +class CBaseAttributePanel : public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CBaseAttributePanel, vgui::Panel ); + +public: + CBaseAttributePanel( vgui::Panel *pParent, const AttributeWidgetInfo_t &info ); + + virtual void PostConstructor(); + virtual void PerformLayout(); + virtual void SetFont( HFont font ); + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void OnCreateDragData( KeyValues *msg ); + + void SetDirty( bool dirty ); + bool GetDirty() const; + bool IsAutoApply() const; + + // Sets/gets the attribute value + template< class T > + void SetAttributeValue( const T& value ); + void SetAttributeValue( const char *pValue ); + + template< class T > + const T& GetAttributeValue( ); + + // Helper to get/set the attribute value for elements + CDmElement *GetAttributeValueElement(); + void SetAttributeValueElement( CDmElement *pElement ); + + void SetAttributeValueFromString( const char *pString ); + const char *GetAttributeValueAsString( char *pBuf, int nLength ); + + // Returns the attribute type to edit + DmAttributeType_t GetAttributeType() const; + + // Returns the editor info + CDmeEditorTypeDictionary *GetEditorTypeDictionary(); + CDmeEditorAttributeInfo *GetEditorInfo(); + + // Call this when the data changed + IDmNotify *GetNotify(); + +protected: + enum + { + HIDETYPE = 0x01, + HIDEVALUE = 0x02, + READONLY = 0x04, + DIRTY = 0x08, + AUTOAPPLY = 0x10, + }; + + // Inherited classes must implement this + virtual Panel *GetDataPanel() = 0; + virtual void Apply() = 0; + virtual void Refresh() = 0; + + // Methods to get/set column size + int GetSizeForColumn( Panel *panel ); + void SetColumnSize( Panel *panel, int width ); + + // Returns the element being edited by the panel + CDmElement *GetPanelElement(); + const CDmElement *GetPanelElement() const; + + // Returns the attribute name + const char* GetAttributeName() const; + + // Does the element have the attribute we're attempting to reference? + bool HasAttribute() const; + + // Returns the attribute array count + int GetAttributeArrayCount() const; + + // Are we editing an entry in an attribute array? + bool IsArrayEntry() const; + + // Is a particular flag set? + bool HasFlag( int flagMask ) const; + +private: + struct colinfo_t + { + Panel *panel; + int width; + }; + + // Set a flag + void SetFlag( int flagMask, bool bOn ); + + // Used to sort the column list + static bool ColInfoLessFunc( const colinfo_t& lhs, const colinfo_t& rhs ); + + // Initializes flags from the attribute editor info + void InitializeFlags( const AttributeWidgetInfo_t &info ); + + // Called when the OK / Apply button is pressed. Changed data should be written into document. + MESSAGE_FUNC( OnApplyChanges, "ApplyChanges" ); + MESSAGE_FUNC( OnRefresh, "Refresh" ); + +protected: + Label *m_pType; + +private: + CDmeHandle< CDmElement > m_hObject; + CDmeHandle< CDmeEditorAttributeInfo > m_hEditorInfo; + CDmeHandle< CDmeEditorTypeDictionary > m_hEditorTypeDict; + + char m_szAttributeName[ 256 ]; + int m_nArrayIndex; + DmAttributeType_t m_AttributeType; + IDmNotify *m_pNotify; + int m_nFlags; + CUtlRBTree< colinfo_t, int > m_ColumnSize; + HFont m_hFont; +}; + + +//----------------------------------------------------------------------------- +// Inline methods +//----------------------------------------------------------------------------- +inline bool CBaseAttributePanel::HasFlag( int flagMask ) const +{ + return ( m_nFlags & flagMask ) ? true : false; +} + +inline void CBaseAttributePanel::SetFlag( int flagMask, bool bOn ) +{ + if ( bOn ) + { + m_nFlags |= flagMask; + } + else + { + m_nFlags &= ~flagMask; + } +} + +inline bool CBaseAttributePanel::GetDirty() const +{ + return HasFlag( DIRTY ); +} + +inline bool CBaseAttributePanel::IsAutoApply() const +{ + return HasFlag( AUTOAPPLY ); +} + +inline DmAttributeType_t CBaseAttributePanel::GetAttributeType() const +{ + return m_AttributeType; +} + +inline IDmNotify *CBaseAttributePanel::GetNotify() +{ + return m_pNotify; +} + +inline const char* CBaseAttributePanel::GetAttributeName() const +{ + return m_szAttributeName; +} + +inline bool CBaseAttributePanel::IsArrayEntry() const +{ + return ( m_nArrayIndex >= 0 ); +} + + +template< class T > inline const T& GetArrayAttributeValue( CDmElement *pElement, const char *pAttribute, int nArrayIndex ) +{ + const CDmrArray<T> array( pElement, pAttribute ); + return array[ nArrayIndex ]; +} + +template<> inline const DmElementHandle_t& GetArrayAttributeValue<DmElementHandle_t>( CDmElement *pElement, const char *pAttribute, int nArrayIndex ) +{ + const CDmrElementArray<> array( pElement, pAttribute ); + return array.GetHandle( nArrayIndex ); +} + + +template< class T > inline void SetArrayAttributeValue( CDmElement *pElement, const char *pAttribute, int nArrayIndex, const T& value ) +{ + CDmrArray<T> array( pElement, pAttribute ); + array.Set( nArrayIndex, value ); +} + +template<> inline void SetArrayAttributeValue<DmElementHandle_t>( CDmElement *pElement, const char *pAttribute, int nArrayIndex, const DmElementHandle_t& value ) +{ + CDmrElementArray<> array( pElement, pAttribute ); + array.SetHandle( nArrayIndex, value ); +} + + +//----------------------------------------------------------------------------- +// Sets/gets the attribute value +//----------------------------------------------------------------------------- +template< class T > +void CBaseAttributePanel::SetAttributeValue( const T& value ) +{ + if ( !IsArrayEntry() ) + { + GetPanelElement()->SetValue( m_szAttributeName, value ); + } + else + { + SetArrayAttributeValue<T>( GetPanelElement(), m_szAttributeName, m_nArrayIndex, value ); + } +} + +inline void CBaseAttributePanel::SetAttributeValue( const char *pValue ) +{ + if ( !IsArrayEntry() ) + { + GetPanelElement()->SetValue( m_szAttributeName, pValue ); + } + else + { + SetArrayAttributeValue<CUtlString>( GetPanelElement(), m_szAttributeName, m_nArrayIndex, pValue ); + } +} + +template< class T > +const T& CBaseAttributePanel::GetAttributeValue( ) +{ + if ( !IsArrayEntry() ) + return GetPanelElement()->GetValue<T>( m_szAttributeName ); + return GetArrayAttributeValue<T>( GetPanelElement(), m_szAttributeName, m_nArrayIndex ); +} + + +#endif // BASEATTRIBUTEPANEL_H |