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.
432 lines
9.9 KiB
432 lines
9.9 KiB
5 years ago
|
//========= 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 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|