mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-13 20:21:06 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user