diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/runmapexpertdlg.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/runmapexpertdlg.cpp')
| -rw-r--r-- | hammer/runmapexpertdlg.cpp | 653 |
1 files changed, 653 insertions, 0 deletions
diff --git a/hammer/runmapexpertdlg.cpp b/hammer/runmapexpertdlg.cpp new file mode 100644 index 0000000..0638794 --- /dev/null +++ b/hammer/runmapexpertdlg.cpp @@ -0,0 +1,653 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// RunMapExpertDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "hammer.h" +#include "RunMapExpertDlg.h" +#include "RunMapCfgDlg.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +///////////////////////////////////////////////////////////////////////////// +// CRunMapExpertDlg dialog + +CRunMapExpertDlg::CRunMapExpertDlg(CWnd* pParent /*=NULL*/) + : CDialog(CRunMapExpertDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CRunMapExpertDlg) + //}}AFX_DATA_INIT + + m_pActiveSequence = NULL; + m_bNoUpdateCmd = FALSE; + m_bSwitchMode = FALSE; +} + + +void CRunMapExpertDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CRunMapExpertDlg) + DDX_Control(pDX, IDC_USEPROCESSWND, m_cUseProcessWnd); + DDX_Control(pDX, IDC_CONFIGURATIONS, m_cCmdSequences); + DDX_Control(pDX, IDC_MOVEUP, m_cMoveUp); + DDX_Control(pDX, IDC_MOVEDOWN, m_cMoveDown); + DDX_Control(pDX, IDC_ENSUREFN, m_cEnsureFn); + DDX_Control(pDX, IDC_ENSURECHECK, m_cEnsureCheck); + DDX_Control(pDX, IDC_PARAMETERS, m_cParameters); + DDX_Control(pDX, IDC_COMMAND, m_cCommand); + //}}AFX_DATA_MAP + + DDX_Control(pDX, IDC_COMMANDLIST, m_cCommandList); +} + + +// dvs: this is duplicated in OPTBuild.cpp!! +enum +{ + id_InsertParmMapFileNoExt = 0x100, + id_InsertParmMapFile, + id_InsertParmMapPath, + id_InsertParmBspDir, + id_InsertParmExeDir, + id_InsertParmGameDir, + + id_InsertParmEnd +}; + + +enum +{ + id_BrExecutable = 0x150, + id_BrChangeDir, + id_BrCopyFile, + id_BrDelFile, + id_BrRenameFile, + + id_BrGameProgram, + id_BrVISProgram, + id_BrBSPProgram, + id_BrLIGHTProgram, + + id_BrEnd +}; + + +BEGIN_MESSAGE_MAP(CRunMapExpertDlg, CDialog) + //{{AFX_MSG_MAP(CRunMapExpertDlg) + ON_BN_CLICKED(IDC_BROWSECOMMAND, OnBrowsecommand) + ON_LBN_SELCHANGE(IDC_COMMANDLIST, OnSelchangeCommandlist) + ON_BN_CLICKED(IDC_INSERTPARM, OnInsertparm) + ON_BN_CLICKED(IDC_MOVEDOWN, OnMovedown) + ON_BN_CLICKED(IDC_MOVEUP, OnMoveup) + ON_BN_CLICKED(IDC_NEW, OnNew) + ON_BN_CLICKED(IDC_NORMAL, OnNormal) + ON_BN_CLICKED(IDC_REMOVE, OnRemove) + ON_EN_UPDATE(IDC_COMMAND, OnUpdateCommand) + ON_EN_UPDATE(IDC_PARAMETERS, OnUpdateParameters) + ON_BN_CLICKED(IDC_ENSURECHECK, OnEnsurecheck) + ON_EN_UPDATE(IDC_ENSUREFN, OnUpdateEnsurefn) + ON_CBN_SELCHANGE(IDC_CONFIGURATIONS, OnSelchangeConfigurations) + ON_BN_CLICKED(IDC_EDITCONFIGS, OnEditconfigs) + ON_BN_CLICKED(IDC_USEPROCESSWND, OnUseprocesswnd) + ON_COMMAND_EX_RANGE(id_InsertParmMapFileNoExt, id_InsertParmEnd, HandleInsertParm) + ON_COMMAND_EX_RANGE(id_BrExecutable, id_BrEnd, HandleInsertCommand) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CRunMapExpertDlg message handlers + +BOOL CRunMapExpertDlg::HandleInsertCommand(UINT nID) +// insert a parm at the current cursor location into the parameters +// edit control +{ + PCCOMMAND pCommand = GetCommandAtIndex(NULL); + + if(!pCommand) + return TRUE; // no command + + if(nID == id_BrExecutable) + { + CFileDialog dlg(TRUE, "exe", NULL, OFN_HIDEREADONLY | + OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, + "Executable Files|*.exe||", this); + if(dlg.DoModal() == IDCANCEL) + return TRUE; + m_cCommand.SetWindowText(dlg.m_ofn.lpstrFile); + pCommand->iSpecialCmd = 0; + } + else + { + pCommand->iSpecialCmd = 0; + + switch(nID) + { + case id_BrCopyFile: + pCommand->iSpecialCmd = CCCopyFile; + break; + case id_BrDelFile: + pCommand->iSpecialCmd = CCDelFile; + break; + case id_BrRenameFile: + pCommand->iSpecialCmd = CCRenameFile; + break; + case id_BrChangeDir: + pCommand->iSpecialCmd = CCChangeDir; + break; + case id_BrGameProgram: + m_cCommand.SetWindowText("$game_exe"); + break; + case id_BrVISProgram: + m_cCommand.SetWindowText("$vis_exe"); + break; + case id_BrLIGHTProgram: + m_cCommand.SetWindowText("$light_exe"); + break; + case id_BrBSPProgram: + m_cCommand.SetWindowText("$bsp_exe"); + break; + } + + if(pCommand->iSpecialCmd) + pCommand->bLongFilenames = TRUE; + + OnSelchangeCommandlist(); + UpdateCommandWithEditFields(-1); + } + + return TRUE; +} + + +void CRunMapExpertDlg::OnBrowsecommand(void) +{ + CMenu menu; + menu.CreatePopupMenu(); + menu.AppendMenu(MF_STRING, id_BrExecutable, "Executable"); + menu.AppendMenu(MF_STRING, id_BrChangeDir, "Change Directory"); + menu.AppendMenu(MF_STRING, id_BrCopyFile, "Copy File"); + menu.AppendMenu(MF_STRING, id_BrDelFile, "Delete File"); + menu.AppendMenu(MF_STRING, id_BrRenameFile, "Rename File"); + menu.AppendMenu(MF_SEPARATOR); + menu.AppendMenu(MF_STRING, id_BrBSPProgram, "BSP program"); + menu.AppendMenu(MF_STRING, id_BrVISProgram, "VIS program"); + menu.AppendMenu(MF_STRING, id_BrLIGHTProgram, "LIGHT program"); + menu.AppendMenu(MF_STRING, id_BrGameProgram, "Game program"); + + // track menu + CWnd *pButton = GetDlgItem(IDC_BROWSECOMMAND); + CRect r; + pButton->GetWindowRect(r); + menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, r.left, r.bottom, this, NULL); +} + + +LPCTSTR CRunMapExpertDlg::GetCmdString(PCCOMMAND pCommand) +{ + switch(pCommand->iSpecialCmd) + { + case 0: + return pCommand->szRun; + case CCCopyFile: + return "Copy File"; + case CCDelFile: + return "Delete File"; + case CCRenameFile: + return "Rename File"; + case CCChangeDir: + return "Change Directory"; + } + + return ""; +} + +void CRunMapExpertDlg::OnSelchangeCommandlist() +{ + int iIndex = -1; + + // change the selection in the command list - update the command + // and parameters edit boxes + PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); + + // enable/disable controls + BOOL bEnable = pCommand ? TRUE : FALSE; + int iEnableCmds[] = + { + // edit fields: + IDC_COMMAND, + IDC_PARAMETERS, + IDC_ENSUREFN, + + // checkboxes/buttons: + IDC_ENSURECHECK, + IDC_USEPROCESSWND, + IDC_INSERTPARM, + IDC_BROWSECOMMAND, + + -1 + }; + + m_bNoUpdateCmd = TRUE; + for(int i = 0; iEnableCmds[i] != -1; i++) + { + CWnd *pWnd = GetDlgItem(iEnableCmds[i]); + pWnd->EnableWindow(bEnable); + if(bEnable == FALSE) + { + // ensure fields are cleared if we're disabling them + if(i < 3) + pWnd->SetWindowText(""); + else + ((CButton*)pWnd)->SetCheck(0); + } + } + m_bNoUpdateCmd = FALSE; + + if(!pCommand) + return; + + // set moveup/movedown buttons + m_cMoveUp.EnableWindow(iIndex != 0); + m_cMoveDown.EnableWindow(iIndex != m_cCommandList.GetCount() - 1); + + m_bNoUpdateCmd = TRUE; + + m_cCommand.SetWindowText(GetCmdString(pCommand)); + m_cParameters.SetWindowText(pCommand->szParms); + m_cEnsureCheck.SetCheck(pCommand->bEnsureCheck); + m_cEnsureFn.SetWindowText(pCommand->szEnsureFn); + m_cUseProcessWnd.SetCheck(pCommand->bUseProcessWnd); + // don't forget to call this: + OnEnsurecheck(); + + m_bNoUpdateCmd = FALSE; +} + + +BOOL CRunMapExpertDlg::HandleInsertParm(UINT nID) +// insert a parm at the current cursor location into the parameters +// edit control +{ + LPCTSTR pszInsert; + + 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: + default: + pszInsert = "$gamedir"; + break; + } + + Assert(pszInsert); + if(!pszInsert) + return TRUE; + + m_cParameters.ReplaceSel(pszInsert); + + return TRUE; +} + + +void CRunMapExpertDlg::OnInsertparm(void) +{ + // 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(IDC_INSERTPARM); + CRect r; + pButton->GetWindowRect(r); + menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, r.left, r.bottom, this, NULL); +} + + +void CRunMapExpertDlg::DeleteCommand(int iIndex) +{ + // kill the command at that index (deletes the dataptr memory too) + PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); + m_cCommandList.DeleteString(iIndex); + + if(iIndex >= m_cCommandList.GetCount()-1) + iIndex = m_cCommandList.GetCount()-1; + + m_cCommandList.SetCurSel(iIndex); + // selection has "changed" + OnSelchangeCommandlist(); + + delete pCommand; +} + +void CRunMapExpertDlg::AddCommand(int iIndex, PCCOMMAND pCommand) +{ + // add a command to the list at the index specified in iIndex (-1 to add + // at end of list.) + CString str; + str.Format("%s %s", GetCmdString(pCommand), pCommand->szParms); + iIndex = m_cCommandList.InsertString(iIndex, str); + m_cCommandList.SetItemDataPtr(iIndex, PVOID(pCommand)); +} + + +void CRunMapExpertDlg::MoveCommand(int iIndex, BOOL bUp) +{ + PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); + if(!pCommand) + return; + + // keep check state of item in listbox + BOOL bChecked = m_cCommandList.GetCheck(iIndex); + + // don't bother with the string - that's made from the command/parms + // struct that the item's dataptr points to + m_cCommandList.DeleteString(iIndex); + + int iNewIndex = iIndex + (bUp ? -1 : +1); + AddCommand(iNewIndex, pCommand); + + // restore check state saved above + m_cCommandList.SetCheck(iNewIndex, bChecked); + + // selection has changed + m_cCommandList.SetCurSel(iNewIndex); + OnSelchangeCommandlist(); +} + + +void CRunMapExpertDlg::OnMovedown() +{ + MoveCommand(-1, FALSE); +} + +void CRunMapExpertDlg::OnMoveup() +{ + MoveCommand(-1, TRUE); +} + +void CRunMapExpertDlg::OnNew() +{ + // add a command + PCCOMMAND pCommand = new CCOMMAND; + memset(pCommand, 0, sizeof(CCOMMAND)); + pCommand->bUseProcessWnd = TRUE; + AddCommand(-1, pCommand); + m_cCommandList.SetCurSel(m_cCommandList.GetCount()-1); + // sleection has changed + OnSelchangeCommandlist(); +} + +void CRunMapExpertDlg::OnNormal() +{ + m_bSwitchMode = TRUE; + SaveCommandsToSequence(); + + CHammer *pApp = (CHammer*) AfxGetApp(); + pApp->SaveSequences(); + + EndDialog(IDOK); +} + +void CRunMapExpertDlg::UpdateCommandWithEditFields(int iIndex) +{ + PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); + + // update command struct with edit fields: + m_cCommand.GetWindowText(pCommand->szRun, MAX_PATH); + m_cParameters.GetWindowText(pCommand->szParms, MAX_PATH); + m_cEnsureFn.GetWindowText(pCommand->szEnsureFn, MAX_PATH); + pCommand->bUseProcessWnd = m_cUseProcessWnd.GetCheck(); + pCommand->bEnsureCheck = m_cEnsureCheck.GetCheck(); + + // save checked state.. + BOOL bCmdChecked = m_cCommandList.GetCheck(iIndex); + + // update list by deleting/adding command + m_cCommandList.SetRedraw(FALSE); + m_cCommandList.DeleteString(iIndex); + AddCommand(iIndex, pCommand); + m_cCommandList.SetCurSel(iIndex); + m_cCommandList.SetRedraw(TRUE); + m_cCommandList.Invalidate(); + + m_cCommandList.SetCheck(iIndex, bCmdChecked); + + // DON'T call OnCommandlistSelchange() here +} + +PCCOMMAND CRunMapExpertDlg::GetCommandAtIndex(int *piIndex) +{ + // make sure we're pointing at something: + int iIndex = -1; + if(piIndex == NULL) + piIndex = &iIndex; + + // return the current command structure + if(piIndex[0] == -1) + piIndex[0] = m_cCommandList.GetCurSel(); + if(piIndex[0] == LB_ERR) + return NULL; + PCCOMMAND pCommand = PCCOMMAND(m_cCommandList.GetItemDataPtr(piIndex[0])); + return pCommand; +} + +void CRunMapExpertDlg::OnRemove() +{ + // kill the current command + int iIndex = m_cCommandList.GetCurSel(); + if(iIndex == LB_ERR) + return; + DeleteCommand(iIndex); +} + +void CRunMapExpertDlg::OnUpdateCommand() +{ + if(!m_bNoUpdateCmd) + { + // make sure no special command is contained here .. + // (this is only ever called when the user types + // in the command edit field.) + PCCOMMAND pCommand = GetCommandAtIndex(NULL); + if(pCommand->iSpecialCmd) + { + // clear out command .. set the noupdatecmd + // flag so we don't get into a stack overflow + m_bNoUpdateCmd = TRUE; + m_cCommand.SetWindowText(""); + m_bNoUpdateCmd = FALSE; + pCommand->iSpecialCmd = 0; + } + UpdateCommandWithEditFields(-1); + } +} + +void CRunMapExpertDlg::OnUpdateParameters() +{ + if(!m_bNoUpdateCmd) + UpdateCommandWithEditFields(-1); +} + +void CRunMapExpertDlg::OnEnsurecheck() +{ + if(!m_bNoUpdateCmd) + UpdateCommandWithEditFields(-1); + // enable/disable edit field + m_cEnsureFn.EnableWindow(m_cEnsureCheck.GetCheck()); +} + +void CRunMapExpertDlg::OnUpdateEnsurefn() +{ + if(!m_bNoUpdateCmd) + UpdateCommandWithEditFields(-1); +} + +void CRunMapExpertDlg::OnUseprocesswnd() +{ + // update the command here.. + PCCOMMAND pCommand = GetCommandAtIndex(NULL); + Assert(pCommand); + pCommand->bUseProcessWnd = m_cUseProcessWnd.GetCheck() ? TRUE : FALSE; +} + +void CRunMapExpertDlg::InitSequenceList() +{ + // add all the information from the CHammer object into + // the dialog box .. + CHammer *pApp = (CHammer*) AfxGetApp(); + + m_cCmdSequences.ResetContent(); + + // add the configurations into the list .. + int iSize = pApp->m_CmdSequences.GetSize(); + + if(iSize == 0) + { + // add a default configuration + CCommandSequence *pSeq = new CCommandSequence; + strcpy(pSeq->m_szName, "Default"); + ((CHammer*)AfxGetApp())->m_CmdSequences.Add(pSeq); + iSize = 1; + } + + for(int i = 0; i < iSize; i++) + { + CCommandSequence *pSeq = pApp->m_CmdSequences[i]; + int iIndex = m_cCmdSequences.AddString(pSeq->m_szName); + m_cCmdSequences.SetItemDataPtr(iIndex, PVOID(pSeq)); + } + + m_pActiveSequence = NULL; + m_cCmdSequences.SetCurSel(0); + OnSelchangeConfigurations(); +} + +BOOL CRunMapExpertDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + int iSequence = AfxGetApp()->GetProfileInt("RunMapExpert", + "LastSequence", 0); + + InitSequenceList(); + + m_cCmdSequences.SetCurSel(iSequence); + OnSelchangeConfigurations(); + + return TRUE; +} + +void CRunMapExpertDlg::OnOK() +{ + SaveCommandsToSequence(); + + CHammer *pApp = (CHammer*) AfxGetApp(); + + pApp->SaveSequences(); + + CDialog::OnOK(); +} + +void CRunMapExpertDlg::SaveCommandsToSequence() +{ + if(!m_pActiveSequence) + return; // nothing set yet + + int nCommands = m_cCommandList.GetCount(); + m_pActiveSequence->m_Commands.RemoveAll(); + for(int i = 0; i < nCommands; i++) + { + PCCOMMAND pCommand = PCCOMMAND(m_cCommandList.GetItemDataPtr(i)); + pCommand->bEnable = m_cCommandList.GetCheck(i); + if (!strcmp(pCommand->szRun, "$game_exe")) + pCommand->bNoWait = TRUE; + m_pActiveSequence->m_Commands.Add(*pCommand); + // free the memory: + delete pCommand; + } +} + +void CRunMapExpertDlg::OnSelchangeConfigurations() +{ + // save the current command list back into the previously active + // command sequence + SaveCommandsToSequence(); + + int iSel = m_cCmdSequences.GetCurSel(); + if(iSel == LB_ERR) // nothing there + { + m_pActiveSequence = NULL; + return; + } + + AfxGetApp()->WriteProfileInt("RunMapExpert", "LastSequence", iSel); + + CCommandSequence *pSeq = (CCommandSequence*) + m_cCmdSequences.GetItemDataPtr(iSel); + + // delete strings from listbox (dataptrs already deleted + // in SaveCommandsToSequence()) + m_cCommandList.ResetContent(); + + m_pActiveSequence = pSeq; + + // add the commands from this sequence into the command listbox .. + CCommandArray &Commands = pSeq->m_Commands; + for(int i = 0; i < Commands.GetSize(); i++) + { + PCCOMMAND pCommand = new CCOMMAND(Commands[i]); + AddCommand(i, pCommand); + m_cCommandList.SetCheck(i, pCommand->bEnable); + } + + // set to 0th element in list .. + m_cCommandList.SetCurSel(0); + OnSelchangeCommandlist(); +} + +void CRunMapExpertDlg::OnEditconfigs() +{ + CRunMapCfgDlg dlg; + SaveCommandsToSequence(); + if(dlg.DoModal() == IDOK) + InitSequenceList(); +} + + +void CRunMapExpertDlg::OnCancel() +{ + SaveCommandsToSequence(); + + CHammer *pApp = (CHammer*) AfxGetApp(); + pApp->SaveSequences(); + + CDialog::OnCancel(); +} |