//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Dialog for selecting game configurations // //=====================================================================================// #include #include #include #include #include #include #include #include "vconfig_main.h" #include "VConfigDialog.h" #include "ManageGamesDialog.h" // memdbgon must be the last include file in a .cpp file!!! #include 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. "" 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; }