You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
6.8 KiB
179 lines
6.8 KiB
1 year ago
|
//============ Copyright (c) Valve Corporation, All rights reserved. ============
|
||
|
//
|
||
|
// Base class for panels used to edit nodes in layout system definitions.
|
||
|
//
|
||
|
//===============================================================================
|
||
|
|
||
|
#ifndef NODE_PANEL_H
|
||
|
#define NODE_PANEL_H
|
||
|
|
||
|
#if defined( COMPILER_MSVC )
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "vgui_controls/EditablePanel.h"
|
||
|
#include "utlvector.h"
|
||
|
|
||
|
class CLayoutSystemKVEditor;
|
||
|
class KeyValues;
|
||
|
|
||
|
namespace vgui
|
||
|
{
|
||
|
class Panel;
|
||
|
class CBoxSizer;
|
||
|
class Label;
|
||
|
class Button;
|
||
|
class IScheme;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Base class for all VGUI panels used by the Layout System Editor.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CNodePanel : public vgui::EditablePanel
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CNodePanel, vgui::EditablePanel );
|
||
|
|
||
|
public:
|
||
|
CNodePanel( Panel *pParent, const char *pName );
|
||
|
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||
|
virtual void OnCommand( const char *pCommand );
|
||
|
|
||
|
MESSAGE_FUNC_PARAMS( OnAddRule, "AddRule", pKV );
|
||
|
MESSAGE_FUNC_PARAMS( OnAddState, "AddState", pKV );
|
||
|
|
||
|
MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Sets the data bound to this panel and recursively [re-]creates all
|
||
|
// sub-controls & panels.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void SetData( KeyValues *pNodeKV );
|
||
|
KeyValues *GetData() { return m_pNodeKV; }
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Recursively [re-]builds all panels & controls.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void RecreateControls();
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Refreshes the state of this panel's controls and all child panel's
|
||
|
// without deleting/recreating controls.
|
||
|
// NOTE: Derived classes should call BaseClass::UpdateState();
|
||
|
//-----------------------------------------------------------------------------
|
||
|
virtual void UpdateState();
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Stores/gets a pointer to the owning KV editor panel.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void SetEditor( CLayoutSystemKVEditor *pEditor ) { m_pEditor = pEditor; }
|
||
|
CLayoutSystemKVEditor *GetEditor() { return m_pEditor; }
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Invalidates the layout of the parent editor control, which recursively
|
||
|
// forces a re-layout of all child panels.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void InvalidateEditorLayout();
|
||
|
|
||
|
void EnableDeleteButton( bool bEnabled ) { m_bShowDeleteButton = bEnabled; UpdateState(); }
|
||
|
void EnableNameEditBox( bool bEnabled ) { m_bShowNameEditBox = bEnabled; UpdateState(); }
|
||
|
|
||
|
protected:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Overridden in derived classes to create UI controls & all child panels
|
||
|
// based on the key values data bound to the panel.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
virtual void CreatePanelContents() = 0;
|
||
|
|
||
|
void ClearHeading();
|
||
|
void AddHeadingElement( vgui::Panel *pPanel, float flExpandFactor = 1.0f, int nPadding = 0 );
|
||
|
void AddHeadingSpacer();
|
||
|
void SetChildIndent( int nIndent );
|
||
|
|
||
|
void ClearChildren();
|
||
|
void AddChild( CNodePanel *pPanel, int nPadding = 0 );
|
||
|
void AddChild( vgui::Panel *pPanel, int nPadding = 0 );
|
||
|
CNodePanel *CreateChild( KeyValues *pKey );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Inserts a child key values at the specified index and re-creates all
|
||
|
// sub-controls & panels.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void InsertChildData( int nIndex, KeyValues *pKeyValues );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Detaches this node's data from the parent tree and re-builds the parent
|
||
|
// tree so that this panel will be deleted.
|
||
|
// NOTE: do not access 'this' after calling this function
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void DeleteSelf();
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Adds a panel which allows for the creation of new sub-nodes.
|
||
|
// 'nIndex' is the sub-index where an element created from this panel should
|
||
|
// be inserted.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void AddNewElementPanel( int nIndex, bool bAllowRules, bool bAllowStates );
|
||
|
|
||
|
virtual void SetNodeName( const char *pNodeName );
|
||
|
|
||
|
static const int m_nNameLength = 100;
|
||
|
|
||
|
// Text to display in the label. If m_NodeName is set to the empty string (""), the label will not be drawn.
|
||
|
char m_NodeLabel[m_nNameLength];
|
||
|
// Text to display in the editable text entry. The text entry is only displayed if m_bShowNameEditBox is true.
|
||
|
char m_NodeName[m_nNameLength];
|
||
|
|
||
|
private:
|
||
|
// Data may be modified by this class, but
|
||
|
// parent is responsible for deletion.
|
||
|
KeyValues *m_pNodeKV;
|
||
|
|
||
|
// The owning editor object
|
||
|
CLayoutSystemKVEditor *m_pEditor;
|
||
|
|
||
|
// Do not need to delete any of these sizers; they are automatically cleaned up.
|
||
|
vgui::CBoxSizer *m_pRootSizer;
|
||
|
vgui::CBoxSizer *m_pLabelSizer;
|
||
|
// Derived classes can add stuff to the header (appearing after the label)
|
||
|
vgui::CBoxSizer *m_pHeadingSizer;
|
||
|
// A horizontal sizer whose sole purpose is to indent child objects
|
||
|
vgui::CBoxSizer *m_pChildIndentSizer;
|
||
|
// Derived class can add stuff below the header here
|
||
|
vgui::CBoxSizer *m_pChildSizer;
|
||
|
|
||
|
// Label for the node.
|
||
|
vgui::Label *m_pLabel;
|
||
|
// Optional editable box, just to the right of the node's label.
|
||
|
vgui::TextEntry *m_pNameEditBox;
|
||
|
bool m_bShowNameEditBox;
|
||
|
|
||
|
// Some nodes can be deleted from their parent container.
|
||
|
// This feature can turned on/off by a call to EnableDeleteButton().
|
||
|
// By default, this is not enabled.
|
||
|
bool m_bShowDeleteButton;
|
||
|
vgui::Button *m_pDeleteSelfButton;
|
||
|
|
||
|
// Used to track child node panels, does not own memory (panels are automatically cleaned up by sizers)
|
||
|
CUtlVector< CNodePanel * > m_ChildPanels;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// A panel with a set of "Add X" buttons where X is a state, rule, etc.
|
||
|
// Must be parented to a CNodePanel.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CNewElementPanel : public vgui::EditablePanel
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CNewElementPanel, vgui::EditablePanel );
|
||
|
|
||
|
public:
|
||
|
CNewElementPanel( Panel *pParent, const char *pName, int nIndex );
|
||
|
|
||
|
void AddButton( const char *pButtonText, const char *pActionName );
|
||
|
|
||
|
private:
|
||
|
int m_nIndex;
|
||
|
vgui::CBoxSizer *m_pHorizontalSizer;
|
||
|
};
|
||
|
|
||
|
#endif // NODE_PANEL_H
|