Files
FC1/Editor/ObjectBrowserDialog.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

216 lines
5.4 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: objectbrowserdialog.cpp
// Version: v1.00
// Created: 27/9/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ObjectBrowserDialog.h"
#include "Objects\ObjectManager.h"
#define IMAGE_INDEX_LAYER 0
#define IMAGE_INDEX_TYPE 1
#define IMAGE_INDEX_OBJECT 2
// CObjectBrowserDialog dialog
IMPLEMENT_DYNAMIC(CObjectBrowserDialog, CDialog)
CObjectBrowserDialog::CObjectBrowserDialog(CWnd* pParent /*=NULL*/)
: CDialog(CObjectBrowserDialog::IDD, pParent)
{
m_font.CreateFont( 14, 0, 0, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
}
CObjectBrowserDialog::~CObjectBrowserDialog()
{
m_font.DeleteObject();
}
void CObjectBrowserDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_OBJECTS, m_tree);
}
BEGIN_MESSAGE_MAP(CObjectBrowserDialog, CDialog)
ON_WM_SIZE()
END_MESSAGE_MAP()
// CObjectBrowserDialog message handlers
BOOL CObjectBrowserDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_imageList.Create( MAKEINTRESOURCE(IDB_OBJECTS_BROWSER),16,1,RGB(255,255,255) );
m_tree.SetMultiSelect( true );
m_tree.SetImageList( &m_imageList,TVSIL_NORMAL );
m_tree.SetFont( &m_font );
CRect rc;
GetClientRect( rc );
rc.DeflateRect( 6,6,6,6 );
m_tree.MoveWindow( rc );
ReloadObjects();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//////////////////////////////////////////////////////////////////////////
void CObjectBrowserDialog::ReloadObjects()
{
//m_tree.DeleteAllItems();
m_layersMap.clear();
m_itemsMap.clear();
m_objectsMap.clear();
IObjectManager *pObjManager = GetIEditor()->GetObjectManager();
int i;
std::vector<CBaseObject*> objects;
std::vector<CObjectLayer*> layers;
pObjManager->GetObjects( objects );
pObjManager->GetLayersManager()->GetLayers( layers );
// Add Object Layers to Tree.
for (i = 0; i < layers.size(); i++)
{
CObjectLayer *pLayer = layers[i];
HTREEITEM hItem = m_tree.InsertItem( pLayer->GetName(),IMAGE_INDEX_LAYER,IMAGE_INDEX_LAYER,TVI_ROOT,TVI_SORT );
m_tree.SetItemState( hItem,TVIS_BOLD,TVIS_BOLD );
LayerItem li;
li.hItem = hItem;
li.objectCount = 0;
m_layersMap[pLayer] = li;
Item item(ITEM_LAYER);
item.layer = pLayer;
m_itemsMap[hItem] = item;
}
LayerItem defLayerItem;
defLayerItem.hItem = 0;
// Add Objects to Tree.
for (i = 0; i < objects.size(); i++)
{
CBaseObject *pObject = objects[i];
if (!pObject->GetParent())
AddObject( pObject,0 );
}
// Change Layers text.
{
for (LayersMap::iterator it = m_layersMap.begin(); it != m_layersMap.end(); ++it)
{
CObjectLayer *pLayer = it->first;
LayerItem &layerItem = it->second;
CString layerName;
layerName.Format( "%s (%d)",(const char*)pLayer->GetName(),layerItem.objectCount );
m_tree.SetItemText( layerItem.hItem,layerName );
// Change types text.
for (std::map<CString,TypeItem>::iterator tit = layerItem.typeMap.begin(); tit != layerItem.typeMap.end(); ++tit)
{
TypeItem &typeItem = tit->second;
CString typeName;
typeName.Format( "%s (%d)",(const char*)tit->first,typeItem.objectCount );
m_tree.SetItemText( typeItem.hItem,typeName );
}
}
}
}
//////////////////////////////////////////////////////////////////////////
void CObjectBrowserDialog::AddObject( CBaseObject *pObject,CBaseObject *pParent )
{
CObjectLayer *pLayer = pObject->GetLayer();
LayersMap::iterator it = m_layersMap.find(pLayer);
assert( it != m_layersMap.end() );
LayerItem &layerItem = it->second;
layerItem.objectCount++;
HTREEITEM hParentItem = 0;
if (!pParent)
{
TypeItem ti;
ZeroStruct(ti);
CString typeName = pObject->GetTypeDescription();
TypeItem &typeItem = stl::find_in_map_ref( layerItem.typeMap,typeName,ti );
if (!typeItem.hItem)
{
// Add new Type item.
HTREEITEM hItem = m_tree.InsertItem( typeName,IMAGE_INDEX_TYPE,IMAGE_INDEX_TYPE,layerItem.hItem,TVI_SORT );
typeItem.hItem = hItem;
typeItem.objectCount = 1;
layerItem.typeMap[typeName] = typeItem;
Item item(ITEM_TYPE);
item.typeName = typeName;
m_itemsMap[hParentItem] = item;
}
else
{
// Type item found.
typeItem.objectCount++;
}
hParentItem = typeItem.hItem;
}
else
{
// Count number of objects in layer (
hParentItem = stl::find_in_map( m_objectsMap,pParent,(HTREEITEM)0 );
}
HTREEITEM hItem = m_tree.InsertItem( pObject->GetName(),IMAGE_INDEX_OBJECT,IMAGE_INDEX_OBJECT,hParentItem,TVI_SORT );
m_objectsMap[pObject] = hItem;
Item item(ITEM_OBJECT);
item.object = pObject;
m_itemsMap[hItem] = item;
// Add all childs.
int numChilds = pObject->GetChildCount();
for (int i = 0; i < numChilds; i++)
{
AddObject( pObject->GetChild(i),pObject );
}
}
//////////////////////////////////////////////////////////////////////////
void CObjectBrowserDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_tree.m_hWnd)
{
CRect rc;
GetClientRect( rc );
rc.DeflateRect( 6,6,6,6 );
m_tree.MoveWindow( rc );
}
}