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

745 lines
20 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: entityprotlibdialog.cpp
// Version: v1.00
// Created: 22/1/2003 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "EntityProtLibDialog.h"
#include "Objects\EntityScript.h"
#include "Objects\ObjectManager.h"
#include "Objects\ProtEntityObject.h"
#include "StringDlg.h"
#include "EntityPrototypeManager.h"
#include "EntityPrototypeLibrary.h"
#include "EntityPrototype.h"
#include "SelectEntityClsDialog.h"
#include "Clipboard.h"
#include "ViewManager.h"
#include <IEntitySystem.h>
#include <EntityDesc.h>
#define IDC_PROTOTYPES_TREE AFX_IDW_PANE_FIRST
IMPLEMENT_DYNAMIC(CEntityProtLibDialog,CBaseLibraryDialog);
//////////////////////////////////////////////////////////////////////////
// CEntityProtLibDialog implementation.
//////////////////////////////////////////////////////////////////////////
CEntityProtLibDialog::CEntityProtLibDialog( CWnd *pParent )
: CBaseLibraryDialog(IDD_DB_ENTITY, pParent)
{
m_entity = 0;
m_pEntityManager = GetIEditor()->GetEntityProtManager();
m_pItemManager = m_pEntityManager;
m_bEntityPlaying = false;
m_bShowDescription = false;
// Immidiatly create dialog.
Create( IDD_DB_ENTITY,pParent );
}
CEntityProtLibDialog::~CEntityProtLibDialog()
{
}
void CEntityProtLibDialog::DoDataExchange(CDataExchange* pDX)
{
CBaseLibraryDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CEntityProtLibDialog, CBaseLibraryDialog)
ON_COMMAND( ID_DB_ADD,OnAddPrototype )
ON_COMMAND( ID_DB_SAVE,OnSave )
ON_COMMAND( ID_DB_PLAY,OnPlay )
ON_COMMAND( ID_DB_LOADLIB,OnLoadLibrary )
ON_COMMAND( ID_DB_RELOAD,OnReloadEntityScript )
ON_COMMAND( ID_DB_DESCRIPTION,OnShowDescription )
ON_UPDATE_COMMAND_UI( ID_DB_PLAY,OnUpdatePlay )
ON_COMMAND( ID_DB_ASSIGNTOSELECTION,OnAssignToSelection )
ON_UPDATE_COMMAND_UI( ID_DB_ASSIGNTOSELECTION,OnUpdateSelected )
//ON_EN_CHANGE( IDC_DESCRIPTION,OnDescriptionChange )
ON_EN_CHANGE( AFX_IDW_PANE_FIRST+1,OnDescriptionChange ) // Second plane
ON_COMMAND( ID_DB_SELECTASSIGNEDOBJECTS,OnSelectAssignedObjects )
ON_UPDATE_COMMAND_UI( ID_DB_SELECTASSIGNEDOBJECTS,OnUpdateSelected )
ON_NOTIFY(TVN_BEGINDRAG, IDC_PROTOTYPES_TREE, OnBeginDrag)
ON_NOTIFY(NM_RCLICK , IDC_PROTOTYPES_TREE, OnNotifyTreeRClick)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_WM_DESTROY()
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnDestroy()
{
CBaseLibraryDialog::OnDestroy();
}
// CTVSelectKeyDialog message handlers
BOOL CEntityProtLibDialog::OnInitDialog()
{
CBaseLibraryDialog::OnInitDialog();
m_pEntitySystem = GetIEditor()->GetSystem()->GetIEntitySystem();
InitToolbar();
CRect rc;
GetClientRect(rc);
//int h2 = rc.Height()/2;
int h2 = 300;
m_wndVSplitter.CreateStatic( this,1,2,WS_CHILD|WS_VISIBLE );
m_wndHSplitter.CreateStatic( &m_wndVSplitter,2,1,WS_CHILD|WS_VISIBLE );
m_wndScriptPreviewSplitter.CreateStatic( &m_wndHSplitter,1,2,WS_CHILD|WS_VISIBLE );
//m_imageList.Create(IDB_MATERIAL_TREE, 16, 1, RGB (255, 0, 255));
CMFCUtils::LoadTrueColorImageList( m_imageList,IDB_ENTITY_TREE,16,RGB(255,0,255) );
// Attach it to the control
m_treeCtrl.SetParent( &m_wndVSplitter );
m_treeCtrl.SetImageList(&m_imageList,TVSIL_NORMAL);
CRect scriptDlgRc;
m_scriptDialog.Create( CEntityScriptDialog::IDD,&m_wndScriptPreviewSplitter );
m_scriptDialog.ShowWindow( SW_SHOW );
m_scriptDialog.GetClientRect( scriptDlgRc );
m_scriptDialog.SetOnReloadScript( functor(*this,&CEntityProtLibDialog::OnReloadEntityScript) );
m_previewCtrl.Create( &m_wndScriptPreviewSplitter,rc,WS_CHILD|WS_VISIBLE );
//m_previewCtrl.Create( WS_VISIBLE|WS_CHILD,rc,&m_wndHSplitter,1 );
m_propsCtrl.Create( WS_VISIBLE|WS_CHILD|WS_BORDER,rc,&m_wndHSplitter,2 );
m_descriptionEditBox.InitOnCreate(true);
m_descriptionEditBox.Create( ES_MULTILINE|ES_WANTRETURN|WS_CHILD|WS_TABSTOP,rc,this,IDC_DESCRIPTION );
m_descriptionEditBox.ShowWindow( SW_HIDE );
m_wndScriptPreviewSplitter.SetPane( 0,0,&m_scriptDialog,CSize(scriptDlgRc.Width()+4,scriptDlgRc.Height()+4) );
//m_wndScriptPreviewSplitter.SetPane( 0,1,&m_previewCtrl,CSize(200,h2) );
m_previewCtrl.SetDlgCtrlID(100);
m_previewCtrl.ShowWindow( SW_HIDE );
m_wndScriptPreviewSplitter.SetPane( 0,1,&m_descriptionEditBox,CSize(200,100) );
m_descriptionEditBox.ShowWindow( SW_SHOW );
m_bShowDescription = true;
m_wndHSplitter.SetPane( 0,0,&m_wndScriptPreviewSplitter,CSize(100,h2) );
m_wndHSplitter.SetPane( 1,0,&m_propsCtrl,CSize(100,h2) );
m_wndVSplitter.SetPane( 0,0,&m_treeCtrl,CSize(200,100) );
m_wndVSplitter.SetPane( 0,1,&m_wndHSplitter,CSize(200,100) );
//m_wndVSplitter.CreateView( 1,1,
RecalcLayout();
ReloadLibs();
ReloadItems();
m_scriptDialog.Invalidate();
m_scriptDialog.ShowWindow( SW_SHOW );
m_wndVSplitter.RecalcLayout();
m_wndHSplitter.RecalcLayout();
m_wndScriptPreviewSplitter.RecalcLayout();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//////////////////////////////////////////////////////////////////////////
UINT CEntityProtLibDialog::GetDialogMenuID()
{
return IDR_DB_ENTITY;
};
//////////////////////////////////////////////////////////////////////////
// Create the toolbar
void CEntityProtLibDialog::InitToolbar()
{
VERIFY( m_toolbar.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_WRAPABLE,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) );
VERIFY( m_toolbar.LoadToolBar24(IDR_DB_ENTITY_BAR) );
m_toolbar.SetButtonStyle( m_toolbar.CommandToIndex(ID_DB_PLAY),TBBS_CHECKBOX );
CBaseLibraryDialog::InitToolbar();
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnSize(UINT nType, int cx, int cy)
{
CBaseLibraryDialog::OnSize(nType, cx, cy);
// resize splitter window.
if (m_wndVSplitter.m_hWnd)
{
CRect rc;
GetClientRect(rc);
m_wndVSplitter.MoveWindow(rc,FALSE);
m_toolbar.SetWindowPos(NULL, 0, 0, rc.right, 70, SWP_NOZORDER);
//m_scriptDialog.Invalidate();
}
RecalcLayout();
if (m_wndVSplitter.m_hWnd)
{
m_scriptDialog.Invalidate();
Invalidate();
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnNewDocument()
{
// Clear all prototypes and libraries.
GetIEditor()->GetEntityProtManager()->ClearAll();
CBaseLibraryDialog::OnNewDocument();
};
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnLoadDocument()
{
CBaseLibraryDialog::OnLoadDocument();
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnCloseDocument()
{
CBaseLibraryDialog::OnCloseDocument();
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnAddPrototype()
{
if (!m_pLibrary)
return;
CString library = m_selectedLib;
if (library.IsEmpty())
return;
CString entityClass = SelectEntityClass();
if (entityClass.IsEmpty())
return;
CStringGroupDlg dlg( _T("New Entity Name"),this );
dlg.SetGroup( m_selectedGroup );
dlg.SetString( entityClass );
if (dlg.DoModal() != IDOK || dlg.GetString().IsEmpty())
{
return;
}
CEntityPrototype *prototype = (CEntityPrototype*)m_pEntityManager->CreateItem( m_pLibrary );
// Make prototype name.
SetItemName( prototype,dlg.GetGroup(),dlg.GetString() );
// Assign entity class to prototype.
prototype->SetEntityClassName( entityClass );
ReloadItems();
SelectItem( prototype );
}
//////////////////////////////////////////////////////////////////////////
CString CEntityProtLibDialog::SelectEntityClass()
{
CSelectEntityClsDialog dlg;
if (dlg.DoModal() == IDOK)
{
return dlg.GetEntityClass();
}
return "";
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::SelectItem( CBaseLibraryItem *item,bool bForceReload )
{
bool bChanged = item != m_pCurrentItem || bForceReload;
CBaseLibraryDialog::SelectItem( item,bForceReload );
if (!bChanged)
return;
CEntityPrototype *prototype = (CEntityPrototype*)item;
// Empty preview control.
m_previewCtrl.SetEntity(0);
m_previewCtrl.LoadFile( "",false );
m_propsCtrl.DeleteAllItems();
if (prototype && prototype->GetProperties())
{
CString scriptName;
if (prototype->GetScript())
{
scriptName = prototype->GetScript()->GetName();
scriptName += " ";
}
m_propsCtrl.AddVarBlock( prototype->GetProperties() );
m_propsCtrl.SetRootName( scriptName + "Properties" );
m_propsCtrl.ExpandAll();
m_propsCtrl.SetUpdateCallback( functor(*this,&CEntityProtLibDialog::OnUpdateProperties) );
}
if (prototype)
{
m_descriptionEditBox.SetWindowText( prototype->GetDescription() );
}
ReleaseEntity();
if (prototype)
{
CRect rc;
m_previewCtrl.GetClientRect(rc);
if (rc.Width() > 5 && rc.Height() > 5 && !m_bShowDescription)
SpawnEntity( prototype );
else
{
if (prototype->GetScript())
m_scriptDialog.SetScript( prototype->GetScript(),0 );
}
}
if (!m_visualObject.IsEmpty())
m_previewCtrl.LoadFile( m_visualObject,false );
if (m_entity)
m_previewCtrl.SetEntity(m_entity);
m_previewCtrl.SetGrid(true);
m_previewCtrl.EnableUpdate(true);
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::SpawnEntity( CEntityPrototype *prototype )
{
assert( prototype );
ReleaseEntity();
CEntityScript *script = prototype->GetScript();
if (!script)
return;
// Load script if its not loaded yet.
if (!script->IsValid())
{
if (!script->Load())
return;
}
CEntityDesc ed;
ed.ClassId = script->GetClsId();
ed.name = prototype->GetName();
m_entity = m_pEntitySystem->SpawnEntity( ed,false );
if (m_entity)
{
if (prototype->GetProperties())
{
// Assign to entity properties of prototype.
script->SetProperties( m_entity,prototype->GetProperties(),false );
}
// Initialize properties.
if (!m_pEntitySystem->InitEntity( m_entity,ed ))
m_entity = 0;
//////////////////////////////////////////////////////////////////////////
// Make visual object for this entity.
//////////////////////////////////////////////////////////////////////////
m_visualObject = script->GetVisualObject();
m_scriptDialog.SetScript( script,m_entity );
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::ReleaseEntity()
{
m_visualObject = "";
if (m_entity)
{
m_entity->SetDestroyable(true);
m_pEntitySystem->RemoveEntity( m_entity->GetId(),true );
}
m_entity = 0;
m_scriptDialog.SetScript( 0,0 );
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::Update()
{
if (!m_bEntityPlaying)
return;
// Update preview control.
if (m_entity)
{
m_previewCtrl.Update();
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnUpdateProperties( IVariable *var )
{
CEntityPrototype *prototype = GetSelectedPrototype();
if (prototype != 0)
{
// Mark prototype library modified.
prototype->GetLibrary()->SetModified();
CEntityScript *script = prototype->GetScript();
CVarBlock *props = prototype->GetProperties();
if (script && props && m_entity != 0)
{
// Set entity properties.
script->SetProperties( m_entity,props,true );
}
prototype->Update();
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnShowDescription()
{
m_previewCtrl.SetDlgCtrlID(100);
m_wndScriptPreviewSplitter.SetPane( 0,1,&m_descriptionEditBox,CSize(200,100) );
m_wndScriptPreviewSplitter.RecalcLayout();
m_descriptionEditBox.ShowWindow( SW_SHOW );
m_previewCtrl.ShowWindow( SW_HIDE );
m_bShowDescription = true;
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnPlay()
{
m_bEntityPlaying = !m_bEntityPlaying;
if (m_bShowDescription)
{
m_descriptionEditBox.SetDlgCtrlID(101);
m_wndScriptPreviewSplitter.SetPane( 0,1,&m_previewCtrl,CSize(200,100) );
m_descriptionEditBox.ShowWindow( SW_HIDE );
m_previewCtrl.ShowWindow( SW_SHOW );
m_bShowDescription = false;
m_wndScriptPreviewSplitter.RecalcLayout();
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnUpdatePlay( CCmdUI* pCmdUI )
{
if (m_bEntityPlaying)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnReloadEntityScript()
{
CEntityPrototype *prototype = GetSelectedPrototype();
if (prototype)
{
prototype->Reload();
TSmartPtr<CEntityPrototype> sel = prototype;
SelectItem( prototype );
}
}
//////////////////////////////////////////////////////////////////////////
CEntityPrototype* CEntityProtLibDialog::GetSelectedPrototype()
{
CBaseLibraryItem* item = m_pCurrentItem;
return (CEntityPrototype*)item;
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnDescriptionChange()
{
CString desc;
m_descriptionEditBox.GetWindowText( desc );
if (GetSelectedPrototype())
{
GetSelectedPrototype()->SetDescription( desc );
GetSelectedPrototype()->GetLibrary()->SetModified();
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnAssignToSelection()
{
CEntityPrototype *pPrototype = GetSelectedPrototype();
if (!pPrototype)
return;
CUndo undo( "Assign Archetype" );
CSelectionGroup *pSel = GetIEditor()->GetSelection();
if (!pSel->IsEmpty())
{
for (int i = 0; i < pSel->GetCount(); i++)
{
CBaseObject *pObject = pSel->GetObject(i);
if (pObject->IsKindOf(RUNTIME_CLASS(CProtEntityObject)))
{
CProtEntityObject *pProtEntity = (CProtEntityObject*)pObject;
pProtEntity->SetPrototype( pPrototype,true );
}
}
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnSelectAssignedObjects()
{
CEntityPrototype *pItem = GetSelectedPrototype();
if (!pItem)
return;
CBaseObjectsArray objects;
GetIEditor()->GetObjectManager()->GetObjects( objects );
for (int i = 0; i < objects.size(); i++)
{
CBaseObject *pObject = objects[i];
if (pObject->IsKindOf(RUNTIME_CLASS(CProtEntityObject)))
{
CProtEntityObject *protEntity = (CProtEntityObject*)pObject;
if (protEntity->GetPrototype() != pItem)
continue;
if (pObject->IsHidden() || pObject->IsFrozen())
continue;
GetIEditor()->GetObjectManager()->SelectObject( pObject );
}
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnNotifyTreeRClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// Show helper menu.
CPoint point;
CEntityPrototype *pItem = 0;
// Find node under mouse.
GetCursorPos( &point );
m_treeCtrl.ScreenToClient( &point );
// Select the item that is at the point myPoint.
UINT uFlags;
HTREEITEM hItem = m_treeCtrl.HitTest(point,&uFlags);
if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
{
pItem = (CEntityPrototype*)m_treeCtrl.GetItemData(hItem);
}
if (!pItem)
return;
SelectItem( pItem );
// Create pop up menu.
CMenu menu;
menu.CreatePopupMenu();
if (pItem)
{
CClipboard clipboard;
bool bNoPaste = clipboard.IsEmpty();
int pasteFlags = 0;
if (bNoPaste)
pasteFlags |= MF_GRAYED;
menu.AppendMenu( MF_STRING,ID_DB_CUT,"Cut" );
menu.AppendMenu( MF_STRING,ID_DB_COPY,"Copy" );
menu.AppendMenu( MF_STRING|pasteFlags,ID_DB_PASTE,"Paste" );
menu.AppendMenu( MF_STRING,ID_DB_CLONE,"Clone" );
menu.AppendMenu( MF_SEPARATOR,0,"" );
menu.AppendMenu( MF_STRING,ID_DB_RENAME,"Rename" );
menu.AppendMenu( MF_STRING,ID_DB_REMOVE,"Delete" );
menu.AppendMenu( MF_SEPARATOR,0,"" );
menu.AppendMenu( MF_STRING,ID_DB_ASSIGNTOSELECTION,"Assign to Selected Objects" );
menu.AppendMenu( MF_STRING,ID_DB_SELECTASSIGNEDOBJECTS,"Select Assigned Objects" );
menu.AppendMenu( MF_STRING,ID_DB_RELOAD,"Reload" );
}
GetCursorPos( &point );
menu.TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this );
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CBaseLibraryItem *pItem = (CEntityPrototype*)m_treeCtrl.GetItemData(hItem);
if (!pItem)
return;
m_pDraggedItem = pItem;
m_treeCtrl.Select( hItem,TVGN_CARET );
m_dragImage = m_treeCtrl.CreateDragImage( hItem );
if (m_dragImage)
{
m_dragImage->BeginDrag(0, CPoint(-10, -10));
CRect rc;
AfxGetMainWnd()->GetWindowRect( rc );
CPoint p = pNMTreeView->ptDrag;
ClientToScreen( &p );
p.x -= rc.left;
p.y -= rc.top;
m_dragImage->DragEnter( AfxGetMainWnd(),p );
SetCapture();
GetIEditor()->EnableUpdate( false );
}
*pResult = 0;
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_dragImage)
{
CRect rc;
AfxGetMainWnd()->GetWindowRect( rc );
CPoint p = point;
ClientToScreen( &p );
p.x -= rc.left;
p.y -= rc.top;
m_dragImage->DragMove( p );
SetCursor( m_hCursorDefault );
// Check if can drop here.
{
CPoint p;
GetCursorPos( &p );
CViewport* viewport = GetIEditor()->GetViewManager()->GetViewportAtPoint( p );
if (viewport)
{
SetCursor( m_hCursorCreate );
CPoint vp = p;
viewport->ScreenToClient(&vp);
ObjectHitInfo hit( viewport,vp );
if (viewport->HitTest( vp,hit,0 ))
{
if (hit.object && hit.object->IsKindOf(RUNTIME_CLASS(CProtEntityObject)))
{
SetCursor( m_hCursorReplace );
}
}
}
}
}
CBaseLibraryDialog::OnMouseMove(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_dragImage)
{
CPoint p;
GetCursorPos( &p );
GetIEditor()->EnableUpdate( true );
m_dragImage->DragLeave( AfxGetMainWnd() );
m_dragImage->EndDrag();
delete m_dragImage;
m_dragImage = 0;
ReleaseCapture();
CViewport* viewport = GetIEditor()->GetViewManager()->GetViewportAtPoint( p );
if (viewport)
{
bool bHit = false;
CPoint vp = p;
viewport->ScreenToClient(&vp);
// Drag and drop into one of views.
// Start object creation.
ObjectHitInfo hit( viewport,vp );
if (viewport->HitTest( vp,hit,0 ))
{
if (hit.object)
{
if (hit.object->IsKindOf(RUNTIME_CLASS(CProtEntityObject)))
{
bHit = true;
CUndo undo( "Assign Archetype" );
((CProtEntityObject*)hit.object)->SetPrototype( (CEntityPrototype*)m_pDraggedItem,false );
}
}
}
if (!bHit)
{
CUndo undo( "Create EntityPrototype" );
CString guid = GuidUtil::ToString( m_pDraggedItem->GetGUID() );
GetIEditor()->StartObjectCreation( "PrototypeEntity",guid );
}
}
m_pDraggedItem = 0;
}
CBaseLibraryDialog::OnLButtonUp(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnCopy()
{
CBaseLibraryItem *pItem = m_pCurrentItem;
if (pItem)
{
CClipboard clipboard;
XmlNodeRef node = new CXmlNode( "EntityPrototype" );
CBaseLibraryItem::SerializeContext ctx(node,false);
ctx.bCopyPaste = true;
pItem->Serialize( ctx );
clipboard.Put( node );
}
}
//////////////////////////////////////////////////////////////////////////
void CEntityProtLibDialog::OnPaste()
{
if (!m_pLibrary)
return;
CClipboard clipboard;
XmlNodeRef node = clipboard.Get();
if (!node)
return;
if (strcmp(node->getTag(),"EntityPrototype") == 0)
{
// This is material node.
CBaseLibrary *pLib = m_pLibrary;
CEntityPrototype *pItem = m_pEntityManager->LoadPrototype( (CEntityPrototypeLibrary*)pLib,node );
if (pItem)
{
pItem->SetName( m_pEntityManager->MakeUniqItemName(pItem->GetName()) );
ReloadItems();
SelectItem(pItem);
}
}
}