summaryrefslogtreecommitdiff
path: root/gameui/MultiplayerAdvancedDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/MultiplayerAdvancedDialog.cpp')
-rw-r--r--gameui/MultiplayerAdvancedDialog.cpp431
1 files changed, 431 insertions, 0 deletions
diff --git a/gameui/MultiplayerAdvancedDialog.cpp b/gameui/MultiplayerAdvancedDialog.cpp
new file mode 100644
index 0000000..bbc7133
--- /dev/null
+++ b/gameui/MultiplayerAdvancedDialog.cpp
@@ -0,0 +1,431 @@
+//========= 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 );
+ }
+ }
+}
+