209 lines
5.7 KiB
C++
209 lines
5.7 KiB
C++
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Engine Source File.
|
|
// Copyright (C), Crytek Studios, 2001-2004.
|
|
// -------------------------------------------------------------------------
|
|
// File name: PrefabPanel.cpp
|
|
// Version: v1.00
|
|
// Created: 14/11/2003 by Timur.
|
|
// Compilers: Visual Studio.NET 2003
|
|
// Description:
|
|
// -------------------------------------------------------------------------
|
|
// History:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "StdAfx.h"
|
|
#include "PrefabPanel.h"
|
|
|
|
#include "Objects\ObjectManager.h"
|
|
#include "Objects\PrefabObject.h"
|
|
#include "Prefabs\PrefabItem.h"
|
|
|
|
IMPLEMENT_DYNCREATE(CPrefabPanel, CXTResizeDialog)
|
|
|
|
CPrefabPanel::CPrefabPanel(CWnd* pParent /*=NULL*/)
|
|
: CXTResizeDialog(CPrefabPanel::IDD, pParent)
|
|
, m_type(0)
|
|
{
|
|
m_object = 0;
|
|
Create( IDD,pParent );
|
|
}
|
|
|
|
CPrefabPanel::~CPrefabPanel()
|
|
{
|
|
}
|
|
|
|
void CPrefabPanel::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CXTResizeDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_EXTRACT_SELECTED, m_extractSelectedBtn);
|
|
DDX_Control(pDX, IDC_EXTRACT_ALL, m_extractAllBtn);
|
|
DDX_Control(pDX, IDC_PREFAB, m_prefabNameBtn);
|
|
DDX_Control(pDX, IDC_OBJECTS, m_tree );
|
|
DDX_Control(pDX, IDC_NUM_OBJECTS, m_objectsText );
|
|
}
|
|
|
|
BOOL CPrefabPanel::OnInitDialog()
|
|
{
|
|
CXTResizeDialog::OnInitDialog();
|
|
|
|
SetResize( IDC_OBJECTS,SZ_RESIZE(1) );
|
|
SetResize( IDC_NUM_OBJECTS,SZ_RESIZE(1) );
|
|
SetResize( IDC_OBJECT_INFO,SZ_RESIZE(1) );
|
|
SetResize( IDC_PREFAB,SZ_RESIZE(1) );
|
|
|
|
SetResize( IDC_NAME,SZ_RESIZE(1) );
|
|
SetResize( IDC_CLASS,SZ_RESIZE(1) );
|
|
SetResize( IDC_TYPE,SZ_RESIZE(1) );
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
BEGIN_MESSAGE_MAP(CPrefabPanel, CXTResizeDialog)
|
|
ON_BN_CLICKED(IDC_EXTRACT_SELECTED, OnBnClickedExtractSelected)
|
|
ON_BN_CLICKED(IDC_EXTRACT_ALL, OnBnClickedExtractAll)
|
|
ON_BN_CLICKED(IDC_PREFAB, OnBnClickedPrefab)
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_OBJECTS, OnSelChangedTree)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::SetObject( CPrefabObject *object )
|
|
{
|
|
assert( object );
|
|
m_object = object;
|
|
UpdateData(FALSE);
|
|
|
|
ReloadObjects();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
inline void RecursivelyGetAllChilds( CBaseObject *obj,std::vector<CBaseObject*> &childs )
|
|
{
|
|
for (int i = 0; i < obj->GetChildCount(); i++)
|
|
{
|
|
CBaseObject *c = obj->GetChild(i);
|
|
childs.push_back(c);
|
|
RecursivelyGetAllChilds( c,childs );
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
static HTREEITEM AddPrefabTreeItem( CTreeCtrl &tree,CBaseObject *pObject,CBaseObject *pTopParent,std::map<CBaseObject*,HTREEITEM> &itemsMap )
|
|
{
|
|
HTREEITEM hParent = TVI_ROOT;
|
|
|
|
CBaseObject *pParent = pObject->GetParent();
|
|
if (pParent && pParent != pTopParent)
|
|
{
|
|
hParent = stl::find_in_map( itemsMap,pParent, (HTREEITEM)0 );
|
|
if (!hParent)
|
|
{
|
|
hParent = AddPrefabTreeItem( tree,pParent,pTopParent,itemsMap );
|
|
}
|
|
}
|
|
CString str;
|
|
//str = CString(pObject->GetName()) + " (" + pObject->GetTypeDescription() + ")";
|
|
str = (pObject->GetName()) + " (" + pObject->GetClassDesc()->ClassName() + ")";
|
|
HTREEITEM hItem = tree.InsertItem( str,hParent );
|
|
itemsMap[pObject] = hItem;
|
|
tree.SetItemData( hItem,(DWORD_PTR)pObject );
|
|
tree.Expand( hItem,TVE_EXPAND );
|
|
return hItem;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::ReloadObjects()
|
|
{
|
|
m_tree.SetRedraw(FALSE);
|
|
m_tree.DeleteAllItems();
|
|
|
|
std::vector<CBaseObject*> childs;
|
|
childs.reserve(20);
|
|
RecursivelyGetAllChilds( m_object,childs );
|
|
|
|
// items map
|
|
std::map<CBaseObject*,HTREEITEM> itemsMap;
|
|
|
|
// Fill tree with objects.
|
|
for (int i = 0; i < childs.size(); i++)
|
|
{
|
|
if (childs[i]->CheckFlags(OBJFLAG_PREFAB))
|
|
AddPrefabTreeItem( m_tree,childs[i],m_object,itemsMap );
|
|
}
|
|
m_tree.Expand( TVI_ROOT,TVE_EXPAND );
|
|
m_tree.SetRedraw(TRUE);
|
|
|
|
CString text;
|
|
int numChilds = childs.size();
|
|
text.Format( "%d Object(s):",numChilds );
|
|
|
|
//SetDlgItemText( IDC_NAME,SZ_RESIZE(1) );
|
|
//SetResize( IDC_CLASS,SZ_RESIZE(1) );
|
|
//SetResize( IDC_TYPE,SZ_RESIZE(1) );
|
|
|
|
m_objectsText.SetWindowText( text );
|
|
CPrefabItem *pItem = m_object->GetPrefab();
|
|
if (pItem)
|
|
{
|
|
m_prefabNameBtn.SetWindowText( pItem->GetFullName() );
|
|
}
|
|
else
|
|
{
|
|
m_prefabNameBtn.SetWindowText( "None" );
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::OnSelChangedTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
|
|
HTREEITEM selectedItem = pNMTreeView->itemNew.hItem;
|
|
if (selectedItem && m_object != 0)
|
|
{
|
|
CBaseObject *pObject = (CBaseObject*)m_tree.GetItemData(selectedItem);
|
|
if (pObject)
|
|
{
|
|
SetDlgItemText( IDC_NAME,pObject->GetName() );
|
|
SetDlgItemText( IDC_CLASS,pObject->GetClassDesc()->ClassName() );
|
|
SetDlgItemText( IDC_TYPE,pObject->GetTypeDescription() );
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::OnBnClickedExtractSelected()
|
|
{
|
|
if (m_object)
|
|
{
|
|
HTREEITEM hItem = m_tree.GetSelectedItem();
|
|
if (hItem)
|
|
{
|
|
CBaseObject *pObj = (CBaseObject*)m_tree.GetItemData( hItem );
|
|
if (pObj)
|
|
{
|
|
// Extract selected object.
|
|
m_object->ExtractObject(pObj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::OnBnClickedExtractAll()
|
|
{
|
|
if (m_object)
|
|
m_object->ExtractAll();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CPrefabPanel::OnBnClickedPrefab()
|
|
{
|
|
if (m_object)
|
|
{
|
|
GetIEditor()->OpenDataBaseLibrary( EDB_PREFAB_LIBRARY,m_object->GetPrefab() );
|
|
}
|
|
} |