source-engine/utils/itemtest_controls/dualpanellist.h

145 lines
3.6 KiB
C
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=============================================================================
#ifndef DUAL_PANEL_LIST_H
#define DUAL_PANEL_LIST_H
#if defined( _WIN32 )
#pragma once
#endif
#include <utllinkedlist.h>
#include <utlvector.h>
#include <vgui/VGUI.h>
#include <vgui_controls/Panel.h>
class KeyValues;
//-----------------------------------------------------------------------------
// Purpose: A list of variable height child panels
// each list item consists of a label-panel pair. Height of the item is
// determined from the lable.
//-----------------------------------------------------------------------------
class CDualPanelList : public vgui::Panel
{
DECLARE_CLASS_SIMPLE( CDualPanelList, vgui::Panel );
public:
CDualPanelList( vgui::Panel *parent, char const *panelName );
~CDualPanelList();
// DATA & ROW HANDLING
// The list now owns the panel
virtual int AddItem( vgui::Panel *labelPanel, vgui::Panel *panel );
int GetItemCount() const;
int GetItemIDFromRow( int nRow ) const;
// Iteration. Use these until they return InvalidItemID to iterate all the items.
int FirstItem() const;
int NextItem( int nItemID ) const;
int InvalidItemID() const;
virtual Panel *GetItemLabel( int itemID );
virtual Panel *GetItemPanel( int itemID );
virtual bool IsItemVisible( int nItemID ) const;
virtual void SetItemVisible( int nItemID, bool bVisible );
// vgui::ScrollBar *GetScrollbar() { return m_pScrollBar; }
virtual void RemoveItem( int itemID ); // removes an item from the table (changing the indices of all following items)
virtual void DeleteAllItems(); // clears and deletes all the memory used by the data items
void RemoveAll();
// painting
virtual vgui::Panel *GetCellRenderer( int row );
// layout
void SetFirstColumnWidth( int width );
int GetFirstColumnWidth();
void SetNumColumns( int iNumColumns );
int GetNumColumns( void );
// void MoveScrollBarToTop();
// selection
void SetSelectedPanel( vgui::Panel *panel );
Panel *GetSelectedPanel();
/*
On a panel being selected, a message gets sent to it
"PanelSelected" int "state"
where state is 1 on selection, 0 on deselection
*/
void SetVerticalBufferPixels( int buffer );
void ScrollToItem( int itemNumber );
CUtlVector< int > *GetSortedVector( void )
{
return &m_SortedItems;
}
protected:
// overrides
virtual void OnSizeChanged(int wide, int tall);
MESSAGE_FUNC_INT( OnSliderMoved, "ScrollBarSliderMoved", position );
virtual void PerformLayout();
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
virtual void OnMouseWheeled(int delta);
private:
int ComputeVPixelsNeeded();
enum { DEFAULT_HEIGHT = 24, PANELBUFFER = 5 };
class CDataItem
{
public:
CDataItem()
: m_bVisible( true )
{
}
void SetVisible( int bVisible )
{
m_bVisible = bVisible;
if ( panel )
{
panel->SetVisible( m_bVisible );
}
if ( labelPanel )
{
labelPanel->SetVisible( m_bVisible );
}
}
bool IsVisible() const { return m_bVisible; }
// Always store a panel pointer
vgui::Panel *panel;
vgui::Panel *labelPanel;
bool m_bVisible;
};
// list of the column headers
CUtlLinkedList< CDataItem, int> m_DataItems;
CUtlVector<int> m_SortedItems;
vgui::ScrollBar *m_pScrollBar;
vgui::Panel *m_pPanelEmbedded;
vgui::PHandle m_hSelectedItem;
int m_iFirstColumnWidth;
int m_nNumColumns;
int m_iDefaultHeight;
int m_iPanelBuffer;
// CPanelAnimationVar( bool, m_bAutoHideScrollbar, "autohide_scrollbar", "0" );
};
#endif // DUAL_PANEL_LIST_H