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.
367 lines
11 KiB
367 lines
11 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef DIALOGMENU_H |
|
#define DIALOGMENU_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#if defined(_WIN32) && !defined(_X360) |
|
#include "winlite.h" // FILETIME |
|
#endif |
|
|
|
#include "vgui_controls/Panel.h" |
|
#include "vgui_controls/Frame.h" |
|
|
|
class IAchievement; |
|
|
|
#define MAX_COMMAND_LEN 256 |
|
#define MAX_COLUMNS 32 |
|
|
|
class CDialogMenu; |
|
class CBaseDialog; |
|
|
|
struct sessionProperty_t |
|
{ |
|
static const int MAX_KEY_LEN = 64; |
|
byte nType; |
|
char szID[MAX_KEY_LEN]; |
|
char szValue[MAX_KEY_LEN]; |
|
char szValueType[MAX_KEY_LEN]; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// Base class representing a generic menu item. Supports two text labels, |
|
// where the first label is the "action" text and the second is an optional |
|
// description of the action. |
|
//----------------------------------------------------------------------- |
|
class CMenuItem : public vgui::EditablePanel |
|
{ |
|
DECLARE_CLASS_SIMPLE( CMenuItem, vgui::EditablePanel ); |
|
|
|
public: |
|
CMenuItem( CDialogMenu *pParent, const char *pTitle, const char *pDescription ); |
|
virtual ~CMenuItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySettings( KeyValues *pSettings ); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
virtual void SetFocus( const bool bActive ); |
|
virtual void SetEnabled( bool bEnabled ); |
|
virtual void SetActiveColumn( int col ); |
|
virtual bool IsEnabled(); |
|
virtual void OnClick(); |
|
|
|
protected: |
|
CDialogMenu *m_pParent; |
|
|
|
vgui::Label *m_pTitle; |
|
vgui::Label *m_pDescription; |
|
|
|
Color m_BgColor; |
|
Color m_BgColorActive; |
|
|
|
int m_nDisabledAlpha; |
|
int m_nBottomMargin; |
|
int m_nRightMargin; |
|
|
|
bool m_bEnabled; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// CCommandItem |
|
// |
|
// Menu item that issues a command when clicked. |
|
//----------------------------------------------------------------------- |
|
class CCommandItem : public CMenuItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( CCommandItem, CMenuItem ); |
|
|
|
public: |
|
CCommandItem( CDialogMenu *pParent, const char *pTitle, const char *pDescription, const char *pCommand ); |
|
virtual ~CCommandItem(); |
|
|
|
virtual void OnClick(); |
|
virtual void SetFocus( const bool bActive ); |
|
|
|
bool m_bHasFocus; |
|
|
|
char m_szCommand[MAX_PATH]; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// CPlayerItem |
|
// |
|
// Menu item to display a player in the lobby. |
|
//----------------------------------------------------------------------- |
|
class CPlayerItem : public CCommandItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( CMenuItem, CCommandItem ); |
|
|
|
public: |
|
CPlayerItem( CDialogMenu *pParent, const char *pTitle, int64 nId, byte bVoice, bool bReady ); |
|
virtual ~CPlayerItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
|
|
virtual void OnClick(); |
|
|
|
vgui::Label *m_pVoiceIcon; |
|
vgui::Label *m_pReadyIcon; |
|
|
|
byte m_bVoice; |
|
bool m_bReady; |
|
uint64 m_nId; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// CBrowserItem |
|
// |
|
// Menu item used to display session search results, etc. |
|
//----------------------------------------------------------------------- |
|
class CBrowserItem : public CCommandItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( CBrowserItem, CCommandItem ); |
|
|
|
public: |
|
CBrowserItem( CDialogMenu *pParent, const char *pHost, const char *pPlayers, const char *pScenario, const char *pPing ); |
|
virtual ~CBrowserItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySettings( KeyValues *pSettings ); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
|
|
private: |
|
vgui::Label *m_pPlayers; |
|
vgui::Label *m_pScenario; |
|
vgui::Label *m_pPing; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// COptionsItem |
|
// |
|
// Menu item used to present a list of options for the player to select |
|
// from, such as "choose a map" or "number of rounds". |
|
//----------------------------------------------------------------------- |
|
class COptionsItem : public CMenuItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( COptionsItem, CMenuItem ); |
|
|
|
public: |
|
COptionsItem( CDialogMenu *pParent, const char *pLabel ); |
|
virtual ~COptionsItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySettings( KeyValues *pSettings ); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
virtual void SetFocus( const bool bActive ); |
|
|
|
void SetOptionFocus( unsigned int idx ); |
|
void SetOptionFocusNext(); |
|
void SetOptionFocusPrev(); |
|
|
|
void AddOption( const char *pLabelText, const sessionProperty_t &option ); |
|
int GetActiveOptionIndex(); |
|
const sessionProperty_t &GetActiveOption(); |
|
|
|
void DeleteAllOptions() |
|
{ |
|
m_Options.RemoveAll(); |
|
m_OptionLabels.PurgeAndDeleteElements(); |
|
m_nActiveOption = m_Options.InvalidIndex(); |
|
} |
|
private: |
|
int m_nActiveOption; |
|
int m_nOptionsXPos; |
|
int m_nOptionsMinWide; |
|
int m_nOptionsLeftMargin; |
|
int m_nMaxOptionWidth; |
|
int m_nArrowGap; |
|
|
|
CUtlVector< vgui::Label* > m_OptionLabels; |
|
CUtlVector< sessionProperty_t > m_Options; |
|
|
|
char m_szOptionsFont[64]; |
|
vgui::HFont m_hOptionsFont; |
|
|
|
vgui::Label *m_pLeftArrow; |
|
vgui::Label *m_pRightArrow; |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// CAchievementItem |
|
// |
|
// Menu item used to present an achievement - including image, title, |
|
// description, points and unlock date. Clicking the item opens another |
|
// dialog with additional information about the achievement. |
|
//----------------------------------------------------------------------- |
|
class CAchievementItem : public CMenuItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( CAchievementItem, CMenuItem ); |
|
|
|
public: |
|
CAchievementItem( CDialogMenu *pParent, const wchar_t *pName, const wchar_t *pDesc, uint points, bool bUnlocked, IAchievement* pSourceAchievement ); |
|
virtual ~CAchievementItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
|
|
private: |
|
vgui::Label *m_pPoints; |
|
vgui::ImagePanel *m_pLockedIcon; |
|
vgui::ImagePanel *m_pUnlockedIcon; |
|
vgui::ImagePanel *m_pImage; |
|
|
|
vgui::ImagePanel *m_pPercentageBarBackground; |
|
vgui::ImagePanel *m_pPercentageBar; |
|
vgui::Label *m_pPercentageText; |
|
|
|
IAchievement *m_pSourceAchievement; |
|
|
|
Color m_AchievedBGColor; |
|
Color m_UnachievedBGColor; |
|
|
|
CPanelAnimationVar( Color, m_clrProgressBar, "ProgressBarColor", "140 140 140 255" ); |
|
}; |
|
|
|
//----------------------------------------------------------------------- |
|
// CSectionedItem |
|
// |
|
// Menu item used to display some number of data entries, which are arranged |
|
// into columns. Supports scrolling through columns horizontally with the |
|
// ability to "lock" columns so they don't scroll |
|
//----------------------------------------------------------------------- |
|
class CSectionedItem : public CCommandItem |
|
{ |
|
DECLARE_CLASS_SIMPLE( CSectionedItem, CCommandItem ); |
|
|
|
public: |
|
CSectionedItem( CDialogMenu *pParent, const char **ppEntries, int ct ); |
|
virtual ~CSectionedItem(); |
|
|
|
virtual void PerformLayout(); |
|
virtual void ApplySettings( KeyValues *pSettings ); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
|
|
virtual void SetActiveColumn( int col ); |
|
|
|
void ClearSections(); |
|
void AddSection( const char *pText, int wide ); |
|
|
|
struct section_s |
|
{ |
|
int wide; |
|
vgui::Label *pLabel; |
|
}; |
|
CUtlVector< section_s >m_Sections; |
|
|
|
bool m_bHeader; |
|
}; |
|
|
|
//-------------------------------------------------------------------------------------- |
|
// Generic menu for Xbox 360 matchmaking dialogs. Contains a list of CMenuItems arranged |
|
// vertically. The user can navigate the list using the controller and click on any |
|
// item. A clicked item may send a command to the dialog and the dialog responds accordingly. |
|
//-------------------------------------------------------------------------------------- |
|
class CDialogMenu : public vgui::Panel |
|
{ |
|
DECLARE_CLASS_SIMPLE( CDialogMenu, vgui::Panel ); |
|
|
|
public: |
|
CDialogMenu(); |
|
~CDialogMenu(); |
|
|
|
virtual void OnCommand( const char *pCommand ); |
|
virtual void ApplySettings( KeyValues *inResourceData ); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
virtual void PerformLayout(); |
|
void SetFilter( const char *pFilter ); |
|
virtual bool HandleKeyCode( vgui::KeyCode code ); |
|
void SetMaxVisibleItems( uint nMaxVisibleItems ); |
|
void SetParent( CBaseDialog *pParent ); |
|
|
|
// Menu items |
|
CCommandItem *AddCommandItem( const char *pTitleLabel, const char *pDescLabel, const char *pCommand ); |
|
CPlayerItem *AddPlayerItem( const char *pTitleLabel, int64 nId, byte bVoice, bool bReady ); |
|
CBrowserItem *AddBrowserItem( const char *pHost, const char *pPlayers, const char *pScenario, const char *pPing ); |
|
COptionsItem *AddOptionsItem( const char *pLabel ); |
|
CSectionedItem *AddSectionedItem( const char **ppEntries, int ct ); |
|
CAchievementItem *AddAchievementItem( const wchar_t *pName, const wchar_t *pDesc, uint cred, bool bUnlocked, IAchievement* pSourceAchievement ); |
|
CMenuItem *AddItemInternal( CMenuItem *pItem ); |
|
|
|
void RemovePlayerItem( int idx ); |
|
void SortMenuItems(); |
|
void ClearItems(); |
|
|
|
// Navigation |
|
void SetFocus( int idx ); |
|
void SetFocusNext(); |
|
void SetFocusPrev(); |
|
void SetOptionFocusNext(); |
|
void SetOptionFocusPrev(); |
|
void SetColumnFocusNext(); |
|
void SetColumnFocusPrev(); |
|
void UpdateBaseColumnIndex(); |
|
|
|
// Accessors |
|
CMenuItem *GetItem( int idx); |
|
int GetItemCount(); |
|
int GetActiveItemIndex(); |
|
int GetActiveColumnIndex(); |
|
int GetActiveOptionIndex( int idx ); |
|
int GetVisibleItemCount(); |
|
int GetVisibleColumnCount(); |
|
int GetFirstUnlockedColumnIndex(); |
|
int GetBaseRowIndex(); |
|
void SetBaseRowIndex( int idx ); |
|
int GetColumnXPos( int idx ); |
|
int GetColumnYPos( int idx ); |
|
int GetColumnWide( int idx ); |
|
int GetColumnAlignment( int idx ); |
|
vgui::HFont GetColumnFont( int idx ); |
|
Color GetColumnColor( int idx ); |
|
bool GetColumnSortType( int idx ); |
|
|
|
private: |
|
struct columninfo_s |
|
{ |
|
int xpos; |
|
int ypos; |
|
int wide; |
|
int align; |
|
bool bLocked; |
|
Color color; |
|
vgui::HFont hFont; |
|
bool bSortDown; |
|
}; |
|
CUtlVector< columninfo_s >m_Columns; |
|
CUtlVector< CMenuItem* > m_MenuItems; |
|
|
|
CBaseDialog *m_pParent; |
|
CSectionedItem *m_pHeader; |
|
vgui::IScheme *m_pScheme; |
|
|
|
char m_szFilter[MAX_COMMAND_LEN]; // string to use as a keyvalues filter when reading in menu items |
|
|
|
int m_nItemSpacing; // gap between menu items |
|
int m_nMinWide; // minimum width - final menu width will always be >= m_nMinWide |
|
|
|
bool m_bInitialized; |
|
bool m_bUseFilter; |
|
bool m_bHasHeader; |
|
int m_nMaxVisibleItems; // max number of items to display in the menu |
|
int m_nMaxVisibleColumns; // max number of columns to display in the menu |
|
int m_nActiveColumn; // index of the current active column |
|
int m_nBaseColumnIdx; // array index of the first non-static column |
|
int m_nBaseRowIdx; // array index of the first visible row |
|
int m_nActive; // index of the current active item |
|
int m_iUnlocked; // first unlocked column in the menu |
|
}; |
|
|
|
#endif // DIALOGMENU_H
|
|
|