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.
431 lines
9.9 KiB
431 lines
9.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include <time.h> |
|
|
|
#include "MultiplayerAdvancedDialog.h" |
|
|
|
#include <vgui/ILocalize.h> |
|
#include <vgui/ISurface.h> |
|
#include <vgui_controls/ListPanel.h> |
|
#include <KeyValues.h> |
|
#include <vgui_controls/Label.h> |
|
#include <vgui_controls/Button.h> |
|
#include <vgui_controls/MessageBox.h> |
|
#include <vgui_controls/CheckButton.h> |
|
#include <vgui_controls/ComboBox.h> |
|
#include <vgui_controls/TextEntry.h> |
|
#include "cvarslider.h" |
|
#include "PanelListPanel.h" |
|
#include <vgui/IInput.h> |
|
#include <steam/steam_api.h> |
|
#include "EngineInterface.h" |
|
#include "fmtstr.h" |
|
|
|
#include "filesystem.h" |
|
|
|
#include <tier0/vcrmode.h> |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
using namespace vgui; |
|
|
|
#define OPTIONS_DIR "cfg" |
|
#define DEFAULT_OPTIONS_FILE OPTIONS_DIR "/user_default.scr" |
|
#define OPTIONS_FILE OPTIONS_DIR "/user.scr" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CMultiplayerAdvancedDialog::CMultiplayerAdvancedDialog(vgui::Panel *parent) : BaseClass(NULL, "MultiplayerAdvancedDialog") |
|
{ |
|
SetBounds(0, 0, 372, 160); |
|
SetSizeable( false ); |
|
|
|
SetTitle("#GameUI_MultiplayerAdvanced", true); |
|
|
|
Button *cancel = new Button( this, "Cancel", "#GameUI_Cancel" ); |
|
cancel->SetCommand( "Close" ); |
|
|
|
Button *ok = new Button( this, "OK", "#GameUI_OK" ); |
|
ok->SetCommand( "Ok" ); |
|
|
|
m_pListPanel = new CPanelListPanel( this, "PanelListPanel" ); |
|
|
|
m_pList = NULL; |
|
|
|
m_pDescription = new CInfoDescription(); |
|
m_pDescription->InitFromFile( DEFAULT_OPTIONS_FILE ); |
|
m_pDescription->InitFromFile( OPTIONS_FILE ); |
|
m_pDescription->TransferCurrentValues( NULL ); |
|
|
|
LoadControlSettings("Resource\\MultiplayerAdvancedDialog.res"); |
|
CreateControls(); |
|
|
|
MoveToCenterOfScreen(); |
|
SetSizeable( false ); |
|
SetDeleteSelfOnClose( true ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor |
|
//----------------------------------------------------------------------------- |
|
CMultiplayerAdvancedDialog::~CMultiplayerAdvancedDialog() |
|
{ |
|
delete m_pDescription; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::Activate() |
|
{ |
|
BaseClass::Activate(); |
|
input()->SetAppModalSurface(GetVPanel()); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::OnClose() |
|
{ |
|
BaseClass::OnClose(); |
|
MarkForDeletion(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *command - |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::OnCommand( const char *command ) |
|
{ |
|
if ( !stricmp( command, "Ok" ) ) |
|
{ |
|
// OnApplyChanges(); |
|
SaveValues(); |
|
OnClose(); |
|
return; |
|
} |
|
|
|
BaseClass::OnCommand( command ); |
|
} |
|
|
|
void CMultiplayerAdvancedDialog::OnKeyCodeTyped(KeyCode code) |
|
{ |
|
// force ourselves to be closed if the escape key it pressed |
|
if (code == KEY_ESCAPE) |
|
{ |
|
Close(); |
|
} |
|
else |
|
{ |
|
BaseClass::OnKeyCodeTyped(code); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::GatherCurrentValues() |
|
{ |
|
if ( !m_pDescription ) |
|
return; |
|
|
|
// OK |
|
CheckButton *pBox; |
|
TextEntry *pEdit; |
|
ComboBox *pCombo; |
|
CCvarSlider *pSlider; |
|
|
|
mpcontrol_t *pList; |
|
|
|
CScriptObject *pObj; |
|
CScriptListItem *pItem; |
|
|
|
char szValue[256]; |
|
char strValue[ 256 ]; |
|
|
|
pList = m_pList; |
|
while ( pList ) |
|
{ |
|
pObj = pList->pScrObj; |
|
|
|
if ( pObj->type == O_CATEGORY ) |
|
{ |
|
pList = pList->next; |
|
continue; |
|
} |
|
|
|
if ( !pList->pControl ) |
|
{ |
|
pObj->SetCurValue( pObj->defValue ); |
|
pList = pList->next; |
|
continue; |
|
} |
|
|
|
switch ( pObj->type ) |
|
{ |
|
case O_BOOL: |
|
pBox = (CheckButton *)pList->pControl; |
|
sprintf( szValue, "%s", pBox->IsSelected() ? "1" : "0" ); |
|
break; |
|
case O_NUMBER: |
|
pEdit = ( TextEntry * )pList->pControl; |
|
pEdit->GetText( strValue, sizeof( strValue ) ); |
|
sprintf( szValue, "%s", strValue ); |
|
break; |
|
case O_STRING: |
|
pEdit = ( TextEntry * )pList->pControl; |
|
pEdit->GetText( strValue, sizeof( strValue ) ); |
|
sprintf( szValue, "%s", strValue ); |
|
break; |
|
case O_LIST: |
|
{ |
|
pCombo = (ComboBox *)pList->pControl; |
|
// pCombo->GetText( strValue, sizeof( strValue ) ); |
|
int activeItem = pCombo->GetActiveItem(); |
|
|
|
pItem = pObj->pListItems; |
|
// int n = (int)pObj->fdefValue; |
|
|
|
while ( pItem ) |
|
{ |
|
if (!activeItem--) |
|
break; |
|
|
|
pItem = pItem->pNext; |
|
} |
|
|
|
if ( pItem ) |
|
{ |
|
sprintf( szValue, "%s", pItem->szValue ); |
|
} |
|
else // Couln't find index |
|
{ |
|
//assert(!("Couldn't find string in list, using default value")); |
|
sprintf( szValue, "%s", pObj->defValue ); |
|
} |
|
break; |
|
} |
|
case O_SLIDER: |
|
pSlider = ( CCvarSlider * )pList->pControl; |
|
sprintf( szValue, "%.2f", pSlider->GetSliderValue() ); |
|
break; |
|
} |
|
|
|
// Remove double quotes and % characters |
|
UTIL_StripInvalidCharacters( szValue, sizeof(szValue) ); |
|
|
|
strcpy( strValue, szValue ); |
|
|
|
pObj->SetCurValue( strValue ); |
|
|
|
pList = pList->next; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::CreateControls() |
|
{ |
|
DestroyControls(); |
|
|
|
// Go through desciption creating controls |
|
CScriptObject *pObj; |
|
|
|
pObj = m_pDescription->pObjList; |
|
|
|
// Build out the clan dropdown |
|
CScriptObject *pClanObj = m_pDescription->FindObject( "cl_clanid" ); |
|
ISteamFriends *pFriends = steamapicontext->SteamFriends(); |
|
if ( pFriends && pClanObj ) |
|
{ |
|
pClanObj->RemoveAndDeleteAllItems(); |
|
int iGroupCount = pFriends->GetClanCount(); |
|
pClanObj->AddItem( new CScriptListItem( "#Cstrike_ClanTag_None", "0" ) ); |
|
for ( int k = 0; k < iGroupCount; ++ k ) |
|
{ |
|
CSteamID clanID = pFriends->GetClanByIndex( k ); |
|
const char *pName = pFriends->GetClanName( clanID ); |
|
const char *pTag = pFriends->GetClanTag( clanID ); |
|
|
|
char id[12]; |
|
Q_snprintf( id, sizeof( id ), "%d", clanID.GetAccountID() ); |
|
pClanObj->AddItem( new CScriptListItem( CFmtStr( "%s (%s)", pTag, pName ), id ) ); |
|
} |
|
} |
|
|
|
mpcontrol_t *pCtrl; |
|
|
|
CheckButton *pBox; |
|
TextEntry *pEdit; |
|
ComboBox *pCombo; |
|
CCvarSlider *pSlider; |
|
CScriptListItem *pListItem; |
|
|
|
Panel *objParent = m_pListPanel; |
|
|
|
while ( pObj ) |
|
{ |
|
if ( pObj->type == O_OBSOLETE || pObj->type == O_CATEGORY ) |
|
{ |
|
pObj = pObj->pNext; |
|
continue; |
|
} |
|
|
|
pCtrl = new mpcontrol_t( objParent, "mpcontrol_t" ); |
|
pCtrl->type = pObj->type; |
|
|
|
switch ( pCtrl->type ) |
|
{ |
|
case O_BOOL: |
|
pBox = new CheckButton( pCtrl, "DescCheckButton", pObj->prompt ); |
|
pBox->SetSelected( pObj->fdefValue != 0.0f ? true : false ); |
|
|
|
pCtrl->pControl = (Panel *)pBox; |
|
break; |
|
case O_STRING: |
|
case O_NUMBER: |
|
pEdit = new TextEntry( pCtrl, "DescTextEntry"); |
|
pEdit->InsertString(pObj->defValue); |
|
pCtrl->pControl = (Panel *)pEdit; |
|
break; |
|
case O_LIST: |
|
{ |
|
pCombo = new ComboBox( pCtrl, "DescComboBox", 5, false ); |
|
|
|
// track which row matches the current value |
|
int iRow = -1; |
|
int iCount = 0; |
|
pListItem = pObj->pListItems; |
|
while ( pListItem ) |
|
{ |
|
if ( iRow == -1 && !Q_stricmp( pListItem->szValue, pObj->curValue ) ) |
|
iRow = iCount; |
|
|
|
pCombo->AddItem( pListItem->szItemText, NULL ); |
|
pListItem = pListItem->pNext; |
|
++iCount; |
|
} |
|
|
|
|
|
pCombo->ActivateItemByRow( iRow ); |
|
|
|
pCtrl->pControl = (Panel *)pCombo; |
|
} |
|
break; |
|
case O_SLIDER: |
|
pSlider = new CCvarSlider( pCtrl, "DescSlider", "Test", pObj->fMin, pObj->fMax, pObj->cvarname, false ); |
|
pCtrl->pControl = (Panel *)pSlider; |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
if ( pCtrl->type != O_BOOL ) |
|
{ |
|
pCtrl->pPrompt = new vgui::Label( pCtrl, "DescLabel", "" ); |
|
pCtrl->pPrompt->SetContentAlignment( vgui::Label::a_west ); |
|
pCtrl->pPrompt->SetTextInset( 5, 0 ); |
|
pCtrl->pPrompt->SetText( pObj->prompt ); |
|
} |
|
|
|
pCtrl->pScrObj = pObj; |
|
|
|
switch ( pCtrl->type ) |
|
{ |
|
case O_BOOL: |
|
case O_STRING: |
|
case O_NUMBER: |
|
case O_LIST: |
|
pCtrl->SetSize( 100, 28 ); |
|
break; |
|
case O_SLIDER: |
|
pCtrl->SetSize( 100, 40 ); |
|
break; |
|
default: |
|
break; |
|
} |
|
//pCtrl->SetBorder( scheme()->GetBorder(1, "DepressedButtonBorder") ); |
|
m_pListPanel->AddItem( pCtrl ); |
|
|
|
// Link it in |
|
if ( !m_pList ) |
|
{ |
|
m_pList = pCtrl; |
|
pCtrl->next = NULL; |
|
} |
|
else |
|
{ |
|
mpcontrol_t *p; |
|
p = m_pList; |
|
while ( p ) |
|
{ |
|
if ( !p->next ) |
|
{ |
|
p->next = pCtrl; |
|
pCtrl->next = NULL; |
|
break; |
|
} |
|
p = p->next; |
|
} |
|
} |
|
|
|
pObj = pObj->pNext; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::DestroyControls() |
|
{ |
|
mpcontrol_t *p, *n; |
|
|
|
p = m_pList; |
|
while ( p ) |
|
{ |
|
n = p->next; |
|
// |
|
delete p->pControl; |
|
delete p->pPrompt; |
|
delete p; |
|
p = n; |
|
} |
|
|
|
m_pList = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CMultiplayerAdvancedDialog::SaveValues() |
|
{ |
|
// Get the values from the controls: |
|
GatherCurrentValues(); |
|
|
|
// Create the game.cfg file |
|
if ( m_pDescription ) |
|
{ |
|
FileHandle_t fp; |
|
|
|
// Add settings to config.cfg |
|
m_pDescription->WriteToConfig(); |
|
|
|
g_pFullFileSystem->CreateDirHierarchy( OPTIONS_DIR ); |
|
fp = g_pFullFileSystem->Open( OPTIONS_FILE, "wb" ); |
|
if ( fp ) |
|
{ |
|
m_pDescription->WriteToScriptFile( fp ); |
|
g_pFullFileSystem->Close( fp ); |
|
} |
|
} |
|
} |
|
|
|
|