123
This commit is contained in:
866
Editor/Prefabs/PrefabDialog.cpp
Normal file
866
Editor/Prefabs/PrefabDialog.cpp
Normal file
@@ -0,0 +1,866 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Crytek Engine Source File.
|
||||
// Copyright (C), Crytek Studios, 2001-2004.
|
||||
// -------------------------------------------------------------------------
|
||||
// File name: PrefabDialog.cpp
|
||||
// Version: v1.00
|
||||
// Created: 10/11/2003 by Timur.
|
||||
// Compilers: Visual Studio.NET 2003
|
||||
// Description:
|
||||
// -------------------------------------------------------------------------
|
||||
// History:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "PrefabDialog.h"
|
||||
|
||||
#include "StringDlg.h"
|
||||
#include "NumberDlg.h"
|
||||
|
||||
#include "PrefabManager.h"
|
||||
#include "PrefabLibrary.h"
|
||||
#include "PrefabItem.h"
|
||||
|
||||
#include "Objects\PrefabObject.h"
|
||||
#include "Objects\ObjectManager.h"
|
||||
|
||||
#include "ViewManager.h"
|
||||
#include "Clipboard.h"
|
||||
|
||||
#include <I3DEngine.h>
|
||||
//#include <IEntityRenderState.h>
|
||||
#include <IEntitySystem.h>
|
||||
|
||||
#define IDC_PREFABS_TREE AFX_IDW_PANE_FIRST
|
||||
|
||||
IMPLEMENT_DYNAMIC(CPrefabDialog,CBaseLibraryDialog)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class CPrefabPickCallback : public IPickObjectCallback
|
||||
{
|
||||
public:
|
||||
CPrefabPickCallback() { m_bActive = true; };
|
||||
//! Called when object picked.
|
||||
virtual void OnPick( CBaseObject *picked )
|
||||
{
|
||||
/*
|
||||
m_bActive = false;
|
||||
CPrefabItem *pParticles = picked->GetParticle();
|
||||
if (pParticles)
|
||||
GetIEditor()->OpenPrefabLibrary( pParticles );
|
||||
*/
|
||||
delete this;
|
||||
}
|
||||
//! Called when pick mode cancelled.
|
||||
virtual void OnCancelPick()
|
||||
{
|
||||
m_bActive = false;
|
||||
delete this;
|
||||
}
|
||||
//! Return true if specified object is pickable.
|
||||
virtual bool OnPickFilter( CBaseObject *filterObject )
|
||||
{
|
||||
/*
|
||||
// Check if object have material.
|
||||
if (filterObject->GetParticle())
|
||||
return true;
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
static bool IsActive() { return m_bActive; };
|
||||
private:
|
||||
static bool m_bActive;
|
||||
};
|
||||
bool CPrefabPickCallback::m_bActive = false;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CPrefabDialog implementation.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CPrefabDialog::CPrefabDialog( CWnd *pParent )
|
||||
: CBaseLibraryDialog(IDD_DB_ENTITY, pParent)
|
||||
{
|
||||
m_pPrefabManager = GetIEditor()->GetPrefabManager();
|
||||
m_pItemManager = m_pPrefabManager;
|
||||
|
||||
m_dragImage = 0;
|
||||
m_hDropItem = 0;
|
||||
|
||||
// Immidiatly create dialog.
|
||||
Create( IDD_DB_ENTITY,pParent );
|
||||
}
|
||||
|
||||
CPrefabDialog::~CPrefabDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void CPrefabDialog::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CBaseLibraryDialog::DoDataExchange(pDX);
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CPrefabDialog, CBaseLibraryDialog)
|
||||
ON_COMMAND( ID_DB_ADD,OnAddItem )
|
||||
|
||||
ON_COMMAND( ID_DB_SELECTASSIGNEDOBJECTS,OnSelectAssignedObjects )
|
||||
ON_COMMAND( ID_DB_MTL_ASSIGNTOSELECTION,OnAssignToSelection )
|
||||
ON_COMMAND( ID_DB_MTL_GETFROMSELECTION,OnGetFromSelection )
|
||||
ON_COMMAND( ID_DB_MAKE_FROM_SELECTION,OnMakeFromSelection )
|
||||
|
||||
|
||||
ON_UPDATE_COMMAND_UI( ID_DB_MTL_ASSIGNTOSELECTION,OnUpdateAssignToSelection )
|
||||
ON_UPDATE_COMMAND_UI( ID_DB_SELECTASSIGNEDOBJECTS,OnUpdateSelected )
|
||||
ON_UPDATE_COMMAND_UI( ID_DB_MTL_GETFROMSELECTION,OnUpdateObjectSelected )
|
||||
|
||||
ON_COMMAND( ID_DB_MTL_PICK,OnPickPrefab )
|
||||
ON_UPDATE_COMMAND_UI( ID_DB_MTL_PICK,OnUpdatePickPrefab )
|
||||
|
||||
ON_NOTIFY(TVN_BEGINDRAG, IDC_PREFABS_TREE, OnBeginDrag)
|
||||
ON_NOTIFY(NM_RCLICK , IDC_PREFABS_TREE, OnNotifyMtlTreeRClick)
|
||||
ON_WM_SIZE()
|
||||
ON_WM_DESTROY()
|
||||
ON_WM_MOUSEMOVE()
|
||||
ON_WM_LBUTTONUP()
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnDestroy()
|
||||
{
|
||||
int temp;
|
||||
int HSplitter=0,VSplitter=0;
|
||||
//m_wndHSplitter.GetRowInfo( 0,HSplitter,temp );
|
||||
m_wndVSplitter.GetColumnInfo( 0,VSplitter,temp );
|
||||
AfxGetApp()->WriteProfileInt("Dialogs\\PrefabsEditor","HSplitter",HSplitter );
|
||||
AfxGetApp()->WriteProfileInt("Dialogs\\PrefabsEditor","VSplitter",VSplitter );
|
||||
|
||||
//ReleaseGeometry();
|
||||
CBaseLibraryDialog::OnDestroy();
|
||||
}
|
||||
|
||||
// CTVSelectKeyDialog message handlers
|
||||
BOOL CPrefabDialog::OnInitDialog()
|
||||
{
|
||||
CBaseLibraryDialog::OnInitDialog();
|
||||
|
||||
InitToolbar();
|
||||
|
||||
CRect rc;
|
||||
GetClientRect(rc);
|
||||
//int h2 = rc.Height()/2;
|
||||
int h2 = 200;
|
||||
|
||||
int HSplitter = AfxGetApp()->GetProfileInt("Dialogs\\PrefabsEditor","HSplitter",200 );
|
||||
int VSplitter = AfxGetApp()->GetProfileInt("Dialogs\\PrefabsEditor","VSplitter",200 );
|
||||
|
||||
m_wndVSplitter.CreateStatic( this,1,2,WS_CHILD|WS_VISIBLE );
|
||||
//m_wndHSplitter.CreateStatic( &m_wndVSplitter,2,1,WS_CHILD|WS_VISIBLE );
|
||||
|
||||
//m_imageList.Create(IDB_PREFABS_TREE, 16, 1, RGB (255, 0, 255));
|
||||
CMFCUtils::LoadTrueColorImageList( m_imageList,IDB_PREFABS_TREE,16,RGB(255,0,255) );
|
||||
|
||||
// TreeCtrl must be already created.
|
||||
m_treeCtrl.SetParent( &m_wndVSplitter );
|
||||
m_treeCtrl.SetImageList(&m_imageList,TVSIL_NORMAL);
|
||||
|
||||
//m_propsCtrl.Create( WS_VISIBLE|WS_CHILD|WS_BORDER,rc,&m_wndHSplitter,2 );
|
||||
m_propsCtrl.Create( WS_VISIBLE|WS_CHILD|WS_BORDER,rc,&m_wndVSplitter,2 );
|
||||
/*
|
||||
m_vars = gParticleUI.CreateVars();
|
||||
m_propsCtrl.AddVarBlock( m_vars );
|
||||
m_propsCtrl.ExpandAllChilds( m_propsCtrl.GetRootItem(),false );
|
||||
m_propsCtrl.EnableWindow( FALSE );
|
||||
*/
|
||||
|
||||
//m_wndHSplitter.SetPane( 0,0,&m_previewCtrl,CSize(100,HSplitter) );
|
||||
//m_wndHSplitter.SetPane( 1,0,&m_propsCtrl,CSize(100,HSplitter) );
|
||||
|
||||
m_wndVSplitter.SetPane( 0,0,&m_treeCtrl,CSize(VSplitter,100) );
|
||||
//m_wndVSplitter.SetPane( 0,1,&m_wndHSplitter,CSize(VSplitter,100) );
|
||||
m_wndVSplitter.SetPane( 0,1,&m_propsCtrl,CSize(100,HSplitter) );
|
||||
|
||||
RecalcLayout();
|
||||
|
||||
ReloadLibs();
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
// EXCEPTION: OCX Property Pages should return FALSE
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
UINT CPrefabDialog::GetDialogMenuID()
|
||||
{
|
||||
return IDR_DB_ENTITY;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Create the toolbar
|
||||
void CPrefabDialog::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_PREFAB_BAR) );
|
||||
|
||||
// Resize the toolbar
|
||||
CRect rc;
|
||||
GetClientRect(rc);
|
||||
m_toolbar.SetWindowPos(NULL, 0, 0, rc.right, 70, SWP_NOZORDER);
|
||||
CSize sz = m_toolbar.CalcDynamicLayout(TRUE,TRUE);
|
||||
|
||||
CBaseLibraryDialog::InitToolbar();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnSize(UINT nType, int cx, int cy)
|
||||
{
|
||||
// resize splitter window.
|
||||
if (m_wndVSplitter.m_hWnd)
|
||||
{
|
||||
CRect rc;
|
||||
GetClientRect(rc);
|
||||
m_wndVSplitter.MoveWindow(rc,FALSE);
|
||||
}
|
||||
CBaseLibraryDialog::OnSize(nType, cx, cy);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnNewDocument()
|
||||
{
|
||||
CBaseLibraryDialog::OnNewDocument();
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnLoadDocument()
|
||||
{
|
||||
CBaseLibraryDialog::OnLoadDocument();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnCloseDocument()
|
||||
{
|
||||
CBaseLibraryDialog::OnCloseDocument();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnAddItem()
|
||||
{
|
||||
if (!m_pLibrary)
|
||||
return;
|
||||
|
||||
CStringGroupDlg dlg( _T("New Prefab Name"),this );
|
||||
dlg.SetGroup( m_selectedGroup );
|
||||
//dlg.SetString( entityClass );
|
||||
if (dlg.DoModal() != IDOK || dlg.GetString().IsEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CString fullName = m_pItemManager->MakeFullItemName( m_pLibrary,dlg.GetGroup(),dlg.GetString() );
|
||||
if (m_pItemManager->FindItemByName( fullName ))
|
||||
{
|
||||
Warning( "Item with name %s already exist",(const char*)fullName );
|
||||
return;
|
||||
}
|
||||
|
||||
CPrefabItem *pItem = (CPrefabItem*)m_pItemManager->CreateItem( m_pLibrary );
|
||||
|
||||
// Make prototype name.
|
||||
SetItemName( pItem,dlg.GetGroup(),dlg.GetString() );
|
||||
pItem->Update();
|
||||
|
||||
ReloadItems();
|
||||
SelectItem( pItem );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::SelectItem( CBaseLibraryItem *item,bool bForceReload )
|
||||
{
|
||||
bool bChanged = item != m_pCurrentItem || bForceReload;
|
||||
CBaseLibraryDialog::SelectItem( item,bForceReload );
|
||||
|
||||
if (!bChanged)
|
||||
return;
|
||||
|
||||
if (!item)
|
||||
{
|
||||
m_propsCtrl.EnableWindow(FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
m_propsCtrl.EnableWindow(TRUE);
|
||||
m_propsCtrl.EnableUpdateCallback(false);
|
||||
|
||||
// Render preview geometry with current material
|
||||
CPrefabItem *prefab = GetSelectedPrefab();
|
||||
|
||||
//AssignMtlToGeometry();
|
||||
|
||||
// Update variables.
|
||||
m_propsCtrl.EnableUpdateCallback(false);
|
||||
//gParticleUI.SetFromParticles( pParticles );
|
||||
m_propsCtrl.EnableUpdateCallback(true);
|
||||
|
||||
//m_propsCtrl.SetUpdateCallback( functor(*this,OnUpdateProperties) );
|
||||
m_propsCtrl.EnableUpdateCallback(true);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::Update()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnUpdateProperties( IVariable *var )
|
||||
{
|
||||
CPrefabItem *pPrefab = GetSelectedPrefab();
|
||||
if (!pPrefab)
|
||||
return;
|
||||
|
||||
//gParticleUI.SetToParticles( pParticles );
|
||||
|
||||
//AssignMtlToGeometry();
|
||||
|
||||
GetIEditor()->SetModifiedFlag();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CPrefabItem* CPrefabDialog::GetSelectedPrefab()
|
||||
{
|
||||
CBaseLibraryItem *pItem = m_pCurrentItem;
|
||||
return (CPrefabItem*)pItem;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnAssignToSelection()
|
||||
{
|
||||
CPrefabItem *pPrefab = GetSelectedPrefab();
|
||||
if (!pPrefab)
|
||||
return;
|
||||
|
||||
CUndo undo( "Assign Prefab" );
|
||||
|
||||
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(CPrefabObject)))
|
||||
{
|
||||
CPrefabObject *pPrefabObject = (CPrefabObject*)pObject;
|
||||
pPrefabObject->SetPrefab( pPrefab,false );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnSelectAssignedObjects()
|
||||
{
|
||||
CPrefabItem *pPrefab = GetSelectedPrefab();
|
||||
if (!pPrefab)
|
||||
return;
|
||||
|
||||
CBaseObjectsArray objects;
|
||||
GetIEditor()->GetObjectManager()->GetObjects( objects );
|
||||
for (int i = 0; i < objects.size(); i++)
|
||||
{
|
||||
CBaseObject *pObject = objects[i];
|
||||
if (pObject->IsKindOf(RUNTIME_CLASS(CPrefabObject)))
|
||||
{
|
||||
CPrefabObject *pPrefabObject = (CPrefabObject*)pObject;
|
||||
if (pPrefabObject->GetPrefab() == pPrefab)
|
||||
{
|
||||
GetIEditor()->SelectObject( pPrefabObject );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnGetFromSelection()
|
||||
{
|
||||
if (!m_pLibrary)
|
||||
return;
|
||||
|
||||
CSelectionGroup *pSel = GetIEditor()->GetSelection();
|
||||
if (pSel->IsEmpty())
|
||||
return;
|
||||
|
||||
if (pSel->GetCount() == 1)
|
||||
{
|
||||
CBaseObject *pObject = pSel->GetObject(0);
|
||||
if (pObject->IsKindOf(RUNTIME_CLASS(CPrefabObject)))
|
||||
{
|
||||
CPrefabObject *pPrefabObject = (CPrefabObject*)pObject;
|
||||
SelectItem( pPrefabObject->GetPrefab() );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
CStringGroupDlg dlg( _T("New Prefab Name"),this );
|
||||
dlg.SetGroup( m_selectedGroup );
|
||||
if (dlg.DoModal() != IDOK || dlg.GetString().IsEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CPrefabItem *pPrefab = (CPrefabItem*)m_pItemManager->CreateItem( m_pLibrary );
|
||||
SetItemName( pPrefab,dlg.GetGroup(),dlg.GetString() );
|
||||
|
||||
// Serialize these objects into prefab.
|
||||
pPrefab->MakeFromSelection( *pSel );
|
||||
|
||||
|
||||
ReloadItems();
|
||||
SelectItem( pPrefab );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnMakeFromSelection()
|
||||
{
|
||||
if (!m_pLibrary)
|
||||
return;
|
||||
|
||||
CPrefabItem *pPrefab = GetSelectedPrefab();
|
||||
if (!pPrefab)
|
||||
return;
|
||||
|
||||
CSelectionGroup *pSel = GetIEditor()->GetSelection();
|
||||
if (pSel->IsEmpty())
|
||||
return;
|
||||
|
||||
// Serialize these objects into prefab.
|
||||
pPrefab->MakeFromSelection( *pSel );
|
||||
UpdatePrefabObjects( pPrefab );
|
||||
|
||||
ReloadItems();
|
||||
SelectItem( pPrefab );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::UpdatePrefabObjects( CPrefabItem *pPrefab )
|
||||
{
|
||||
assert( pPrefab );
|
||||
// Update all existing prefabs.
|
||||
CBaseObjectsArray objects;
|
||||
GetIEditor()->GetObjectManager()->GetObjects( objects );
|
||||
for (int i = 0; i < objects.size(); i++)
|
||||
{
|
||||
CBaseObject *pObject = objects[i];
|
||||
if (pObject->IsKindOf(RUNTIME_CLASS(CPrefabObject)))
|
||||
{
|
||||
CPrefabObject *pPrefabObject = (CPrefabObject*)pObject;
|
||||
if (pPrefabObject->GetPrefab() == pPrefab)
|
||||
{
|
||||
pPrefabObject->SetPrefab( pPrefab,true );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnUpdateAssignToSelection( CCmdUI* pCmdUI )
|
||||
{
|
||||
if (GetSelectedPrefab() && !GetIEditor()->GetSelection()->IsEmpty())
|
||||
{
|
||||
pCmdUI->Enable( TRUE );
|
||||
}
|
||||
else
|
||||
{
|
||||
pCmdUI->Enable( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnUpdateObjectSelected( CCmdUI* pCmdUI )
|
||||
{
|
||||
if (!GetIEditor()->GetSelection()->IsEmpty())
|
||||
{
|
||||
pCmdUI->Enable( TRUE );
|
||||
}
|
||||
else
|
||||
{
|
||||
pCmdUI->Enable( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
|
||||
{
|
||||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||||
|
||||
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
|
||||
|
||||
CPrefabItem* pPrefab = (CPrefabItem*)m_treeCtrl.GetItemData(hItem);
|
||||
if (!pPrefab)
|
||||
return;
|
||||
|
||||
m_pDraggedItem = pPrefab;
|
||||
|
||||
m_treeCtrl.Select( hItem,TVGN_CARET );
|
||||
|
||||
m_hDropItem = 0;
|
||||
m_dragImage = m_treeCtrl.CreateDragImage( hItem );
|
||||
if (m_dragImage)
|
||||
{
|
||||
m_hDraggedItem = hItem;
|
||||
m_hDropItem = hItem;
|
||||
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 CPrefabDialog::OnMouseMove(UINT nFlags, CPoint point)
|
||||
{
|
||||
if (m_dragImage)
|
||||
{
|
||||
CPoint p;
|
||||
|
||||
p = point;
|
||||
ClientToScreen( &p );
|
||||
m_treeCtrl.ScreenToClient( &p );
|
||||
|
||||
TVHITTESTINFO hit;
|
||||
ZeroStruct(hit);
|
||||
hit.pt = p;
|
||||
HTREEITEM hHitItem = m_treeCtrl.HitTest( &hit );
|
||||
if (hHitItem)
|
||||
{
|
||||
if (m_hDropItem != hHitItem)
|
||||
{
|
||||
if (m_hDropItem)
|
||||
m_treeCtrl.SetItem( m_hDropItem,TVIF_STATE,0,0,0,0,TVIS_DROPHILITED,0 );
|
||||
// Set state of this item to drop target.
|
||||
m_treeCtrl.SetItem( hHitItem,TVIF_STATE,0,0,0,TVIS_DROPHILITED,TVIS_DROPHILITED,0 );
|
||||
m_hDropItem = hHitItem;
|
||||
m_treeCtrl.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
CRect rc;
|
||||
AfxGetMainWnd()->GetWindowRect( rc );
|
||||
p = point;
|
||||
ClientToScreen( &p );
|
||||
p.x -= rc.left;
|
||||
p.y -= rc.top;
|
||||
m_dragImage->DragMove( p );
|
||||
|
||||
SetCursor( m_hCursorNoDrop );
|
||||
// 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(CPrefabObject)))
|
||||
{
|
||||
SetCursor( m_hCursorReplace );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CBaseLibraryDialog::OnMouseMove(nFlags, point);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnLButtonUp(UINT nFlags, CPoint point)
|
||||
{
|
||||
//CXTResizeDialog::OnLButtonUp(nFlags, point);
|
||||
|
||||
if (m_hDropItem)
|
||||
{
|
||||
m_treeCtrl.SetItem( m_hDropItem,TVIF_STATE,0,0,0,0,TVIS_DROPHILITED,0 );
|
||||
m_hDropItem = 0;
|
||||
}
|
||||
|
||||
if (m_dragImage)
|
||||
{
|
||||
CPoint p;
|
||||
GetCursorPos( &p );
|
||||
|
||||
GetIEditor()->EnableUpdate( true );
|
||||
|
||||
m_dragImage->DragLeave( AfxGetMainWnd() );
|
||||
m_dragImage->EndDrag();
|
||||
delete m_dragImage;
|
||||
m_dragImage = 0;
|
||||
ReleaseCapture();
|
||||
SetCursor( m_hCursorDefault );
|
||||
|
||||
CPoint treepoint = p;
|
||||
m_treeCtrl.ScreenToClient( &treepoint );
|
||||
|
||||
CRect treeRc;
|
||||
m_treeCtrl.GetClientRect(treeRc);
|
||||
|
||||
if (treeRc.PtInRect(treepoint))
|
||||
{
|
||||
// Droped inside tree.
|
||||
TVHITTESTINFO hit;
|
||||
ZeroStruct(hit);
|
||||
hit.pt = treepoint;
|
||||
HTREEITEM hHitItem = m_treeCtrl.HitTest( &hit );
|
||||
if (hHitItem)
|
||||
{
|
||||
//DropToItem( hHitItem,m_hDraggedItem,m_pDraggedItem );
|
||||
m_hDraggedItem = 0;
|
||||
m_pDraggedItem = 0;
|
||||
return;
|
||||
}
|
||||
//DropToItem( 0,m_hDraggedItem,m_pDraggedItem );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not droped inside tree.
|
||||
|
||||
CWnd *wnd = WindowFromPoint( p );
|
||||
|
||||
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 && hit.object->IsKindOf(RUNTIME_CLASS(CPrefabObject)))
|
||||
{
|
||||
bHit = true;
|
||||
CUndo undo( "Assign Prefab" );
|
||||
((CPrefabObject*)hit.object)->SetPrefab( (CPrefabItem*)m_pDraggedItem,false );
|
||||
}
|
||||
}
|
||||
if (!bHit)
|
||||
{
|
||||
CUndo undo( "Create Prefab" );
|
||||
CString guid = GuidUtil::ToString( m_pDraggedItem->GetGUID() );
|
||||
GetIEditor()->StartObjectCreation( PREFAB_OBJECT_CLASS_NAME,guid );
|
||||
}
|
||||
}
|
||||
}
|
||||
m_pDraggedItem = 0;
|
||||
}
|
||||
m_pDraggedItem = 0;
|
||||
m_hDraggedItem = 0;
|
||||
|
||||
CBaseLibraryDialog::OnLButtonUp(nFlags, point);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnNotifyMtlTreeRClick(NMHDR* pNMHDR, LRESULT* pResult)
|
||||
{
|
||||
// Show helper menu.
|
||||
CPoint point;
|
||||
|
||||
CPrefabItem *pParticles = 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))
|
||||
{
|
||||
pParticles = (CPrefabItem*)m_treeCtrl.GetItemData(hItem);
|
||||
}
|
||||
|
||||
if (!pParticles)
|
||||
return;
|
||||
|
||||
SelectItem( pParticles );
|
||||
|
||||
// Create pop up menu.
|
||||
CMenu menu;
|
||||
menu.CreatePopupMenu();
|
||||
|
||||
if (pParticles)
|
||||
{
|
||||
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_MAKE_FROM_SELECTION,"Make From Selection" );
|
||||
menu.AppendMenu( MF_STRING,ID_DB_MTL_ASSIGNTOSELECTION,"Assign to Selected Objects" );
|
||||
menu.AppendMenu( MF_STRING,ID_DB_SELECTASSIGNEDOBJECTS,"Select Assigned Objects" );
|
||||
}
|
||||
|
||||
GetCursorPos( &point );
|
||||
menu.TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnPickPrefab()
|
||||
{
|
||||
if (!CPrefabPickCallback::IsActive())
|
||||
GetIEditor()->PickObject( new CPrefabPickCallback,0,"Pick Object to Select Particle" );
|
||||
else
|
||||
GetIEditor()->CancelPick();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnUpdatePickPrefab( CCmdUI* pCmdUI )
|
||||
{
|
||||
if (CPrefabPickCallback::IsActive())
|
||||
{
|
||||
pCmdUI->SetCheck(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
pCmdUI->SetCheck(0);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnCopy()
|
||||
{
|
||||
CPrefabItem *pItem = GetSelectedPrefab();
|
||||
if (pItem)
|
||||
{
|
||||
XmlNodeRef node = new CXmlNode( "Prefab" );
|
||||
CBaseLibraryItem::SerializeContext ctx(node,false);
|
||||
ctx.bCopyPaste = true;
|
||||
|
||||
CClipboard clipboard;
|
||||
pItem->Serialize( ctx );
|
||||
clipboard.Put( node );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::OnPaste()
|
||||
{
|
||||
if (!m_pLibrary)
|
||||
return;
|
||||
|
||||
CPrefabItem *pItem = GetSelectedPrefab();
|
||||
if (!pItem)
|
||||
return;
|
||||
|
||||
CClipboard clipboard;
|
||||
if (clipboard.IsEmpty())
|
||||
return;
|
||||
XmlNodeRef node = clipboard.Get();
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
if (strcmp(node->getTag(),"Prefab") == 0)
|
||||
{
|
||||
// This is material node.
|
||||
CBaseLibraryItem *pItem = (CBaseLibraryItem*)m_pPrefabManager->CreateItem( m_pLibrary );
|
||||
if (pItem)
|
||||
{
|
||||
CBaseLibraryItem::SerializeContext serCtx( node,true );
|
||||
serCtx.bCopyPaste = true;
|
||||
pItem->Serialize( serCtx );
|
||||
pItem->SetName( m_pPrefabManager->MakeUniqItemName(pItem->GetName()) );
|
||||
ReloadItems();
|
||||
SelectItem(pItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabDialog::DropToItem( HTREEITEM hItem,HTREEITEM hSrcItem,CPrefabItem *pParticles )
|
||||
{
|
||||
pParticles->GetLibrary()->SetModified();
|
||||
|
||||
TSmartPtr<CPrefabItem> pHolder = pParticles; // Make usre its not release while we remove and add it back.
|
||||
|
||||
/*
|
||||
if (!hItem)
|
||||
{
|
||||
// Detach from parent.
|
||||
if (pParticles->GetParent())
|
||||
pParticles->GetParent()->RemoveChild( pParticles );
|
||||
|
||||
ReloadItems();
|
||||
SelectItem( pParticles );
|
||||
return;
|
||||
}
|
||||
|
||||
CPrefabItem* pTargetItem = (CPrefabItem*)m_treeCtrl.GetItemData(hItem);
|
||||
if (!pTargetItem)
|
||||
{
|
||||
// This is group.
|
||||
|
||||
// Detach from parent.
|
||||
if (pParticles->GetParent())
|
||||
pParticles->GetParent()->RemoveChild( pParticles );
|
||||
|
||||
// Move item to different group.
|
||||
CString groupName = m_treeCtrl.GetItemText(hItem);
|
||||
SetItemName( pParticles,groupName,pParticles->GetShortName() );
|
||||
|
||||
m_treeCtrl.DeleteItem( hSrcItem );
|
||||
InsertItemToTree( pParticles,hItem );
|
||||
return;
|
||||
}
|
||||
// Ignore itself or immidiate target.
|
||||
if (pTargetItem == pParticles || pTargetItem == pParticles->GetParent())
|
||||
return;
|
||||
|
||||
|
||||
|
||||
// Detach from parent.
|
||||
if (pParticles->GetParent())
|
||||
pParticles->GetParent()->RemoveChild( pParticles );
|
||||
|
||||
// Attach to target.
|
||||
pTargetItem->AddChild( pParticles );
|
||||
|
||||
ReloadItems();
|
||||
SelectItem( pParticles );
|
||||
*/
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CPrefabItem* CPrefabDialog::GetPrefabFromSelection()
|
||||
{
|
||||
CPrefabItem *pItem = GetSelectedPrefab();
|
||||
OnGetFromSelection();
|
||||
CPrefabItem *pItemNew = GetSelectedPrefab();
|
||||
if (pItemNew != pItem)
|
||||
return pItemNew;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user