summaryrefslogtreecommitdiff
path: root/utils/vconfig/VConfigDialog.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 /utils/vconfig/VConfigDialog.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'utils/vconfig/VConfigDialog.cpp')
-rw-r--r--utils/vconfig/VConfigDialog.cpp310
1 files changed, 310 insertions, 0 deletions
diff --git a/utils/vconfig/VConfigDialog.cpp b/utils/vconfig/VConfigDialog.cpp
new file mode 100644
index 0000000..e3b7a08
--- /dev/null
+++ b/utils/vconfig/VConfigDialog.cpp
@@ -0,0 +1,310 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Dialog for selecting game configurations
+//
+//=====================================================================================//
+
+#include <windows.h>
+
+#include <vgui/IVGui.h>
+#include <vgui/IInput.h>
+#include <vgui/ISystem.h>
+#include <vgui_controls/ComboBox.h>
+#include <vgui_controls/MessageBox.h>
+#include <KeyValues.h>
+
+#include "vconfig_main.h"
+#include "VConfigDialog.h"
+#include "ManageGamesDialog.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+using namespace vgui;
+
+CVConfigDialog *g_pVConfigDialog = NULL;
+
+class CConversionInfoMessageBox : public vgui::Frame
+{
+public:
+ typedef vgui::Frame BaseClass;
+
+ CConversionInfoMessageBox( Panel *pParent, const char *pPanelName )
+ : BaseClass( pParent, pPanelName )
+ {
+ SetSize( 200, 200 );
+ SetMinimumSize( 250, 100 );
+ SetSizeable( false );
+ LoadControlSettings( "convinfobox.res" );
+ }
+
+ virtual void OnCommand( const char *command )
+ {
+ BaseClass::OnCommand( command );
+
+ // For some weird reason, this dialog can
+ if ( Q_stricmp( command, "ShowFAQ" ) == 0 )
+ {
+ system()->ShellExecute( "open", "http://www.valve-erc.com/srcsdk/faq.html#convertINI" );
+ }
+ }
+};
+
+class CModalPreserveMessageBox : public vgui::MessageBox
+{
+public:
+ CModalPreserveMessageBox(const char *title, const char *text, vgui::Panel *parent)
+ : vgui::MessageBox( title, text, parent )
+ {
+ m_PrevAppFocusPanel = vgui::input()->GetAppModalSurface();
+ }
+
+ ~CModalPreserveMessageBox()
+ {
+ vgui::input()->SetAppModalSurface( m_PrevAppFocusPanel );
+ }
+
+
+public:
+ vgui::VPANEL m_PrevAppFocusPanel;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Utility function to pop up a VGUI message box
+//-----------------------------------------------------------------------------
+void VGUIMessageBox( vgui::Panel *pParent, const char *pTitle, const char *pMsg, ... )
+{
+ char msg[4096];
+ va_list marker;
+ va_start( marker, pMsg );
+ Q_vsnprintf( msg, sizeof( msg ), pMsg, marker );
+ va_end( marker );
+
+ vgui::MessageBox *dlg = new CModalPreserveMessageBox( pTitle, msg, pParent );
+ dlg->DoModal();
+ dlg->Activate();
+ dlg->RequestFocus();
+}
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CVConfigDialog::CVConfigDialog( Panel *parent, const char *name ) : BaseClass( parent, name ), m_bChanged( false )
+{
+ Assert( !g_pVConfigDialog );
+ g_pVConfigDialog = this;
+
+ SetSize(384, 420);
+ SetMinimumSize(200, 100);
+
+ SetMinimizeButtonVisible( true );
+
+ m_pConfigCombo = new ComboBox( this, "ConfigCombo", 8, false );
+
+ PopulateConfigList();
+
+ LoadControlSettings( "VConfigDialog.res" );
+
+ // See if we converted on load and notify
+ if ( g_ConfigManager.WasConvertedOnLoad() )
+ {
+ //VGUIMessageBox( this, "Update Occured", "Your game configurations have been updated.\n\nA backup file GameCfg.INI.OLD has been created.\n\nPlease visit http://www.valve-erc.com/srcsdk/faq.html#GameConfigUpdate for more information." );
+ CConversionInfoMessageBox *pDlg = new CConversionInfoMessageBox( this, "ConversionInfo" );
+
+ pDlg->RequestFocus();
+ pDlg->SetVisible( true );
+ pDlg->MoveToCenterOfScreen();
+ input()->SetAppModalSurface( pDlg->GetVPanel() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Destructor
+//-----------------------------------------------------------------------------
+CVConfigDialog::~CVConfigDialog()
+{
+ delete m_pConfigCombo;
+ g_pVConfigDialog = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Populate the configuration list for selection
+//-----------------------------------------------------------------------------
+void CVConfigDialog::PopulateConfigList( bool bSelectActiveConfig /*=true*/ )
+{
+ int activeItem = -1;
+
+ char szKeyValue[1024] = "\0";
+
+ if ( bSelectActiveConfig )
+ {
+ // Get the currently set game configuration
+ if ( GetVConfigRegistrySetting( GAMEDIR_TOKEN, szKeyValue, sizeof( szKeyValue ) ) == false )
+ {
+ //NOTE: We may want to pop an info dialog here if there was no initial VPROJECT setting
+ activeItem = 0;
+ }
+ }
+ else
+ {
+ activeItem = m_pConfigCombo->GetActiveItem();
+ }
+
+ // Purge all our items
+ m_pConfigCombo->DeleteAllItems();
+
+ KeyValues *kv = new KeyValues( "Items" );
+
+ // Add all configurations
+ for ( int i = 0; i < g_Configs.Count(); i++ )
+ {
+ // Set the text
+ kv->SetString( "ModDir", g_Configs[i]->m_ModDir.Base() );
+
+ // Add the item into the list
+ int index = m_pConfigCombo->AddItem( g_Configs[i]->m_Name.Base(), kv );
+
+ if ( bSelectActiveConfig )
+ {
+ if ( !Q_stricmp( g_Configs[i]->m_ModDir.Base(), szKeyValue ) )
+ {
+ activeItem = index;
+ }
+ }
+ }
+
+ // Make sure we have an active item
+ if ( activeItem < 0 )
+ {
+ // Give a warning if they have a mismatched directory!
+ VGUIMessageBox( this, "Invalid Game Directory", "The currently selected game directory: %s is invalid.\nChoose a new directory, or select 'Cancel' to exit.\n", szKeyValue );
+
+ // Default to the first config in the list
+ activeItem = 0;
+ }
+
+ // Set us to the active config
+ m_pConfigCombo->ActivateItem( activeItem );
+
+ kv->deleteThis();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Kills the whole app on close
+//-----------------------------------------------------------------------------
+void CVConfigDialog::OnClose( void )
+{
+ BaseClass::OnClose();
+ ivgui()->Stop();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Select the item from the list (updating the environment variable as well)
+// Input : index - item to select
+//-----------------------------------------------------------------------------
+void CVConfigDialog::SetGlobalConfig( const char *modDir )
+{
+ // Set our environment variable
+ SetMayaScriptSettings( );
+ SetXSIScriptSettings( );
+ SetPathSettings( );
+ SetVConfigRegistrySetting( GAMEDIR_TOKEN, modDir );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Parse commands coming in from the VGUI dialog
+//-----------------------------------------------------------------------------
+void CVConfigDialog::OnCommand( const char *command )
+{
+ if ( Q_stricmp( command, "Select" ) == 0 )
+ {
+ int activeID = m_pConfigCombo->GetActiveItem();
+
+ SetGlobalConfig( g_Configs[activeID]->m_ModDir.Base() );
+
+ // Save off our data
+ if ( m_bChanged )
+ {
+ SaveConfigs();
+ }
+
+ Close();
+ }
+ else if ( Q_stricmp( command, "Manage" ) == 0 )
+ {
+ int activeID = m_pConfigCombo->GetActiveItem();
+
+ // Launch the edit window
+ CManageGamesDialog *pDialog = new CManageGamesDialog( this, "ManageGamesDialog", activeID );
+
+ pDialog->AddActionSignalTarget( this );
+ pDialog->SetGameDir( g_Configs[activeID]->m_ModDir.Base() );
+ pDialog->SetGameName( g_Configs[activeID]->m_Name.Base() );
+ pDialog->DoModal();
+ }
+ else if ( Q_stricmp( command, "AddConfig" ) == 0 )
+ {
+ // Launch the edit window, specifying that we're adding a config
+ CManageGamesDialog *pDialog = new CManageGamesDialog( this, "ManageGamesDialog", NEW_CONFIG_ID );
+
+ pDialog->AddActionSignalTarget( this );
+ pDialog->DoModal();
+ }
+ else if ( Q_stricmp( command, "RemoveConfig" ) == 0 )
+ {
+ // Don't allow the list to completely vanish
+ // NOTE: We should display the list as being empty, i.e. "<EMPTY>"
+ if ( g_Configs.Count() <= 1 )
+ {
+ VGUIMessageBox( this, "Error", "Cannot remove last configuration from list!" );
+ return;
+ }
+
+ // Remove this config from our list
+ int activeID = m_pConfigCombo->GetActiveItem();
+
+ RemoveConfig( activeID );
+
+ ReloadConfigs( true );
+
+ // Select the next entry
+ m_pConfigCombo->ActivateItem( g_Configs.Count()-1 );
+
+ // Mark that we changed our configs
+ m_bChanged = true;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Manage dialog has reported a need to update
+//-----------------------------------------------------------------------------
+void CVConfigDialog::OnManageSelect( void )
+{
+ // Publish the config changes to the internal data in the configuration manager
+ UpdateConfigs();
+
+ // Update the configuration list
+ PopulateConfigList( false );
+
+ m_bChanged = true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Manage dialog has reported that it has added a configuration
+//-----------------------------------------------------------------------------
+void CVConfigDialog::OnAddSelect( void )
+{
+ // Add the last config we entered
+ AddConfig( g_Configs.Count()-1 );
+
+ // Re-populate the configuration list
+ ReloadConfigs();
+
+ // Select the last entry (which will be the new one)
+ m_pConfigCombo->ActivateItem( g_Configs.Count()-1 );
+
+ // Mark us as changed
+ m_bChanged = true;
+}