You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
8.8 KiB
310 lines
8.8 KiB
//========= 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; |
|
}
|
|
|