218 lines
4.9 KiB
C++
218 lines
4.9 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
// EditGameConfigs.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "hammer.h"
|
||
|
#include "EditGameConfigs.h"
|
||
|
#include "StrDlg.h"
|
||
|
#include "MapDoc.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include <tier0/memdbgon.h>
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditGameConfigs dialog
|
||
|
|
||
|
|
||
|
CEditGameConfigs::CEditGameConfigs(BOOL bSelectOnly,
|
||
|
CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CEditGameConfigs::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CEditGameConfigs)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_bSelectOnly = bSelectOnly;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CEditGameConfigs::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CEditGameConfigs)
|
||
|
DDX_Control(pDX, IDC_CONFIGS, m_cConfigs);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CEditGameConfigs, CDialog)
|
||
|
//{{AFX_MSG_MAP(CEditGameConfigs)
|
||
|
ON_BN_CLICKED(IDC_ADD, OnAdd)
|
||
|
ON_BN_CLICKED(IDC_COPY, OnCopy)
|
||
|
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
|
||
|
ON_LBN_SELCHANGE(IDC_CONFIGS, OnSelchangeConfigs)
|
||
|
ON_LBN_DBLCLK(IDC_CONFIGS, OnDblclkConfigs)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditGameConfigs message handlers
|
||
|
|
||
|
void CEditGameConfigs::OnAdd()
|
||
|
{
|
||
|
char szName[128];
|
||
|
szName[0] = 0;
|
||
|
CStrDlg dlg(0, szName, "Enter the game's name:", "Add a game");
|
||
|
if(dlg.DoModal() != IDOK)
|
||
|
return;
|
||
|
|
||
|
// add a new game config
|
||
|
CGameConfig *pConfig = Options.configs.AddConfig();
|
||
|
strcpy(pConfig->szName, dlg.m_string);
|
||
|
|
||
|
FillConfigList(pConfig->dwID);
|
||
|
}
|
||
|
|
||
|
void CEditGameConfigs::OnCopy()
|
||
|
{
|
||
|
int iCurSel = m_cConfigs.GetCurSel();
|
||
|
if(iCurSel == CB_ERR)
|
||
|
return;
|
||
|
|
||
|
CGameConfig *pConfig = Options.configs.FindConfig(
|
||
|
m_cConfigs.GetItemData(iCurSel));
|
||
|
|
||
|
CGameConfig *pNewConfig = Options.configs.AddConfig();
|
||
|
pNewConfig->CopyFrom(pConfig);
|
||
|
|
||
|
FillConfigList(pNewConfig->dwID);
|
||
|
}
|
||
|
|
||
|
void CEditGameConfigs::OnRemove()
|
||
|
{
|
||
|
int iCurSel = m_cConfigs.GetCurSel();
|
||
|
if(iCurSel == CB_ERR)
|
||
|
return;
|
||
|
|
||
|
int iArrayIndex;
|
||
|
CGameConfig *pConfig = Options.configs.FindConfig(
|
||
|
m_cConfigs.GetItemData(iCurSel), &iArrayIndex);
|
||
|
|
||
|
// check to see if any docs use this game - if so, can't
|
||
|
// delete it.
|
||
|
for ( int i=0; i<CMapDoc::GetDocumentCount(); i++ )
|
||
|
{
|
||
|
CMapDoc *pDoc = CMapDoc::GetDocument(i);
|
||
|
if(pDoc->GetGame() == pConfig)
|
||
|
{
|
||
|
AfxMessageBox("You can't delete this game configuration now\n"
|
||
|
"because some loaded documents are using it.\n"
|
||
|
"If you want to delete it, you must close those\n"
|
||
|
"documents first.");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool bResetDefaults = false;
|
||
|
|
||
|
// Check to see if this is the last configuation and prompt for the user to make a decision
|
||
|
if ( Options.configs.nConfigs <= 1 )
|
||
|
{
|
||
|
if ( AfxMessageBox( "At least one configuration must be present!\n"
|
||
|
"Would you like to reset to the default configurations?", MB_YESNO ) == IDNO )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bResetDefaults = true;
|
||
|
}
|
||
|
|
||
|
// Remove selection
|
||
|
m_cConfigs.DeleteString( iCurSel );
|
||
|
|
||
|
// FIXME: This will apply the change even if you cancel the dialog. This needs to store a copy
|
||
|
// of the data which then reconciles the two versions on OK or Apply! -- jdw
|
||
|
|
||
|
Options.configs.Configs.RemoveAt(iArrayIndex);
|
||
|
Options.configs.nConfigs--;
|
||
|
|
||
|
// Reset to defaults
|
||
|
if ( bResetDefaults )
|
||
|
{
|
||
|
Options.configs.ResetGameConfigs( false );
|
||
|
FillConfigList();
|
||
|
}
|
||
|
|
||
|
// Put the selection back to the top
|
||
|
m_cConfigs.SetCurSel( 0 );
|
||
|
}
|
||
|
|
||
|
void CEditGameConfigs::FillConfigList(DWORD dwSelectID)
|
||
|
{
|
||
|
// get current selection so we can keep it
|
||
|
DWORD dwCurID = dwSelectID;
|
||
|
int iNewIndex = -1;
|
||
|
|
||
|
if(m_cConfigs.GetCurSel() != LB_ERR && dwCurID == 0xFFFFFFFF)
|
||
|
{
|
||
|
dwCurID = m_cConfigs.GetItemData(m_cConfigs.GetCurSel());
|
||
|
}
|
||
|
|
||
|
m_cConfigs.ResetContent();
|
||
|
|
||
|
for(int i = 0; i < Options.configs.nConfigs; i++)
|
||
|
{
|
||
|
CGameConfig *pConfig = Options.configs.Configs[i];
|
||
|
int iIndex = m_cConfigs.AddString(pConfig->szName);
|
||
|
m_cConfigs.SetItemData(iIndex, pConfig->dwID);
|
||
|
|
||
|
if (dwCurID == pConfig->dwID)
|
||
|
{
|
||
|
iNewIndex = iIndex;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (iNewIndex == -1)
|
||
|
{
|
||
|
iNewIndex = 0;
|
||
|
}
|
||
|
m_cConfigs.SetCurSel(iNewIndex);
|
||
|
|
||
|
OnSelchangeConfigs();
|
||
|
|
||
|
if (m_bSelectOnly && Options.configs.nConfigs == 1)
|
||
|
OnOK();
|
||
|
}
|
||
|
|
||
|
void CEditGameConfigs::OnSelchangeConfigs()
|
||
|
{
|
||
|
int iCurSel = m_cConfigs.GetCurSel();
|
||
|
if(iCurSel == LB_ERR)
|
||
|
return;
|
||
|
|
||
|
m_pSelectedGame = Options.configs.FindConfig(
|
||
|
m_cConfigs.GetItemData(iCurSel));
|
||
|
}
|
||
|
|
||
|
BOOL CEditGameConfigs::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
if(m_bSelectOnly)
|
||
|
{
|
||
|
SetWindowText("Select a game configuration to use");
|
||
|
|
||
|
GetDlgItem(IDOK)->SetWindowText("OK");
|
||
|
GetDlgItem(IDC_REMOVE)->ShowWindow(SW_HIDE);
|
||
|
GetDlgItem(IDC_ADD)->ShowWindow(SW_HIDE);
|
||
|
GetDlgItem(IDC_COPY)->ShowWindow(SW_HIDE);
|
||
|
}
|
||
|
|
||
|
FillConfigList();
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CEditGameConfigs::OnDblclkConfigs()
|
||
|
{
|
||
|
OnOK();
|
||
|
|
||
|
}
|