summaryrefslogtreecommitdiff
path: root/public/dme_controls/BaseAttributePanel.h
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 /public/dme_controls/BaseAttributePanel.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'public/dme_controls/BaseAttributePanel.h')
-rw-r--r--public/dme_controls/BaseAttributePanel.h275
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