//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #include "stdafx.h" #include "hammer.h" #include "OPTGeneral.h" #include "Options.h" #pragma warning(disable:4244) // memdbgon must be the last include file in a .cpp file!!! #include void EditorUtil_ConvertPath(CString &str, bool bSave); IMPLEMENT_DYNCREATE(COPTGeneral, CPropertyPage) BEGIN_MESSAGE_MAP(COPTGeneral, CPropertyPage) //{{AFX_MSG_MAP(COPTGeneral) ON_BN_CLICKED(IDC_INDEPENDENTWINDOWS, OnIndependentwindows) ON_BN_CLICKED(IDC_BROWSEAUTOSAVEDIR, OnBrowseAutosaveDir) ON_BN_CLICKED(IDC_ENABLEAUTOSAVE, OnEnableAutosave) //}}AFX_MSG_MAP END_MESSAGE_MAP() //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- COPTGeneral::COPTGeneral(void) : CPropertyPage(COPTGeneral::IDD) { //{{AFX_DATA_INIT(COPTGeneral) m_iMaxAutosavesPerMap = 0; m_iUndoLevels = 0; m_nMaxCameras = 5; //}}AFX_DATA_INIT } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- COPTGeneral::~COPTGeneral(void) { } //----------------------------------------------------------------------------- // Purpose: Ensures that our undo levels are at least 5. //----------------------------------------------------------------------------- void PASCAL DDV_UndoLevels(CDataExchange *pDX, int value) { if (value < 5) { AfxMessageBox("Undo levels must be at least 5.", MB_ICONEXCLAMATION | MB_OK); pDX->Fail(); } } void PASCAL DDV_MaxCameras(CDataExchange *pDX, int value) { if (value < 1 || value > 100) { AfxMessageBox("Max cameras must be between 1 and 1000.", MB_ICONEXCLAMATION | MB_OK); pDX->Fail(); } } void PASCAL DDV_AutosaveSpace(CDataExchange *pDX, int value) { if ( value > 10000 ) { AfxMessageBox("You have selected too much space for autosaving. The maximum value is 10000.", MB_ICONEXCLAMATION | MB_OK); pDX->Fail(); } } void PASCAL DDV_NumberAutosaves(CDataExchange *pDX, int value) { if ( value > 999 ) { AfxMessageBox("Number of autosaves must be 0-999.", MB_ICONEXCLAMATION | MB_OK); pDX->Fail(); } } void PASCAL DDV_AutosaveTimer(CDataExchange *pDX, int value) { if ( value < 1 || value > 120 ) { AfxMessageBox("Time must be between 1 - 120 minutes.", MB_ICONEXCLAMATION | MB_OK); pDX->Fail(); } } //----------------------------------------------------------------------------- // Purpose: // Input : pDX - //----------------------------------------------------------------------------- void COPTGeneral::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(COPTGeneral) DDX_Control(pDX, IDC_LOADWINPOSITIONS, m_cLoadWinPos); DDX_Control(pDX, IDC_INDEPENDENTWINDOWS, m_cIndependentWin); DDX_Control(pDX, IDC_UNDOSPIN, m_UndoSpin); DDX_Text(pDX, IDC_UNDO, m_iUndoLevels); DDX_Text(pDX, IDC_MAX_CAMERAS, m_nMaxCameras); DDX_Check(pDX, IDC_STRETCH_ARCH, Options.general.bStretchArches); DDX_Check(pDX, IDC_GROUPWHILEIGNOREGROUPS, Options.general.bGroupWhileIgnore); DDX_Check(pDX, IDC_INDEPENDENTWINDOWS, Options.general.bIndependentwin); DDX_Check(pDX, IDC_LOADWINPOSITIONS, Options.general.bLoadwinpos); DDV_UndoLevels( pDX, m_iUndoLevels ); DDV_MaxCameras( pDX, m_nMaxCameras ); DDX_Control(pDX, IDC_ENABLEAUTOSAVE, m_cEnableAutosave); DDX_Check(pDX, IDC_ENABLEAUTOSAVE, Options.general.bEnableAutosave); DDX_Text(pDX, IDC_MAPITERATIONS, m_iMaxAutosavesPerMap); DDX_Text(pDX, IDC_AUTOSAVESPACE, m_iMaxAutosaveSpace); DDX_Text(pDX, IDC_SAVETIME, m_iTimeBetweenSaves); DDX_Control(pDX, IDC_AUTOSAVEDIR, m_cAutosaveDir); DDX_Control(pDX, IDC_AUTOSAVETIMELABEL, m_cAutosaveTimeLabel); DDX_Control(pDX, IDC_SAVETIME, m_cAutosaveTime); DDX_Control(pDX, IDC_AUTOSAVESPACELABEL, m_cAutosaveSpaceLabel); DDX_Control(pDX, IDC_AUTOSAVESPACE, m_cAutosaveSpace); DDX_Control(pDX, IDC_AUTOSAVEITERATIONLABEL, m_cAutosaveIterationLabel); DDX_Control(pDX, IDC_MAPITERATIONS, m_cAutosaveIterations); DDX_Control(pDX, IDC_AUTOSAVEDIRECTORYLABEL, m_cAutosaveDirectoryLabel); DDX_Control(pDX, IDC_BROWSEAUTOSAVEDIR, m_cAutosaveBrowseButton); DDV_AutosaveSpace( pDX, m_iMaxAutosaveSpace ); DDV_NumberAutosaves( pDX, m_iMaxAutosavesPerMap ); DDV_AutosaveTimer( pDX, m_iTimeBetweenSaves ); DDX_Check(pDX, IDC_VGUI_MODELBROWSER, Options.general.bUseVGUIModelBrowser); //}}AFX_DATA_MAP } //----------------------------------------------------------------------------- // Purpose: // Output : Returns TRUE on success, FALSE on failure. //----------------------------------------------------------------------------- BOOL COPTGeneral::OnInitDialog(void) { char szAutosaveDir[MAX_PATH]; APP()->GetDirectory( DIR_AUTOSAVE, szAutosaveDir ); CString str( szAutosaveDir ); m_nMaxCameras = Options.general.nMaxCameras; m_iUndoLevels = Options.general.iUndoLevels; m_iMaxAutosavesPerMap = Options.general.iMaxAutosavesPerMap; m_iMaxAutosaveSpace = Options.general.iMaxAutosaveSpace; m_iTimeBetweenSaves = Options.general.iTimeBetweenSaves; CPropertyPage::OnInitDialog(); m_cEnableAutosave.SetCheck( Options.general.bEnableAutosave ); m_cAutosaveDir.SetWindowText( str ); // set undo range m_UndoSpin.SetRange(5, 999); OnEnableAutosave(); OnIndependentwindows(); return TRUE; } //----------------------------------------------------------------------------- // Purpose: // Output : Returns TRUE on success, FALSE on failure. //----------------------------------------------------------------------------- BOOL COPTGeneral::OnApply(void) { BOOL bResetTimer = FALSE; if( Options.general.iTimeBetweenSaves != m_iTimeBetweenSaves ) { //if the time value has changed, the timer needs to be reset so autosaves //happen at the new interval in this instance of hammer bResetTimer = TRUE; } if( ( Options.general.iMaxAutosavesPerMap != 0 && m_iMaxAutosavesPerMap == 0 ) || ( Options.general.iMaxAutosavesPerMap == 0 && m_iMaxAutosavesPerMap != 0 ) ) { //if the number of autosaves per map has changed to or away from 0 then //the timer needs to be reset bResetTimer = TRUE; } Options.general.iUndoLevels = m_iUndoLevels; Options.general.nMaxCameras = m_nMaxCameras; Options.general.iMaxAutosavesPerMap = m_iMaxAutosavesPerMap; Options.general.iMaxAutosaveSpace = m_iMaxAutosaveSpace; Options.general.iTimeBetweenSaves = m_iTimeBetweenSaves; Options.general.bEnableAutosave = m_cEnableAutosave.GetCheck(); CString str; m_cAutosaveDir.GetWindowText(str); if ( strcmp( Options.general.szAutosaveDir, str ) ) { strcpy( Options.general.szAutosaveDir, str ); bResetTimer = TRUE; } if( bResetTimer == TRUE ) { APP()->ResetAutosaveTimer(); } Options.PerformChanges(COptions::secGeneral); if ( Options.general.bEnableAutosave ) { if ( !APP()->VerifyAutosaveDirectory( Options.general.szAutosaveDir ) ) { Options.general.bEnableAutosave = false; m_cEnableAutosave.SetCheck( Options.general.bEnableAutosave ); OnEnableAutosave(); return FALSE; } } return(CPropertyPage::OnApply()); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void COPTGeneral::OnIndependentwindows(void) { m_cLoadWinPos.EnableWindow(m_cIndependentWin.GetCheck()); } void COPTGeneral::OnEnableAutosave(void) { int iEnabled = m_cEnableAutosave.GetCheck(); m_cAutosaveDir.EnableWindow( iEnabled ); m_cAutosaveTime.EnableWindow( iEnabled ); m_cAutosaveTimeLabel.EnableWindow( iEnabled ); m_cAutosaveSpaceLabel.EnableWindow( iEnabled ); m_cAutosaveSpace.EnableWindow( iEnabled ); m_cAutosaveIterationLabel.EnableWindow( iEnabled ); m_cAutosaveIterations.EnableWindow( iEnabled ); m_cAutosaveDirectoryLabel.EnableWindow( iEnabled ); m_cAutosaveBrowseButton.EnableWindow( iEnabled ); } void COPTGeneral::OnBrowseAutosaveDir(void) { char szTmp[MAX_PATH]; if (!BrowseForFolder("Select Autosave Directory", szTmp)) { return; } CString str(szTmp); EditorUtil_ConvertPath(str, false); m_cAutosaveDir.SetWindowText(str); } BOOL COPTGeneral::BrowseForFolder(char *pszTitle, char *pszDirectory) { char szTmp[MAX_PATH]; BROWSEINFO bi; memset(&bi, 0, sizeof bi); bi.hwndOwner = m_hWnd; bi.pszDisplayName = szTmp; bi.lpszTitle = pszTitle; bi.ulFlags = BIF_RETURNONLYFSDIRS; LPITEMIDLIST idl = SHBrowseForFolder(&bi); if(idl == NULL) return FALSE; SHGetPathFromIDList(idl, pszDirectory); CoTaskMemFree(idl); return TRUE; }