csgo-2018-source/hammer/objectbar.cpp
2021-07-24 21:11:47 -07:00

1044 lines
25 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ====
//
// Purpose:
//
//=============================================================================
#include "stdafx.h"
#include "hammer.h"
#include "ObjectBar.h"
#include "Options.h"
#include "ControlBarIDs.h"
#include "Prefabs.h"
#include "Prefab3D.h"
#include "StockSolids.h"
#include "mainfrm.h"
#include "MapSolid.h"
#include "MapWorld.h"
#include "MapDoc.h"
#include "GlobalFunctions.h"
#include "ArchDlg.h"
#include "TorusDlg.h"
#include "ToolManager.h"
#include "mathlib/vector.h"
#include "mapview2d.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
#pragma warning( disable : 4355 )
CMapClass *CreateArch(BoundBox *pBox, float fStartAngle, int iSides, float fArc,
int iWallWidth, int iAddHeight, BOOL bPreview);
CMapClass *CreateTorus(BoundBox *pBox, float fStartAngle, int iSides, float fArc, int iWallWidth, float flCrossSectionalRadius,
float fRotationStartAngle, int iRotationSides, float fRotationArc, int iAddHeight, BOOL bPreview);
static int _iNewObjIndex = 0;
static char _szNewObjName[128];
struct SolidTypeInfo_t
{
LPCTSTR pszName;
UINT nFaces;
UINT nFacesMin;
UINT nFacesMax;
bool bEnableFaceControl;
};
SolidTypeInfo_t SolidTypes[] =
{
{"block", 0, 6, 6, false},
{"wedge", 0, 5, 5, false},
{"cylinder", 8, 3, 32, true},
{"spike", 4, 3, 32, true},
{"sphere", 8, 3, 16, true},
{"arch", 8, 3, 128, true},
{"torus", 0, 4, 128, false},
};
BEGIN_MESSAGE_MAP(CObjectBar, CHammerBar)
ON_UPDATE_COMMAND_UI(IDC_CREATELIST, UpdateControl)
ON_UPDATE_COMMAND_UI(IDC_CATEGORYLIST, UpdateControl)
ON_UPDATE_COMMAND_UI(IDC_FACES, UpdateFaceControl)
ON_UPDATE_COMMAND_UI(IDC_FACESSPIN, UpdateFaceControl)
ON_UPDATE_COMMAND_UI(ID_TOOLS_CREATEPREFAB, UpdateControl)
ON_UPDATE_COMMAND_UI(ID_CREATEOBJECT, UpdateControl)
ON_CBN_SELCHANGE(IDC_CATEGORYLIST, OnChangeCategory)
END_MESSAGE_MAP()
//-----------------------------------------------------------------------------
// Purpose: Get the index of the specified solid type.
//-----------------------------------------------------------------------------
static int FindSolidType( const char *pName )
{
for ( int i=0; i < ARRAYSIZE( SolidTypes ); i++ )
{
if ( Q_stricmp( pName, SolidTypes[i].pszName ) == 0 )
return i;
}
return -1;
}
//-----------------------------------------------------------------------------
// Purpose: Get the index of the specified GDClass.
//-----------------------------------------------------------------------------
static int FindGameDataClass( const char *pName )
{
extern GameData *pGD;
if( pGD != NULL )
{
int nCount = pGD->GetClassCount();
for (int i = 0; i < nCount; i++)
{
GDclass *pc = pGD->GetClass(i);
if ( Q_stricmp( pName, pc->GetName() ) == 0 )
return i;
}
}
return -1;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CObjectBar::CObjectBar()
: CHammerBar(), m_CreateList( this )
{
for(int i = 0; i < MAX_PREV_SEL; i++)
{
m_PrevSel[i].dwGameID = 0;
}
m_dwPrevGameID = (unsigned long)-1;
}
bool CObjectBar::UseRandomYawOnEntityPlacement()
{
return ::SendMessage( ::GetDlgItem( GetSafeHwnd(), IDC_RANDOMYAW ), BM_GETCHECK, 0, 0 ) == BST_CHECKED;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : pDX -
//-----------------------------------------------------------------------------
void CObjectBar::DoDataExchange(CDataExchange *pDX)
{
CHammerBar::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COP_Entity)
DDX_Control(pDX, IDC_CREATELIST, m_CreateList);
//}}AFX_DATA_MAP
}
//-----------------------------------------------------------------------------
// Purpose: Returns the bounds of the current 3D prefab object.
// Input : *pBox -
// Output : Returns TRUE on success, FALSE on failure.
//-----------------------------------------------------------------------------
BOOL CObjectBar::GetPrefabBounds(BoundBox *pBox)
{
if (ListType != listPrefabs)
{
return FALSE;
}
CPrefab3D *pPrefab = (CPrefab3D *)CPrefab::FindID(_iNewObjIndex);
if (pPrefab != NULL)
{
if (pPrefab->GetType() != pt3D)
{
return(FALSE);
}
if (!pPrefab->IsLoaded())
{
pPrefab->Load();
}
if (!pPrefab->IsLoaded())
{
return(FALSE);
}
CMapWorld *pWorld = pPrefab->GetWorld();
Vector mins;
Vector maxs;
pWorld->GetRender2DBox(mins, maxs);
pBox->SetBounds(mins, maxs);
return(TRUE);
}
return(FALSE);
}
//-----------------------------------------------------------------------------
// Purpose: Find the specified prefab.
//-----------------------------------------------------------------------------
CPrefab* CObjectBar::FindPrefabByName( const char *pName )
{
CPrefabLibrary *pLibrary = CPrefabLibrary::FindID( m_CategoryList.GetItemData(m_CategoryList.GetCurSel() ) );
if ( pLibrary )
{
POSITION p = ENUM_START;
CPrefab *pPrefab = pLibrary->EnumPrefabs( p );
while( pPrefab )
{
if ( Q_stricmp( pName, pPrefab->GetName() ) == 0 )
return pPrefab;
pPrefab = pLibrary->EnumPrefabs( p );
}
}
return NULL;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : pBox -
// pAxes -
// Output :
//-----------------------------------------------------------------------------
CMapClass *CObjectBar::CreateInBox(BoundBox *pBox, CMapView *pView)
{
// primitives:
int axHorz = 0;
int axVert = 1;
CMapView2D *pView2D = dynamic_cast<CMapView2D*>(pView);
if ( pView2D )
{
axHorz = pView2D->axHorz;
axVert = pView2D->axVert;
}
if(ListType == listPrimitives)
{
int nFaces;
char szBuf[128];
m_Faces.GetWindowText(szBuf, 128);
nFaces = atoi(szBuf);
//
// The index into the solid types array is stored in the item data.
//
int nSolidIndex = _iNewObjIndex;
int nFacesMin = SolidTypes[nSolidIndex].nFacesMin;
int nFacesMax = SolidTypes[nSolidIndex].nFacesMax;
//
// Insure that the face count is within legal range (if applicable).
//
if ((SolidTypes[nSolidIndex].bEnableFaceControl) && (nFaces < nFacesMin || nFaces > nFacesMax))
{
CString str;
str.Format("The face count for a %s must be in the range of %d to %d.",
SolidTypes[nSolidIndex].pszName, nFacesMin, nFacesMax);
AfxMessageBox(str);
return NULL;
}
if(nSolidIndex < 5)
{
StockSolid *pStock = NULL;
switch(nSolidIndex)
{
case 0:
pStock = new StockBlock;
break;
case 1:
pStock = new StockWedge;
break;
case 2:
pStock = new StockCylinder;
pStock->SetFieldData(StockCylinder::fieldSideCount, nFaces);
break;
case 3:
pStock = new StockSpike;
pStock->SetFieldData(StockSpike::fieldSideCount, nFaces);
break;
default:
pStock = new StockSphere;
pStock->SetFieldData(StockSphere::fieldSideCount, nFaces);
break;
}
// create a solid
CMapSolid *pSolid = new CMapSolid;
pStock->SetFromBox(pBox);
pStock->CreateMapSolid(pSolid, Options.GetTextureAlignment());
pSolid->SetTexture(GetDefaultTextureName());
delete pStock; // done with you! done!
// return new solid
return pSolid;
}
else if (nSolidIndex == 5)
{
// arch
CArchDlg dlg(pBox->bmins, pBox->bmaxs);
Vector sizebounds;
pBox->GetBoundsSize(sizebounds);
dlg.m_iSides = nFaces;
dlg.SetMaxWallWidth(min((int)sizebounds[axHorz], (int)sizebounds[axVert]));
if(dlg.DoModal() != IDOK)
return NULL;
// save values for next use of arch
dlg.SaveValues();
CMapClass *pArch = CreateArch(pBox, dlg.m_fAngle,
dlg.m_iSides, dlg.m_fArc, dlg.m_iWallWidth,
dlg.m_iAddHeight, FALSE);
const CMapObjectList &SolidList = *pArch->GetChildren();
FOR_EACH_OBJ( SolidList, nSolid )
{
CMapClass *pMapClass = (CUtlReference< CMapClass >)SolidList[nSolid];
CMapSolid *pSolid = dynamic_cast<CMapSolid *>(pMapClass);
if ( pSolid )
pSolid->SetTexture(GetDefaultTextureName());
}
return pArch;
}
else
{
// Torus
CTorusDlg dlg( pBox->bmins, pBox->bmaxs );
Vector sizebounds;
pBox->GetBoundsSize( sizebounds );
dlg.SetMaxWallWidth(min((int)sizebounds[axHorz], (int)sizebounds[axVert]));
if(dlg.DoModal() != IDOK)
return NULL;
// save values for next use of arch
dlg.SaveValues();
CMapClass *pTorus = CreateTorus(pBox, dlg.m_fAngle, dlg.m_iSides, dlg.m_fArc, dlg.m_iWallWidth,
dlg.GetTorusCrossSectionRadius(),
dlg.m_fRotationAngle, dlg.m_iRotationSides, dlg.m_fRotationArc, dlg.m_iAddHeight, FALSE);
const CMapObjectList &SolidList = *pTorus->GetChildren();
FOR_EACH_OBJ( SolidList, nSolid )
{
CMapClass *pMapClass = (CUtlReference< CMapClass >)SolidList[nSolid];
CMapSolid *pSolid = dynamic_cast<CMapSolid *>( pMapClass );
if ( pSolid )
pSolid->SetTexture(GetDefaultTextureName());
}
return pTorus;
}
}
else
{
CPrefab *pPrefab = CPrefab::FindID(_iNewObjIndex);
if (pPrefab != NULL)
{
return(pPrefab->CreateInBox(pBox));
}
}
return NULL;
}
//-----------------------------------------------------------------------------
// Purpose: Returns the classname of the default entity for the entity creation tool.
//-----------------------------------------------------------------------------
LPCTSTR CObjectBar::GetDefaultEntityClass(void)
{
return _szNewObjName;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CMapClass *CObjectBar::BuildPrefabObjectAtPoint( Vector const &HitPos )
{
//
// find prefab
//
CPrefab3D *pPrefab = ( CPrefab3D* )CPrefab::FindID( _iNewObjIndex );
if( !pPrefab )
return NULL;
//
// create prefab bounding box -- centered at hit pos
//
return pPrefab->CreateAtPointAroundOrigin( HitPos );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CObjectBar::IsEntityToolCreatingPrefab( void )
{
if( ( m_iLastTool == TOOL_ENTITY ) && ( m_CategoryList.GetCurSel() != 0 ) )
return true;
return false;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CObjectBar::IsEntityToolCreatingEntity( void )
{
if( ( m_iLastTool == TOOL_ENTITY ) && ( m_CategoryList.GetCurSel() == 0 ) )
return true;
return false;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::OnChangeCategory()
{
switch (ListType)
{
case listPrimitives:
{
iBlockSel = -1;
LoadBlockItems();
break;
}
case listPrefabs:
{
if (m_iLastTool == TOOL_BLOCK)
{
iBlockSel = -1;
LoadBlockItems();
}
else if (m_iLastTool == TOOL_ENTITY)
{
iEntitySel = -1;
LoadEntityItems();
}
break;
}
case listEntities:
{
iEntitySel = -1;
LoadEntityItems();
break;
}
default:
{
break;
}
}
DoHideControls();
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : pParentWnd -
// Output : Returns TRUE on success, FALSE on failure.
//-----------------------------------------------------------------------------
BOOL CObjectBar::Create(CWnd *pParentWnd)
{
if (!CHammerBar::Create(pParentWnd, IDD_OBJECTBAR, CBRS_RIGHT, IDCB_OBJECTBAR))
{
return FALSE;
}
SetWindowText("New Objects");
// set up controls
// We only want it to return values that are in our list of suggestions.
m_CreateList.SubclassDlgItem(IDC_CREATELIST, this);
m_CreateList.SetOnlyProvideSuggestions( true );
m_CategoryList.SubclassDlgItem(IDC_CATEGORYLIST, this);
m_Faces.SubclassDlgItem(IDC_FACES, this);
m_FacesSpin.SubclassDlgItem(IDC_FACESSPIN, this);
m_FacesSpin.SetBuddy(&m_Faces);
iBlockSel = -1;
iEntitySel = -1;
m_iLastTool = -1;
LoadBlockCategories();
// outta here
return TRUE;
}
//-----------------------------------------------------------------------------
// Purpose: Load the category list with the list of primitives and object libraries.
//-----------------------------------------------------------------------------
void CObjectBar::LoadBlockCategories( void )
{
m_CategoryList.SetRedraw(FALSE);
// first item is the primitive list
m_CategoryList.ResetContent();
m_CategoryList.AddString("Primitives");
// the next items are the prefab categories (libraries)
LoadPrefabCategories();
// redraw category list
m_CategoryList.SetRedraw(TRUE);
m_CategoryList.Invalidate();
// set initial state
m_CategoryList.SetCurSel( 0 );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::LoadEntityCategories( void )
{
m_CategoryList.SetRedraw( FALSE );
// first item is the primitive list
m_CategoryList.ResetContent();
m_CategoryList.AddString( "Entities" );
// the next items are the prefab categories (libraries)
LoadPrefabCategories();
// redraw category list
m_CategoryList.SetRedraw( TRUE );
m_CategoryList.Invalidate();
// set initial state
m_CategoryList.SetCurSel( 0 );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::LoadPrefabCategories( void )
{
//
// if a long list -- don't update every time
//
m_CategoryList.SetRedraw( FALSE );
//
// add all prefab object libraries to the category list
//
POSITION p = ENUM_START;
CPrefabLibrary *pLibrary = CPrefabLibrary::EnumLibraries( p );
while( pLibrary )
{
int iIndex = m_CategoryList.AddString( pLibrary->GetName() );
m_CategoryList.SetItemData( iIndex, pLibrary->GetID() );
pLibrary = CPrefabLibrary::EnumLibraries( p );
}
m_CategoryList.SetRedraw(TRUE);
m_CategoryList.Invalidate();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::LoadBlockItems( void )
{
//
// verify the block categories are loaded
//
if( m_CategoryList.GetCurSel() == CB_ERR )
{
LoadBlockCategories();
}
//
// load primitive items
//
if( m_CategoryList.GetCurSel() == 0 )
{
// set list type (primitives)
ListType = listPrimitives;
// set list type (primitives)
CUtlVector<CString> suggestions;
for( int i = 0; i < sizeof( SolidTypes ) / sizeof( SolidTypes[0] ); i++)
suggestions.AddToTail( SolidTypes[i].pszName );
m_CreateList.SetSuggestions( suggestions );
}
else
{
LoadPrefabItems();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::LoadEntityItems( void )
{
//
// verify the block categories are loaded
//
if( m_CategoryList.GetCurSel() == CB_ERR )
{
LoadEntityCategories();
}
//
// load entity items
//
if( m_CategoryList.GetCurSel() == 0 )
{
// set list type (markers)???
ListType = listEntities;
CUtlVector<CString> suggestions;
extern GameData *pGD;
if( pGD != NULL )
{
int nCount = pGD->GetClassCount();
for (int i = 0; i < nCount; i++)
{
GDclass *pc = pGD->GetClass(i);
if( !pc->IsBaseClass() && !pc->IsSolidClass() )
{
suggestions.AddToTail( pc->GetName() );
}
}
}
m_CreateList.SetSuggestions( suggestions );
}
else
{
LoadPrefabItems();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::LoadPrefabItems( void )
{
// set list type (prefabs)
ListType = listPrefabs;
CUtlVector<CString> suggestions;
// get the active library and add the prefabs from it
CPrefabLibrary *pLibrary = CPrefabLibrary::FindID( m_CategoryList.GetItemData(m_CategoryList.GetCurSel() ) );
POSITION p = ENUM_START;
CPrefab *pPrefab = pLibrary->EnumPrefabs( p );
while( pPrefab )
{
suggestions.AddToTail( pPrefab->GetName() );
pPrefab = pLibrary->EnumPrefabs( p );
}
m_CreateList.SetSuggestions( suggestions );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectBar::DoHideControls()
{
// hide controls based on which mode is selected...
if(ListType == listPrimitives)
{
GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_HIDE);
m_Faces.ShowWindow(SW_SHOW);
m_FacesSpin.ShowWindow(SW_SHOW);
GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_SHOW);
}
else if(ListType == listPrefabs)
{
m_Faces.ShowWindow(SW_HIDE);
m_FacesSpin.ShowWindow(SW_HIDE);
GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_HIDE);
GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_SHOW);
}
else if(ListType == listEntities)
{
m_Faces.ShowWindow(SW_HIDE);
m_FacesSpin.ShowWindow(SW_HIDE);
GetDlgItem(IDC_FACESPROMPT)->ShowWindow(SW_HIDE);
GetDlgItem(ID_INSERTPREFAB_ORIGINAL)->ShowWindow(SW_HIDE);
}
// Show the "random yaw" button?
bool bShow = (ListType == listEntities);
GetDlgItem( IDC_RANDOMYAW )->ShowWindow( bShow ? SW_SHOW : SW_HIDE );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *pCmdUI -
//-----------------------------------------------------------------------------
void CObjectBar::UpdateControl(CCmdUI *pCmdUI)
{
CMapDoc *pDoc = CMapDoc::GetActiveMapDoc();
switch (pCmdUI->m_nID)
{
case ID_INSERTPREFAB_ORIGINAL:
{
pCmdUI->Enable(ListType == listPrefabs);
break;
}
case IDC_CREATELIST:
case IDC_CATEGORYLIST:
{
BOOL bEnable = FALSE;
if (pDoc)
{
int nTool = pDoc->GetTools()->GetActiveToolID();
if ((nTool == TOOL_ENTITY) || (nTool == TOOL_BLOCK))
{
bEnable = TRUE;
}
}
pCmdUI->Enable(bEnable);
break;
}
default:
{
pCmdUI->Enable( pDoc ? TRUE : FALSE);
break;
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *pWnd -
// bModifyWnd -
// Output : Returns TRUE on success, FALSE on failure.
//-----------------------------------------------------------------------------
BOOL CObjectBar::EnableFaceControl(CWnd *pWnd, BOOL bModifyWnd)
{
BOOL bEnable = CMapDoc::GetActiveMapDoc() ? TRUE : FALSE;
if(bEnable)
{
bEnable = FALSE;
//
// Enable the control only if we are dealing with an object the
// that has adjustable faces.
//
if (ListType == listPrimitives)
{
int nSolidIndex = iBlockSel;
if (SolidTypes[nSolidIndex].bEnableFaceControl)
{
bEnable = TRUE;
}
}
}
if(bModifyWnd)
pWnd->EnableWindow(bEnable);
return bEnable;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *pCmdUI -
//-----------------------------------------------------------------------------
void CObjectBar::UpdateFaceControl(CCmdUI *pCmdUI)
{
pCmdUI->Enable(EnableFaceControl(GetDlgItem(pCmdUI->m_nID), FALSE));
}
//-----------------------------------------------------------------------------
// Purpose: Called when a new item has been selected in the combo box.
//-----------------------------------------------------------------------------
void CObjectBar::OnTextChanged( const char *pSelection )
{
char szBuf[128];
switch (ListType)
{
case listPrimitives:
{
_iNewObjIndex = FindSolidType( pSelection );
Assert( _iNewObjIndex != -1 );
//
// Save current value from the faces edit control. The next time this primitive is
// selected the value will be restored.
//
if (iBlockSel != -1)
{
int nSolidIndex = iBlockSel;
m_Faces.GetWindowText(szBuf, 128);
SolidTypes[nSolidIndex].nFaces = atoi(szBuf);
}
iBlockSel = _iNewObjIndex;
break;
}
case listPrefabs:
{
CPrefab *pPrefab = FindPrefabByName( pSelection );
Assert( pPrefab );
if ( pPrefab )
{
_iNewObjIndex = pPrefab->GetID();
if (m_iLastTool == TOOL_BLOCK )
{
iBlockSel = _iNewObjIndex;
}
else if( m_iLastTool == TOOL_ENTITY )
{
iEntitySel = _iNewObjIndex;
}
}
break;
}
case listEntities:
{
_iNewObjIndex = FindGameDataClass( pSelection );
Assert( _iNewObjIndex != -1 );
if ( _iNewObjIndex != -1 )
{
Q_strncpy( _szNewObjName, pSelection, sizeof( _szNewObjName ) );
}
break;
}
}
if (ListType != listPrimitives)
return;
EnableFaceControl(&m_Faces, TRUE);
EnableFaceControl(&m_FacesSpin, TRUE);
int nSolidIndex = _iNewObjIndex;
m_FacesSpin.SetRange(SolidTypes[nSolidIndex].nFacesMin, SolidTypes[nSolidIndex].nFacesMax);
m_FacesSpin.SetPos(SolidTypes[nSolidIndex].nFaces);
itoa(SolidTypes[nSolidIndex].nFaces, szBuf, 10);
m_Faces.SetWindowText(szBuf);
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : dwGameID -
// piNewIndex -
// Output :
//-----------------------------------------------------------------------------
int CObjectBar::GetPrevSelIndex(DWORD dwGameID, int *piNewIndex)
{
for(int i = 0; i < MAX_PREV_SEL; i++)
{
if(m_PrevSel[i].dwGameID == 0 && piNewIndex)
*piNewIndex = i;
if(m_PrevSel[i].dwGameID == dwGameID)
return i;
}
return -1;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : pMsg -
// Output : Returns TRUE on success, FALSE on failure.
//-----------------------------------------------------------------------------
BOOL CObjectBar::PreTranslateMessage(MSG* pMsg)
{
//
// See if the message is a keydown and the current focus window is the
// ComboBox in the ObjectBar!
//
/*static BOOL bRecurse = FALSE;
if (pMsg->message == WM_KEYDOWN && !bRecurse)
{
if (GetFocus() == &m_CreateList)
{
//AfxMessageBox("Ok");
bRecurse = TRUE;
m_CreateList.SendMessage(WM_CHAR, pMsg->wParam, pMsg->lParam);
bRecurse = FALSE;
return TRUE;
}
}
*/
return CHammerBar::PreTranslateMessage(pMsg);
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : iTool -
//-----------------------------------------------------------------------------
void CObjectBar::UpdateListForTool( int iTool )
{
//
// initialize for new "game config"
//
int iPrevSel = 0;
if (m_dwPrevGameID != g_pGameConfig->dwID)
{
//
// save current game id and save
//
m_dwPrevGameID = g_pGameConfig->dwID;
GetPrevSelIndex( g_pGameConfig->dwID, &iPrevSel );
m_PrevSel[iPrevSel].dwGameID = g_pGameConfig->dwID;
m_PrevSel[iPrevSel].block.strCategory = "Primitives";
m_PrevSel[iPrevSel].block.strItem = "block";
m_PrevSel[iPrevSel].entity.strCategory = "Entities";
m_PrevSel[iPrevSel].entity.strItem = g_pGameConfig->szDefaultPoint;
}
// get game id previously selected data index
iPrevSel = GetPrevSelIndex( m_dwPrevGameID );
if (iPrevSel == -1)
return;
//
// Save last known selection state for previous tool
//
if (m_iLastTool == TOOL_BLOCK)
{
int iCategory = m_CategoryList.GetCurSel();
if( iCategory != -1 )
{
m_CategoryList.GetLBText( iCategory, m_PrevSel[iPrevSel].block.strCategory );
m_PrevSel[iPrevSel].block.strItem = m_CreateList.GetCurrentItem();
}
else
{
m_PrevSel[iPrevSel].block.strCategory = "";
m_PrevSel[iPrevSel].block.strItem = "";
}
}
else if (m_iLastTool == TOOL_ENTITY)
{
int iCategory = m_CategoryList.GetCurSel();
if( iCategory != -1 )
{
m_CategoryList.GetLBText( iCategory, m_PrevSel[iPrevSel].entity.strCategory );
m_PrevSel[iPrevSel].entity.strItem = m_CreateList.GetCurrentItem();
}
else
{
m_PrevSel[iPrevSel].entity.strCategory = "";
m_PrevSel[iPrevSel].entity.strItem = "";
}
}
// save tool for next pass
m_iLastTool = iTool;
//
// update new for new tool
//
if (iTool == TOOL_BLOCK)
{
//
// load block categories and items
//
LoadBlockCategories();
m_CategoryList.SelectString( -1, m_PrevSel[iPrevSel].block.strCategory );
LoadBlockItems();
m_CreateList.SelectItem( m_PrevSel[iPrevSel].block.strItem );
OnTextChanged( m_PrevSel[iPrevSel].block.strItem );
iBlockSel = FindSolidType( m_PrevSel[iPrevSel].block.strItem );
Assert( iBlockSel >= 0 );
// hide/show appropriate controls
DoHideControls();
//
// enable/disable face controls
//
EnableFaceControl( &m_Faces, TRUE );
EnableFaceControl( &m_FacesSpin, TRUE );
}
else if (iTool == TOOL_ENTITY)
{
//
// load entity categories and items
//
LoadEntityCategories();
m_CategoryList.SelectString( -1, m_PrevSel[iPrevSel].entity.strCategory );
LoadEntityItems();
m_CreateList.SelectItem( m_PrevSel[iPrevSel].entity.strItem );
OnTextChanged( m_PrevSel[iPrevSel].entity.strItem );
iEntitySel = FindGameDataClass( m_PrevSel[iPrevSel].entity.strItem );
// hide/show appropriate controls
DoHideControls();
//
// enable/disable face controls
//
EnableFaceControl( &m_Faces, TRUE );
EnableFaceControl( &m_FacesSpin, TRUE );
}
else
{
m_CategoryList.ResetContent();
m_CreateList.Clear();
DoHideControls();
}
}