source-engine/hammer/optbuild.cpp

306 lines
6.8 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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);
}