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
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; |
|
uintp 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, uintp 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 uintp GetItemUserData(int itemID); |
|
virtual ListPanelItem *GetItemData(int itemID); |
|
virtual void SetUserData( int itemID, uintp userData ); |
|
virtual int GetItemIDFromUserData( uintp 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
|
|
|