diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/vgui_askconnectpanel.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'engine/vgui_askconnectpanel.cpp')
| -rw-r--r-- | engine/vgui_askconnectpanel.cpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/engine/vgui_askconnectpanel.cpp b/engine/vgui_askconnectpanel.cpp new file mode 100644 index 0000000..f6317c2 --- /dev/null +++ b/engine/vgui_askconnectpanel.cpp @@ -0,0 +1,286 @@ +//========= 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; + } +} + |