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 /utils/vconfig/ManageGamesDialog.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/vconfig/ManageGamesDialog.cpp')
| -rw-r--r-- | utils/vconfig/ManageGamesDialog.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/utils/vconfig/ManageGamesDialog.cpp b/utils/vconfig/ManageGamesDialog.cpp new file mode 100644 index 0000000..f3706e6 --- /dev/null +++ b/utils/vconfig/ManageGamesDialog.cpp @@ -0,0 +1,203 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include <windows.h> +#include <vgui/IVGui.h> +#include <vgui_controls/DirectorySelectDialog.h> +#include <vgui/IInput.h> +#include <KeyValues.h> + +#include "vconfig_main.h" +#include "ManageGamesDialog.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +using namespace vgui; + +CManageGamesDialog *g_pManageGamesDialog = NULL; + +class CModalDirectorySelectDialog : public vgui::DirectorySelectDialog +{ +public: + CModalDirectorySelectDialog( vgui::Panel *parent, const char *title ) + : vgui::DirectorySelectDialog( parent, title ) + { + m_PrevAppFocusPanel = vgui::input()->GetAppModalSurface(); + } + + ~CModalDirectorySelectDialog( void ) + { + vgui::input()->SetAppModalSurface( m_PrevAppFocusPanel ); + } + + +public: + vgui::VPANEL m_PrevAppFocusPanel; +}; + +//----------------------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------------------- +CManageGamesDialog::CManageGamesDialog( Panel *parent, const char *name, int configID ) : BaseClass( parent, name ), m_nConfigID( configID ) +{ + Assert( !g_pManageGamesDialog ); + g_pManageGamesDialog = this; + + SetSize(384, 420); + SetMinimumSize(200, 50); + + SetMinimizeButtonVisible( false ); + + m_pGameNameEntry= new vgui::TextEntry( this, "GameName" ); + m_pGameDirEntry = new vgui::TextEntry( this, "GamePath" ); + + LoadControlSettings( "ManageGamesDialog.res" ); + + SetDeleteSelfOnClose( true ); + + SetSizeable( false ); + MoveToCenterOfScreen(); +} + +//----------------------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------------------- +CManageGamesDialog::~CManageGamesDialog( void ) +{ + g_pManageGamesDialog = NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Sets the game directory +//----------------------------------------------------------------------------- +void CManageGamesDialog::SetGameDir( const char *szDir ) +{ + // Strip any trailing slashes + char szGameDir[MAX_PATH]; + Q_strncpy( szGameDir, szDir, MAX_PATH ); + Q_StripTrailingSlash( szGameDir ); + + m_pGameDirEntry->SetText( szGameDir ); +} + +//----------------------------------------------------------------------------- +// Purpose: Set the game name +//----------------------------------------------------------------------------- +void CManageGamesDialog::SetGameName( const char *szDir ) +{ + m_pGameNameEntry->SetText( szDir ); +} + +//----------------------------------------------------------------------------- +// Purpose: Ensures the parameter name is unique +// Input : *name - name to test +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CManageGamesDialog::IsGameNameUnique( const char *name ) +{ + // Check all names + for ( int i = 0; i < g_Configs.Count(); i++ ) + { + // Skip ourself + if ( i == m_nConfigID ) + continue; + + // Test it + if ( Q_stricmp( name, g_Configs[i]->m_Name.Base() ) == 0 ) + return false; + } + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Handles dialog commands +//----------------------------------------------------------------------------- +void CManageGamesDialog::OnCommand( const char *command ) +{ + // Handle "OK" button + if ( Q_stricmp( command, "Select" ) == 0 ) + { + char textBuffer[1024]; + + // Save out the data + m_pGameNameEntry->GetText( textBuffer, sizeof( textBuffer ) ); + + // Make sure we're not setting this to a duplicate + if ( IsGameNameUnique( textBuffer ) == false ) + { + // Select the text + m_pGameNameEntry->SelectAllText( true ); + + // Pop a message box and refuse to close + VGUIMessageBox( this, "Error", "Game name %s already exists! Please enter a unique name.", textBuffer ); + + BaseClass::OnCommand( command ); + return; + } + + KeyValues *actionSignal = new KeyValues("ManageSelect"); + + if ( actionSignal == NULL ) + { + Assert( 0 ); + return; + } + + // See if we need to add a new config + if ( m_nConfigID == NEW_CONFIG_ID ) + { + // Create a new data container and point to it + m_nConfigID = g_Configs.AddToTail( new CGameConfig() ); + + // Send an overidden action signal to notify that we've added, not edited a field + actionSignal->SetName("AddSelect"); + } + + // Otherwise take the name + UtlStrcpy( g_Configs[m_nConfigID]->m_Name, textBuffer ); + + // Take the game directory + m_pGameDirEntry->GetText( textBuffer, sizeof( textBuffer ) ); + + // Strip off the trailing slash always + Q_StripTrailingSlash( textBuffer ); + + UtlStrcpy( g_Configs[m_nConfigID]->m_ModDir, textBuffer ); + + // Tell the parent we altered its data so it can refresh + PostActionSignal( actionSignal ); + + Close(); + } + // Modified to allow more than one browse button + else if ( Q_stricmp( command, "BrowseDir" ) == 0 ) + { + // Create a new dialog + CModalDirectorySelectDialog *pDlg = vgui::SETUP_PANEL( new CModalDirectorySelectDialog( this, "Select Game Directory" ) ); + + char textBuffer[1024]; + m_pGameDirEntry->GetText( textBuffer, sizeof( textBuffer ) ); + + // Get the currently set dir and use that as the start + pDlg->ExpandTreeToPath( textBuffer ); + pDlg->MoveToCenterOfScreen(); + pDlg->AddActionSignalTarget( this ); + pDlg->SetDeleteSelfOnClose( true ); + pDlg->DoModal(); + } + + BaseClass::OnCommand( command ); +} + +//----------------------------------------------------------------------------- +// Purpose: Notify us that the directory dialog has returned a new entry +//----------------------------------------------------------------------------- +void CManageGamesDialog::OnChooseDirectory( const char *dir ) +{ + SetGameDir( dir ); +} |