source-engine/gameui/matchmaking/basedialog.cpp

296 lines
8.2 KiB
C++
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: All matchmaking dialogs inherit from this
//
//=============================================================================//
#include "vgui_controls/Label.h"
#include "GameUI_Interface.h"
#include "KeyValues.h"
#include "basedialog.h"
#include "BasePanel.h"
#include "matchmakingbasepanel.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//---------------------------------------------------------
// CBaseDialog
//---------------------------------------------------------
CBaseDialog::CBaseDialog( vgui::Panel *pParent, const char *pName ) : BaseClass( pParent, pName )
{
SetTitleBarVisible( false );
SetCloseButtonVisible( false );
SetSizeable( false );
m_pParent = pParent;
m_Menu.SetParent( this );
m_pTitle = new vgui::Label( this, "DialogTitle", "" );
m_pFooterInfo = NULL;
m_nBorderWidth = 0;
m_nButtonGap = -1;
}
CBaseDialog::~CBaseDialog()
{
delete m_pTitle;
if ( m_pFooterInfo )
{
m_pFooterInfo->deleteThis();
}
}
//---------------------------------------------------------
// Purpose: Activate the dialog
//---------------------------------------------------------
void CBaseDialog::Activate( void )
{
BaseClass::Activate();
InvalidateLayout( false, false );
}
//---------------------------------------------------------
// Purpose: Set the title and menu positions
//---------------------------------------------------------
void CBaseDialog::PerformLayout( void )
{
BaseClass::PerformLayout();
m_pTitle->SizeToContents();
int menux, menuy;
m_Menu.GetPos( menux, menuy );
int autoWide = m_Menu.GetWide() + m_nBorderWidth * 2;
int autoTall = menuy + m_Menu.GetTall() + m_nBorderWidth;
autoWide = max( autoWide, GetWide() );
autoTall = max( autoTall, GetTall() );
SetSize( autoWide, autoTall );
if ( m_pFooterInfo && m_pParent )
{
CMatchmakingBasePanel *pBasePanel = dynamic_cast< CMatchmakingBasePanel* >( m_pParent );
if ( pBasePanel )
{
// the base panel is our parent
pBasePanel->SetFooterButtons( this, m_pFooterInfo, m_nButtonGap );
}
}
if ( m_Menu.GetActiveItemIndex() == -1 )
{
m_Menu.SetFocus( 0 );
}
}
//---------------------------------------------------------
// Purpose: Setup sizes and positions
//---------------------------------------------------------
void CBaseDialog::ApplySettings( KeyValues *inResourceData )
{
BaseClass::ApplySettings( inResourceData );
m_nBorderWidth = inResourceData->GetInt( "borderwidth", 0 );
KeyValues *pFooter = inResourceData->FindKey( "Footer" );
if ( pFooter )
{
m_pFooterInfo = pFooter->MakeCopy();
}
m_nButtonGap = inResourceData->GetInt( "footer_buttongap", -1 );
}
//---------------------------------------------------------
// Purpose: Setup colors and fonts
//---------------------------------------------------------
void CBaseDialog::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
SetPaintBackgroundType( 2 );
m_pTitle->SetFgColor( pScheme->GetColor( "MatchmakingDialogTitleColor", Color( 200, 184, 151, 255 ) ) );
char szResourceName[MAX_PATH];
Q_snprintf( szResourceName, sizeof( szResourceName ), "%s.res", GetName() );
KeyValues *pKeys = BasePanel()->GetConsoleControlSettings()->FindKey( szResourceName );
LoadControlSettings( "NULL", NULL, pKeys );
}
//-----------------------------------------------------------------
// Purpose: Set the resource file to load this dialog's settings
//-----------------------------------------------------------------
void CBaseDialog::OnClose()
{
// Hide the rather ugly fade out
SetAlpha( 0 );
BaseClass::OnClose();
}
//-----------------------------------------------------------------
// Purpose: Change properties of a menu item
//-----------------------------------------------------------------
void CBaseDialog::OverrideMenuItem( KeyValues *pKeys )
{
// Do nothing
}
//-----------------------------------------------------------------
// Purpose: Swap the order of two menu items
//-----------------------------------------------------------------
void CBaseDialog::SwapMenuItems( int iOne, int iTwo )
{
// Do nothing
}
//-----------------------------------------------------------------
// Purpose: Send key presses to the dialog's menu
//-----------------------------------------------------------------
void CBaseDialog::OnKeyCodePressed( vgui::KeyCode code )
{
if ( code == KEY_XBUTTON_START )
{
m_KeyRepeat.Reset();
if ( GameUI().IsInLevel() )
{
m_pParent->OnCommand( "ResumeGame" );
}
return;
}
m_KeyRepeat.KeyDown( code );
// Send down to the menu
if ( !m_Menu.HandleKeyCode( code ) )
{
if ( code == KEY_XBUTTON_B )
{
OnCommand( "DialogClosing" );
SetDeleteSelfOnClose( true );
}
else
{
BaseClass::OnKeyCodePressed( code );
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CBaseDialog::OnKeyCodeReleased( vgui::KeyCode code )
{
m_KeyRepeat.KeyUp( code );
BaseClass::OnKeyCodeReleased( code );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CBaseDialog::HandleKeyRepeated( vgui::KeyCode code )
{
m_Menu.HandleKeyCode( code );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CBaseDialog::OnThink()
{
vgui::KeyCode code = m_KeyRepeat.KeyRepeated();
if ( code )
{
if ( HasFocus() )
{
HandleKeyRepeated( code );
}
else
{
// This can happen because of the slight delay after selecting a
// menu option and the resulting action. The selection caused the
// key repeater to be reset, but the player can press a movement
// key before the action occurs, leaving us with a key repeating
// on this dialog even though it no longer has focus.
m_KeyRepeat.Reset();
}
}
BaseClass::OnThink();
}
//-----------------------------------------------------------------
// Purpose: Forward commands to the matchmaking base panel
//-----------------------------------------------------------------
void CBaseDialog::OnCommand( const char *pCommand )
{
m_KeyRepeat.Reset();
m_pParent->OnCommand( pCommand );
}
//---------------------------------------------------------------------
// Helper object to display the map picture and descriptive text
//---------------------------------------------------------------------
CScenarioInfoPanel::CScenarioInfoPanel( vgui::Panel *parent, const char *pName ) : BaseClass( parent, pName )
{
m_pMapImage = new vgui::ImagePanel( this, "MapImage" );
m_pTitle = new CPropertyLabel( this, "Title", "" );
m_pSubtitle = new CPropertyLabel( this, "Subtitle", "" );
m_pDescOne = new CPropertyLabel( this, "DescOne", "" );
m_pDescTwo = new CPropertyLabel( this, "DescTwo", "" );
m_pDescThree = new CPropertyLabel( this, "DescThree", "" );
m_pValueTwo = new CPropertyLabel( this, "ValueTwo", "" );
m_pValueThree = new CPropertyLabel( this, "ValueThree", "" );
}
CScenarioInfoPanel::~CScenarioInfoPanel()
{
delete m_pMapImage;
delete m_pTitle;
delete m_pSubtitle;
delete m_pDescOne;
delete m_pDescTwo;
delete m_pDescThree;
delete m_pValueTwo;
delete m_pValueThree;
}
void CScenarioInfoPanel::PerformLayout( void )
{
BaseClass::PerformLayout();
}
void CScenarioInfoPanel::ApplySettings( KeyValues *pResourceData )
{
BaseClass::ApplySettings( pResourceData );
}
void CScenarioInfoPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
Color fontColor = pScheme->GetColor( "MatchmakingDialogTitleColor", Color( 0, 0, 0, 255 ) );
m_pTitle->SetFgColor( fontColor );
m_pSubtitle->SetFgColor( fontColor );
m_pDescOne->SetFgColor( fontColor );
m_pDescTwo->SetFgColor( fontColor );
m_pDescThree->SetFgColor( fontColor );
m_pValueTwo->SetFgColor( fontColor );
m_pValueThree->SetFgColor( fontColor );
SetPaintBackgroundType( 2 );
KeyValues *pKeys = BasePanel()->GetConsoleControlSettings()->FindKey( "ScenarioInfoPanel.res" );
ApplySettings( pKeys );
}
DECLARE_BUILD_FACTORY( CScenarioInfoPanel );