summaryrefslogtreecommitdiff
path: root/engine/vgui_askconnectpanel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/vgui_askconnectpanel.cpp
downloadarchived-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.cpp286
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;
+ }
+}
+