Team Fortress 2 Source Code as on 22/4/2020
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.
 
 
 
 
 
 

371 lines
12 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef LISTPANEL_H
#define LISTPANEL_H
#ifdef _WIN32
#pragma once
#endif
#include <utllinkedlist.h>
#include <utlvector.h>
#include <utlrbtree.h>
#include <vgui/VGUI.h>
#include <vgui_controls/Panel.h>
class KeyValues;
namespace vgui
{
class ScrollBar;
class TextImage;
class ImagePanel;
class Label;
class Button;
class IDraggerEvent;
class FastSortListPanelItem;
//-----------------------------------------------------------------------------
// Purpose: Generic class for ListPanel items
//-----------------------------------------------------------------------------
class ListPanelItem
{
public:
ListPanelItem() :
kv( 0 ),
userData( 0 ),
m_pDragData( 0 ),
m_bImage( false ),
m_nImageIndex( -1 ),
m_nImageIndexSelected( -1 ),
m_pIcon( 0 )
{
}
KeyValues *kv;
unsigned int userData;
KeyValues *m_pDragData;
bool m_bImage;
int m_nImageIndex;
int m_nImageIndexSelected;
IImage *m_pIcon;
};
typedef int __cdecl SortFunc(
ListPanel *pPanel,
const ListPanelItem &item1,
const ListPanelItem &item2 );
//-----------------------------------------------------------------------------
// Purpose: A spread-sheet type data view, similar to MFC's
//-----------------------------------------------------------------------------
class ListPanel : public Panel
{
DECLARE_CLASS_SIMPLE( ListPanel, Panel );
public:
ListPanel(Panel *parent, const char *panelName);
~ListPanel();
// COLUMN HANDLING
// all indices are 0 based, limit of 255 columns
// columns are resizable by default
enum ColumnFlags_e
{
COLUMN_FIXEDSIZE = 0x01, // set to have the column be a fixed size
COLUMN_RESIZEWITHWINDOW = 0x02, // set to have the column grow with the parent dialog growing
COLUMN_IMAGE = 0x04, // set if the column data is not text, but instead the index of the image to display
COLUMN_HIDDEN = 0x08, // column is hidden by default
COLUMN_UNHIDABLE = 0x10, // column is unhidable
};
// adds a column header
virtual void AddColumnHeader(int index, const char *columnName, const char *columnText, int startingWidth, int minWidth, int maxWidth, int columnFlags = 0);
virtual void AddColumnHeader(int index, const char *columnName, const char *columnText, int width, int columnFlags = 0);
virtual void RemoveColumn(int column); // removes a column
virtual int FindColumn(const char *columnName);
virtual void SetColumnHeaderHeight( int height );
virtual void SetColumnHeaderText(int column, const char *text);
virtual void SetColumnHeaderText(int column, wchar_t *text);
virtual void SetColumnHeaderImage(int column, int imageListIndex);
virtual void SetColumnHeaderTooltip(int column, const char *tooltipText);
virtual void SetColumnTextAlignment( int column, int align );
// Get information about the column headers.
virtual int GetNumColumnHeaders() const;
virtual bool GetColumnHeaderText( int index, char *pOut, int maxLen );
virtual void SetSortFunc(int column, SortFunc *func);
virtual void SetSortColumn(int column);
virtual void SortList( void );
virtual void SetColumnSortable(int column, bool sortable);
virtual void SetColumnVisible(int column, bool visible);
int GetSortColumn() const;
// sets whether the user can add/remove columns (defaults to off)
virtual void SetAllowUserModificationOfColumns(bool allowed);
// DATA HANDLING
// data->GetName() is used to uniquely identify an item
// data sub items are matched against column header name to be used in the table
virtual int AddItem(const KeyValues *data, unsigned int userData, bool bScrollToItem, bool bSortOnAdd); // Takes a copy of the data for use in the table. Returns the index the item is at.
void SetItemDragData( int itemID, const KeyValues *data ); // Makes a copy of the keyvalues to store in the table. Used when dragging from the table. Only used if the caller enables drag support
virtual int GetItemCount( void ); // returns the number of VISIBLE items
virtual int GetItem(const char *itemName); // gets the row index of an item by name (data->GetName())
virtual KeyValues *GetItem(int itemID); // returns pointer to data the row holds
virtual int GetItemCurrentRow(int itemID); // returns -1 if invalid index or item not visible
virtual int GetItemIDFromRow(int currentRow); // returns -1 if invalid row
virtual unsigned int GetItemUserData(int itemID);
virtual ListPanelItem *GetItemData(int itemID);
virtual void SetUserData( int itemID, unsigned int userData );
virtual int GetItemIDFromUserData( unsigned int userData );
virtual void ApplyItemChanges(int itemID); // applies any changes to the data, performed by modifying the return of GetItem() above
virtual void RemoveItem(int itemID); // removes an item from the table (changing the indices of all following items)
virtual void RereadAllItems(); // updates the view with the new data
virtual void RemoveAll(); // clears and deletes all the memory used by the data items
virtual void DeleteAllItems(); // obselete, use RemoveAll();
virtual void GetCellText(int itemID, int column, OUT_Z_BYTECAP(bufferSizeInBytes) wchar_t *buffer, int bufferSizeInBytes); // returns the data held by a specific cell
virtual IImage *GetCellImage(int itemID, int column); //, ImagePanel *&buffer); // returns the image held by a specific cell
// Use these until they return InvalidItemID to iterate all the items.
virtual int FirstItem() const;
virtual int NextItem( int iItem ) const;
virtual int InvalidItemID() const;
virtual bool IsValidItemID(int itemID);
// sets whether the dataitem is visible or not
// it is removed from the row list when it becomes invisible, but stays in the indexes
// this is much faster than a normal remove
virtual void SetItemVisible(int itemID, bool state);
virtual void SetItemDisabled(int itemID, bool state );
bool IsItemVisible( int itemID );
virtual void SetFont(HFont font);
// image handling
virtual void SetImageList(ImageList *imageList, bool deleteImageListWhenDone);
// SELECTION
// returns the count of selected items
virtual int GetSelectedItemsCount();
// returns the selected item by selection index, valid in range [0, GetNumSelectedRows)
virtual int GetSelectedItem(int selectionIndex);
// sets no item as selected
virtual void ClearSelectedItems();
virtual bool IsItemSelected( int itemID );
// adds a item to the select list
virtual void AddSelectedItem( int itemID );
// sets this single item as the only selected item
virtual void SetSingleSelectedItem( int itemID );
// returns the selected column, -1 for particular column selected
virtual int GetSelectedColumn();
// whether or not to select specific cells (off by default)
virtual void SetSelectIndividualCells(bool state);
// whether or not multiple cells/rows can be selected
void SetMultiselectEnabled( bool bState );
bool IsMultiselectEnabled() const;
// sets a single cell - all other previous rows are cleared
virtual void SetSelectedCell(int row, int column);
virtual bool GetCellAtPos(int x, int y, int &row, int &column); // returns true if any found, row and column are filled out. x, y are in screen space
virtual bool GetCellBounds( int row, int column, int& x, int& y, int& wide, int& tall );
// sets the text which is displayed when the list is empty
virtual void SetEmptyListText(const char *text);
virtual void SetEmptyListText(const wchar_t *text);
// relayout the scroll bar in response to changing the items in the list panel
// do this if you RemoveAll()
void ResetScrollBar();
// Attaches drag data to a particular item
virtual void OnCreateDragData( KeyValues *msg );
void SetIgnoreDoubleClick( bool state );
// set up a field for editing
virtual void EnterEditMode(int itemID, int column, vgui::Panel *editPanel);
// leaves editing mode
virtual void LeaveEditMode();
// returns true if we are currently in inline editing mode
virtual bool IsInEditMode();
MESSAGE_FUNC_INT( ResizeColumnToContents, "ResizeColumnToContents", column );
#ifdef _X360
virtual void NavigateTo();
#endif
/// Version number for file format of user config. This defaults to 1,
/// and if you rearrange columns you can increment it to cause any old
/// user configs (which will be screwed up) to be discarded.
int m_nUserConfigFileVersion;
protected:
// PAINTING
virtual Panel *GetCellRenderer(int row, int column);
// overrides
virtual void OnMouseWheeled(int delta);
virtual void OnSizeChanged(int wide, int tall);
virtual void PerformLayout();
virtual void Paint();
virtual void PaintBackground();
virtual void ApplySchemeSettings(IScheme *pScheme);
virtual void OnMousePressed( MouseCode code );
virtual void OnMouseDoublePressed( MouseCode code );
#ifdef _X360
virtual void OnKeyCodePressed(KeyCode code);
#else
virtual void OnKeyCodePressed( KeyCode code );
#endif
MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" );
MESSAGE_FUNC_INT_INT( OnColumnResized, "ColumnResized", column, delta );
MESSAGE_FUNC_INT( OnSetSortColumn, "SetSortColumn", column );
MESSAGE_FUNC( OpenColumnChoiceMenu, "OpenColumnChoiceMenu" );
MESSAGE_FUNC_INT( OnToggleColumnVisible, "ToggleColumnVisible", col );
virtual float GetRowsPerPage();
virtual int GetStartItem();
// user configuration
virtual void ApplyUserConfigSettings(KeyValues *userConfig);
virtual void GetUserConfigSettings(KeyValues *userConfig);
virtual bool HasUserConfigSettings();
/* MESSAGES SENT
"ItemSelected" - query which items are selected
"ItemDeselected" - query which items are selected
*/
public:
virtual void SetSortColumnEx( int iPrimarySortColumn, int iSecondarySortColumn, bool bSortAscending );
void GetSortColumnEx( int &iPrimarySortColumn, int &iSecondarySortColumn, bool &bSortAscending ) const;
private:
// Cleans up allocations associated with a particular item
void CleanupItem( FastSortListPanelItem *data );
// adds the item into the column indexes
void IndexItem(int itemID);
// Purpose:
void UpdateSelection( vgui::MouseCode code, int x, int y, int row, int column );
// Handles multiselect
void HandleMultiSelection( int itemID, int row, int column );
// Handles addselect
void HandleAddSelection( int itemID, int row, int column );
// pre-sorted columns
struct IndexItem_t
{
ListPanelItem *dataItem;
int duplicateIndex;
};
typedef CUtlRBTree<IndexItem_t, int> IndexRBTree_t;
struct column_t
{
Button *m_pHeader;
int m_iMinWidth;
int m_iMaxWidth;
bool m_bResizesWithWindow;
Panel *m_pResizer;
SortFunc *m_pSortFunc;
bool m_bTypeIsText;
bool m_bHidden;
bool m_bUnhidable;
IndexRBTree_t m_SortedTree;
int m_nContentAlignment;
};
// list of the column headers
CUtlLinkedList<column_t, unsigned char> m_ColumnsData;
// persistent list of all columns ever created, indexes into m_ColumnsData - used for matching up DATAITEM m_SortedTreeIndexes
CUtlVector<unsigned char> m_ColumnsHistory;
// current list of columns, indexes into m_ColumnsData
CUtlVector<unsigned char> m_CurrentColumns;
int m_iColumnDraggerMoved; // which column dragger was moved->which header to resize
int m_lastBarWidth;
CUtlLinkedList<FastSortListPanelItem*, int> m_DataItems;
CUtlVector<int> m_VisibleItems;
// set to true if the table needs to be sorted before it's drawn next
int m_iSortColumn;
int m_iSortColumnSecondary;
void ResortColumnRBTree(int col);
static bool RBTreeLessFunc(vgui::ListPanel::IndexItem_t &item1, vgui::ListPanel::IndexItem_t &item2);
TextImage *m_pTextImage; // used in rendering
ImagePanel *m_pImagePanel; // used in rendering
Label *m_pLabel; // used in rendering
ScrollBar *m_hbar;
ScrollBar *m_vbar;
int m_iSelectedColumn;
bool m_bNeedsSort : 1;
bool m_bSortAscending : 1;
bool m_bSortAscendingSecondary : 1;
bool m_bCanSelectIndividualCells : 1;
bool m_bShiftHeldDown : 1;
bool m_bMultiselectEnabled : 1;
bool m_bAllowUserAddDeleteColumns : 1;
bool m_bDeleteImageListWhenDone : 1;
bool m_bIgnoreDoubleClick : 1;
int m_iHeaderHeight;
int m_iRowHeight;
// selection data
CUtlVector<int> m_SelectedItems; // array of selected rows
int m_LastItemSelected; // remember the last row selected for future shift clicks
int m_iTableStartX;
int m_iTableStartY;
Color m_LabelFgColor;
Color m_DisabledColor;
Color m_SelectionFgColor;
Color m_DisabledSelectionFgColor;
ImageList *m_pImageList;
TextImage *m_pEmptyListText;
PHandle m_hEditModePanel;
int m_iEditModeItemID;
int m_iEditModeColumn;
void ResetColumnHeaderCommands();
};
}
#endif // LISTPANEL_H