diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /gameui/matchmaking/dialogmenu.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'gameui/matchmaking/dialogmenu.h')
| -rw-r--r-- | gameui/matchmaking/dialogmenu.h | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/gameui/matchmaking/dialogmenu.h b/gameui/matchmaking/dialogmenu.h new file mode 100644 index 0000000..83940d9 --- /dev/null +++ b/gameui/matchmaking/dialogmenu.h @@ -0,0 +1,367 @@ +//========= 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 |