diff options
Diffstat (limited to 'gameui/matchmaking/basedialog.cpp')
| -rw-r--r-- | gameui/matchmaking/basedialog.cpp | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/gameui/matchmaking/basedialog.cpp b/gameui/matchmaking/basedialog.cpp new file mode 100644 index 0000000..be65718 --- /dev/null +++ b/gameui/matchmaking/basedialog.cpp @@ -0,0 +1,295 @@ +//========= 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 ); |