diff options
Diffstat (limited to 'hammer/optbuild.cpp')
| -rw-r--r-- | hammer/optbuild.cpp | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/hammer/optbuild.cpp b/hammer/optbuild.cpp new file mode 100644 index 0000000..254f183 --- /dev/null +++ b/hammer/optbuild.cpp @@ -0,0 +1,305 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include "stdafx.h" +#include "hammer.h" +#include "GameConfig.h" +#include "OPTBuild.h" +#include "Options.h" +#include "shlobj.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +void UpdateConfigList(CComboBox &combo); +void SelectActiveConfig(CComboBox &combo); + + +// dvs: this is duplicated in RunMapExpertDlg.cpp!! +enum +{ + id_InsertParmMapFileNoExt = 0x100, + id_InsertParmMapFile, + id_InsertParmMapPath, + id_InsertParmBspDir, + id_InsertParmExeDir, + id_InsertParmGameDir, + + id_InsertParmEnd +}; + + +void EditorUtil_ConvertPath(CString &str, bool bSave); +void EditorUtil_TransferPath(CDialog *pDlg, int nIDC, char *szDest, bool bSave); + + +COPTBuild::COPTBuild() + : CPropertyPage(COPTBuild::IDD) +{ + //{{AFX_DATA_INIT(COPTBuild) + //}}AFX_DATA_INIT + + m_pConfig = NULL; +} + + +void COPTBuild::DoDataExchange(CDataExchange* pDX) +{ + CPropertyPage::DoDataExchange(pDX); + //{{AFX_DATA_MAP(COPTBuild) + DDX_Control(pDX, IDC_BSPDIR, m_cBSPDir); + DDX_Control(pDX, IDC_VIS, m_cVIS); + DDX_Control(pDX, IDC_LIGHT, m_cLIGHT); + DDX_Control(pDX, IDC_GAME, m_cGame); + DDX_Control(pDX, IDC_BSP, m_cBSP); + DDX_Control(pDX, IDC_CONFIGS, m_cConfigs); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(COPTBuild, CPropertyPage) + //{{AFX_MSG_MAP(COPTBuild) + ON_BN_CLICKED(IDC_BROWSE_BSP, OnBrowseBsp) + ON_BN_CLICKED(IDC_BROWSE_GAME, OnBrowseGame) + ON_BN_CLICKED(IDC_BROWSE_LIGHT, OnBrowseLight) + ON_BN_CLICKED(IDC_BROWSE_VIS, OnBrowseVis) + ON_CBN_SELCHANGE(IDC_CONFIGS, OnSelchangeConfigs) + ON_BN_CLICKED(IDC_PARMS_BSP, OnParmsBsp) + ON_BN_CLICKED(IDC_PARMS_GAME, OnParmsGame) + ON_BN_CLICKED(IDC_PARMS_LIGHT, OnParmsLight) + ON_BN_CLICKED(IDC_PARMS_VIS, OnParmsVis) + ON_BN_CLICKED(IDC_BROWSE_BSPDIR, OnBrowseBspdir) + ON_COMMAND_EX_RANGE(id_InsertParmMapFileNoExt, id_InsertParmEnd, HandleInsertParm) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void COPTBuild::DoBrowse(CWnd *pWnd) +{ + // Convert $Steam tokens to the real paths. + CString str; + pWnd->GetWindowText(str); + EditorUtil_ConvertPath(str, true); + + CFileDialog dlg(TRUE, ".exe", str, OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "Programs (*.exe)|*.exe||", this); + if (dlg.DoModal() == IDCANCEL) + return; + + // Convert back to $Steam tokens. + str = dlg.GetPathName(); + EditorUtil_ConvertPath(str, false); + pWnd->SetWindowText(str); +} + +void COPTBuild::OnBrowseBsp() +{ + DoBrowse(&m_cBSP); +} + +void COPTBuild::OnBrowseGame() +{ + DoBrowse(&m_cGame); +} + +void COPTBuild::OnBrowseLight() +{ + DoBrowse(&m_cLIGHT); +} + +void COPTBuild::OnBrowseVis() +{ + DoBrowse(&m_cVIS); +} + +void COPTBuild::OnSelchangeConfigs() +{ + SaveInfo(m_pConfig); + + m_pConfig = NULL; + + int iCurSel = m_cConfigs.GetCurSel(); + + BOOL bKillFields = (iCurSel == CB_ERR) ? FALSE : TRUE; + m_cBSP.EnableWindow(bKillFields); + m_cLIGHT.EnableWindow(bKillFields); + m_cVIS.EnableWindow(bKillFields); + m_cGame.EnableWindow(bKillFields); + m_cBSPDir.EnableWindow(bKillFields); + + if(iCurSel == CB_ERR) + return; + + // get pointer to the configuration + m_pConfig = Options.configs.FindConfig(m_cConfigs.GetItemData(iCurSel)); + + // update dialog data + EditorUtil_TransferPath(this, IDC_BSP, m_pConfig->szBSP, false); + EditorUtil_TransferPath(this, IDC_LIGHT, m_pConfig->szLIGHT, false); + EditorUtil_TransferPath(this, IDC_VIS, m_pConfig->szVIS, false); + EditorUtil_TransferPath(this, IDC_GAME, m_pConfig->szExecutable, false); + EditorUtil_TransferPath(this, IDC_BSPDIR, m_pConfig->szBSPDir, false); +} + + +void COPTBuild::SaveInfo(CGameConfig *pConfig) +{ + if (!pConfig) + { + return; + } + + EditorUtil_TransferPath(this, IDC_BSP, m_pConfig->szBSP, true); + EditorUtil_TransferPath(this, IDC_LIGHT, m_pConfig->szLIGHT, true); + EditorUtil_TransferPath(this, IDC_VIS, m_pConfig->szVIS, true); + EditorUtil_TransferPath(this, IDC_GAME, m_pConfig->szExecutable, true); + EditorUtil_TransferPath(this, IDC_BSPDIR, m_pConfig->szBSPDir, true); +} + + +void COPTBuild::UpdateConfigList() +{ + m_pConfig = NULL; + + ::UpdateConfigList(m_cConfigs); + ::SelectActiveConfig(m_cConfigs); + + OnSelchangeConfigs(); + SetModified(); +} + +BOOL COPTBuild::OnInitDialog() +{ + CPropertyPage::OnInitDialog(); + + UpdateConfigList(); + SetModified(TRUE); + + return TRUE; +} + +BOOL COPTBuild::OnApply() +{ + SaveInfo(m_pConfig); + + return CPropertyPage::OnApply(); +} + +BOOL COPTBuild::HandleInsertParm(UINT nID) +// insert a parm at the current cursor location into the parameters +// edit control +{ + LPCTSTR pszInsert = 0; + + switch (nID) + { + case id_InsertParmMapFileNoExt: + pszInsert = "$file"; + break; + case id_InsertParmMapFile: + pszInsert = "$file.$ext"; + break; + case id_InsertParmMapPath: + pszInsert = "$path"; + break; + case id_InsertParmExeDir: + pszInsert = "$exedir"; + break; + case id_InsertParmBspDir: + pszInsert = "$bspdir"; + break; + case id_InsertParmGameDir: + pszInsert = "$gamedir"; + break; + } + + Assert(pszInsert != NULL); + if (!pszInsert) + { + return TRUE; + } + + m_pAddParmWnd->ReplaceSel(pszInsert); + + return TRUE; +} + + +void COPTBuild::InsertParm(UINT nID, CEdit *pEdit) +{ + m_pAddParmWnd = pEdit; + + // two stages - name/description OR data itself + CMenu menu; + menu.CreatePopupMenu(); + menu.AppendMenu(MF_STRING, id_InsertParmMapFileNoExt, "Map Filename (no extension)"); + menu.AppendMenu(MF_STRING, id_InsertParmMapFile, "Map Filename (with extension)"); + menu.AppendMenu(MF_STRING, id_InsertParmMapPath, "Map Path (no filename)"); + menu.AppendMenu(MF_SEPARATOR); + menu.AppendMenu(MF_STRING, id_InsertParmExeDir, "Game Executable Directory"); + menu.AppendMenu(MF_STRING, id_InsertParmBspDir, "BSP Directory"); + menu.AppendMenu(MF_STRING, id_InsertParmGameDir, "Game Directory"); + + // track menu + CWnd *pButton = GetDlgItem(nID); + CRect r; + pButton->GetWindowRect(r); + menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, r.left, r.bottom, this, NULL); +} + + +void COPTBuild::OnParmsBsp() +{ + InsertParm(IDC_PARMS_BSP, &m_cBSP); +} + +void COPTBuild::OnParmsGame() +{ + InsertParm(IDC_PARMS_GAME, &m_cGame); +} + +void COPTBuild::OnParmsLight() +{ + InsertParm(IDC_PARMS_LIGHT, &m_cLIGHT); +} + +void COPTBuild::OnParmsVis() +{ + InsertParm(IDC_PARMS_VIS, &m_cVIS); +} + +void COPTBuild::OnBrowseBspdir() +{ + CString str; + m_cBSPDir.GetWindowText(str); + EditorUtil_ConvertPath(str, true); + + char szTemp[MAX_PATH]; + Q_strncpy(szTemp, str, MAX_PATH); + + BROWSEINFO bi; + memset(&bi, 0, sizeof bi); + bi.hwndOwner = m_hWnd; + bi.pszDisplayName = szTemp; + bi.lpszTitle = "Select BSP file directory"; + bi.ulFlags = BIF_RETURNONLYFSDIRS; + + LPITEMIDLIST idl = SHBrowseForFolder(&bi); + + if (idl == NULL) + return; + + SHGetPathFromIDList(idl, szTemp); + CoTaskMemFree(idl); + + // Convert back to %STEAM%. + str = szTemp; + EditorUtil_ConvertPath(str, false); + m_cBSPDir.SetWindowText(str); +} |