Team Fortress 2 Source Code as on 22/4/2020
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

//========= 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;
}