diff options
Diffstat (limited to 'gameui/MultiplayerAdvancedDialog.cpp')
| -rw-r--r-- | gameui/MultiplayerAdvancedDialog.cpp | 431 |
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 ); + } + } +} + |