hl2_src-leak-2017/src/engine/vgui_askconnectpanel.cpp

287 lines
7.0 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#include "vgui_baseui_interface.h"
#include "vgui/IVGui.h"
#include "vgui_controls/Frame.h"
#include "vgui_controls/Label.h"
#include "vgui_controls/AnimationController.h"
#include "vgui/ILocalize.h"
#include "mathlib/mathlib.h"
#include "inputsystem/ButtonCode.h"
#include "vgui_askconnectpanel.h"
#include "keys.h"
#include "cl_pluginhelpers.h"
using namespace vgui;
class CAskConnectPanel : public EditablePanel
{
DECLARE_CLASS_SIMPLE( CAskConnectPanel, vgui::EditablePanel );
public:
CAskConnectPanel( VPANEL parent );
~CAskConnectPanel();
void GetHostName( char *pOut, int maxOutBytes );
void SetHostName( const char *pHostName );
void StartSlideAnimation( float flDuration );
void UpdateCurrentPosition();
void Hide();
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
virtual void ApplySettings(KeyValues *inResourceData);
virtual void OnTick();
public:
static CAskConnectPanel *s_pAskConnectPanel;
private:
char m_HostName[256];
Color m_bgColor;
int m_OriginalWidth; // Don't get less than this wide.
double m_flAnimationEndTime; // -1 if not playing
Label *m_pInfoLabel;
Label *m_pHostNameLabel;
int m_HostNameLabelRightSidePadding; // Grow the whole panel to make sure there's this much padding on the right of the hostname label.
Label *m_pAcceptLabel;
AnimationController *m_pAnimationController;
};
CAskConnectPanel *CAskConnectPanel::s_pAskConnectPanel = NULL;
CAskConnectPanel::CAskConnectPanel( VPANEL parent )
: BaseClass( NULL, "AskConnectPanel" ), m_bgColor( 0, 0, 0, 192 )
{
SetParent( parent );
Assert( s_pAskConnectPanel == NULL );
s_pAskConnectPanel = this;
m_flAnimationEndTime = -1;
SetKeyBoardInputEnabled( false );
SetMouseInputEnabled( false );
SetVisible( false );
m_pHostNameLabel = new Label( this, "HostNameLabel", "" );
m_pAcceptLabel = new Label( this, "AcceptLabel", "" );
m_pInfoLabel = new Label( this, "InfoLabel", "" );
m_HostName[0] = 0;
vgui::ivgui()->AddTickSignal( GetVPanel() );
SetAutoDelete( true );
m_pAnimationController = new vgui::AnimationController( NULL );
m_pAnimationController->SetParent( parent );
m_pAnimationController->SetScriptFile( parent, "scripts/plugin_animations.txt" );
m_pAnimationController->SetProportional( false );
LoadControlSettings( "resource\\askconnectpanel.res" );
InvalidateLayout( true );
m_OriginalWidth = GetWide();
int x, y, wide, tall;
m_pHostNameLabel->GetBounds( x, y, wide, tall );
m_HostNameLabelRightSidePadding = GetWide() - (x+wide);
}
CAskConnectPanel::~CAskConnectPanel()
{
s_pAskConnectPanel = NULL;
}
void CAskConnectPanel::GetHostName( char *pOut, int maxOutBytes )
{
V_strncpy( pOut, m_HostName, maxOutBytes );
}
void CAskConnectPanel::SetHostName( const char *pHostName )
{
V_strncpy( m_HostName, pHostName, sizeof( m_HostName ) );
m_pHostNameLabel->SetText( pHostName );
// Update our width.
int x, y, wide, tall;
m_pHostNameLabel->SizeToContents();
m_pHostNameLabel->GetBounds( x, y, wide, tall );
int x2, y2, wide2, tall2;
wchar_t wcMessage[512];
g_pVGuiLocalize->ConstructString_safe( wcMessage, g_pVGuiLocalize->Find("#Valve_ServerOfferingToConnect"), 0 );
m_pInfoLabel->SetText( wcMessage );
m_pInfoLabel->SizeToContents();
m_pInfoLabel->GetBounds( x2, y2, wide2, tall2 );
int desiredWidth = max(x+wide,x2+wide2) + m_HostNameLabelRightSidePadding;
if ( desiredWidth < m_OriginalWidth )
desiredWidth = m_OriginalWidth;
SetWide( desiredWidth );
}
void CAskConnectPanel::ApplySettings(KeyValues *inResourceData)
{
BaseClass::ApplySettings(inResourceData);
const char *pStr = inResourceData->GetString( "BgColor", NULL );
if ( pStr )
{
int r = 0, g = 0, b = 0, a = 0;
if ( sscanf( pStr, "%d %d %d %d", &r, &g, &b, &a ) == 4 )
{
m_bgColor = Color( r, g, b, a );
SetBgColor( m_bgColor );
}
}
}
void CAskConnectPanel::StartSlideAnimation( float flDuration )
{
m_flAnimationEndTime = Plat_FloatTime() + flDuration;
// Figure out what key they have bound...
const char *pKeyName = Key_NameForBinding( "askconnect_accept" );
if ( pKeyName )
{
wchar_t wcKeyName[64], wcMessage[512];
g_pVGuiLocalize->ConvertANSIToUnicode( pKeyName, wcKeyName, sizeof( wcKeyName ) );
g_pVGuiLocalize->ConstructString_safe( wcMessage, g_pVGuiLocalize->Find("#Valve_PressKeyToAccept"), 1, wcKeyName );
m_pAcceptLabel->SetText( wcMessage );
}
else
{
m_pAcceptLabel->SetText( "#Valve_BindKeyToAccept" );
}
m_pAnimationController->StartAnimationSequence( "AskConnectShow" );
SetVisible( true );
InvalidateLayout();
UpdateCurrentPosition();
}
void CAskConnectPanel::Hide()
{
m_flAnimationEndTime = -1;
SetVisible( false );
}
void CAskConnectPanel::OnTick()
{
// Do the hide animation?
if ( m_flAnimationEndTime != -1 )
{
if ( Plat_FloatTime() > m_flAnimationEndTime )
{
m_flAnimationEndTime = -1;
m_pAnimationController->StartAnimationSequence( "AskConnectHide" );
}
}
m_pAnimationController->UpdateAnimations( Sys_FloatTime() );
// Make sure vgui doesn't call Paint() on us after we're hidden.
if ( GetAlpha() == 0 )
SetVisible( false );
if ( IsVisible() )
{
UpdateCurrentPosition();
}
BaseClass::OnTick();
}
void CAskConnectPanel::UpdateCurrentPosition()
{
int x=0, y=0, wide=0, tall=0;
if ( g_PluginManager )
g_PluginManager->GetHudMessagePosition( x, y, wide, tall );
SetPos( x, y+tall );
}
void CAskConnectPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
SetBgColor( m_bgColor );
SetPaintBackgroundType( 2 );
}
void SetupDefaultAskConnectAcceptKey()
{
// If they don't have a binding for askconnect_accept, set one up.
if ( !Key_NameForBinding( "askconnect_accept" ) )
{
// .. but only if they don't already have something setup for F3.
if ( !Key_BindingForKey( KEY_F3 ) )
{
Key_SetBinding( KEY_F3, "askconnect_accept" );
}
}
}
vgui::Panel* CreateAskConnectPanel( VPANEL parent )
{
return new CAskConnectPanel( parent );
}
void ShowAskConnectPanel( const char *pHostName, float flDuration )
{
const int cubHostName = V_strlen( pHostName );
if ( cubHostName <= 0 )
return;
// Hostname is not allowed to contain semicolon, whitespace, or control characters
for ( int i = 0; i < cubHostName; i++ )
{
if ( pHostName[i] == ';' || V_isspace( pHostName[i] ) || pHostName[i] < 0x20 )
{
return;
}
}
CAskConnectPanel *pPanel = CAskConnectPanel::s_pAskConnectPanel;
if ( pPanel )
{
pPanel->SetHostName( pHostName );
pPanel->StartSlideAnimation( flDuration );
pPanel->MoveToFront();
}
}
void HideAskConnectPanel()
{
CAskConnectPanel *pPanel = CAskConnectPanel::s_pAskConnectPanel;
if ( pPanel )
pPanel->Hide();
}
bool IsAskConnectPanelActive( char *pHostName, int maxHostNameBytes )
{
CAskConnectPanel *pPanel = CAskConnectPanel::s_pAskConnectPanel;
if ( pPanel && pPanel->IsVisible() && pPanel->GetAlpha() > 0 )
{
pPanel->GetHostName( pHostName, maxHostNameBytes );
return true;
}
else
{
return false;
}
}