//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include #include "MultiplayerAdvancedDialog.h" #include #include #include #include #include #include #include #include #include #include #include "PanelListPanel.h" #include #include "FileSystem.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_pListPanel ); 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; mpcontrol_t *pList; CScriptObject *pObj; CScriptListItem *pItem; char szValue[256]; char strValue[ 256 ]; pList = m_pList; while ( pList ) { pObj = pList->pScrObj; if ( !pList->pControl ) { pObj->SetCurValue( pObj->defValue ); pList = pList->next; continue; } switch ( pObj->type ) { case O_BOOL: pBox = (CheckButton *)pList->pControl; Q_snprintf( szValue, ARRAYSIZE( szValue ), "%s", pBox->IsSelected() ? "1" : "0" ); break; case O_NUMBER: pEdit = ( TextEntry * )pList->pControl; pEdit->GetText( strValue, sizeof( strValue ) ); Q_snprintf( szValue, ARRAYSIZE( szValue ), "%s", strValue ); break; case O_STRING: pEdit = ( TextEntry * )pList->pControl; pEdit->GetText( strValue, sizeof( strValue ) ); Q_snprintf( szValue, ARRAYSIZE( 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 ) { Q_snprintf( szValue, ARRAYSIZE( szValue ), "%s", pItem->szValue ); } else // Couln't find index { //assert(!("Couldn't find string in list, using default value")); Q_snprintf( szValue, ARRAYSIZE( szValue ), "%s", pObj->defValue ); } 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; mpcontrol_t *pCtrl; CheckButton *pBox; TextEntry *pEdit; ComboBox *pCombo; CScriptListItem *pListItem; Panel *objParent = m_pListPanel; while ( pObj ) { if ( pObj->type == O_OBSOLETE ) { 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 ); pListItem = pObj->pListItems; while ( pListItem ) { pCombo->AddItem( pListItem->szItemText, NULL ); pListItem = pListItem->pNext; } pCombo->ActivateItemByRow((int)pObj->fdefValue); pCtrl->pControl = (Panel *)pCombo; 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; pCtrl->SetSize( 100, 28 ); //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 ); } } } //----------------------------------------------------------------------------- // Purpose: Constructor, load/save client settings object //----------------------------------------------------------------------------- CInfoDescription::CInfoDescription( CPanelListPanel *panel ) : CDescription( panel ) { setHint( "// NOTE: THIS FILE IS AUTOMATICALLY REGENERATED, \r\n\ //DO NOT EDIT THIS HEADER, YOUR COMMENTS WILL BE LOST IF YOU DO\r\n\ // User options script\r\n\ //\r\n\ // Format:\r\n\ // Version [float]\r\n\ // Options description followed by \r\n\ // Options defaults\r\n\ //\r\n\ // Option description syntax:\r\n\ //\r\n\ // \"cvar\" { \"Prompt\" { type [ type info ] } { default } }\r\n\ //\r\n\ // type = \r\n\ // BOOL (a yes/no toggle)\r\n\ // STRING\r\n\ // NUMBER\r\n\ // LIST\r\n\ //\r\n\ // type info:\r\n\ // BOOL no type info\r\n\ // NUMBER min max range, use -1 -1 for no limits\r\n\ // STRING no type info\r\n\ // LIST "" delimited list of options value pairs\r\n\ //\r\n\ //\r\n\ // default depends on type\r\n\ // BOOL is \"0\" or \"1\"\r\n\ // NUMBER is \"value\"\r\n\ // STRING is \"value\"\r\n\ // LIST is \"index\", where index \"0\" is the first element of the list\r\n\r\n\r\n" ); setDescription( "INFO_OPTIONS" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CInfoDescription::WriteScriptHeader( FileHandle_t fp ) { char am_pm[] = "AM"; tm newtime; Plat_GetLocalTime( &newtime ); g_pFullFileSystem->FPrintf( fp, (char *)getHint() ); char timeString[64]; Plat_GetTimeString( &newtime, timeString, sizeof( timeString ) ); // Write out the comment and Cvar Info: g_pFullFileSystem->FPrintf( fp, "// Half-Life User Info Configuration Layout Script (stores last settings chosen, too)\r\n" ); g_pFullFileSystem->FPrintf( fp, "// File generated: %.19s %s\r\n", timeString, am_pm ); g_pFullFileSystem->FPrintf( fp, "//\r\n//\r\n// Cvar\t-\tSetting\r\n\r\n" ); g_pFullFileSystem->FPrintf( fp, "VERSION %.1f\r\n\r\n", SCRIPT_VERSION ); g_pFullFileSystem->FPrintf( fp, "DESCRIPTION INFO_OPTIONS\r\n{\r\n" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CInfoDescription::WriteFileHeader( FileHandle_t fp ) { char am_pm[] = "AM"; tm newtime; Plat_GetLocalTime( &newtime ); char timeString[64]; Plat_GetTimeString( &newtime, timeString, sizeof( timeString ) ); g_pFullFileSystem->FPrintf( fp, "// Half-Life User Info Configuration Settings\r\n" ); g_pFullFileSystem->FPrintf( fp, "// DO NOT EDIT, GENERATED BY HALF-LIFE\r\n" ); g_pFullFileSystem->FPrintf( fp, "// File generated: %.19s %s\r\n", timeString, am_pm ); g_pFullFileSystem->FPrintf( fp, "//\r\n//\r\n// Cvar\t-\tSetting\r\n\r\n" ); } //-----------------------------------------------------------------------------