mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
368 lines
11 KiB
C++
368 lines
11 KiB
C++
//========= 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
|