//========= 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