source-engine/gameui/matchmaking/dialogmenu.h

368 lines
11 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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