source-engine/utils/scenemanager/scene.cpp

244 lines
4.3 KiB
C++
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "scene.h"
#include "vcdfile.h"
#include "project.h"
#include "workspacemanager.h"
#include "workspacebrowser.h"
CScene::CScene( CProject *proj, char const *name ) : m_pOwner( proj )
{
Q_strncpy( m_szName, name, sizeof( m_szName ) );
m_pszComments = NULL;
}
CScene::~CScene()
{
while ( m_Files.Count() > 0 )
{
CVCDFile *f = m_Files[ 0 ];
m_Files.Remove( 0 );
delete f;
}
delete[] m_pszComments;
}
CProject *CScene::GetOwnerProject()
{
return m_pOwner;
}
void CScene::SetComments( char const *comments )
{
delete[] m_pszComments;
m_pszComments = V_strdup( comments );
GetOwnerProject()->SetDirty( true );
}
char const *CScene::GetComments( void ) const
{
return m_pszComments ? m_pszComments : "";
}
char const *CScene::GetName() const
{
return m_szName;
}
int CScene::GetVCDCount() const
{
return m_Files.Count();
}
CVCDFile *CScene::GetVCD( int index )
{
if ( index < 0 || index >= m_Files.Count() )
return NULL;
return m_Files[ index ];
}
void CScene::AddVCD( CVCDFile *vcd )
{
Assert( m_Files.Find( vcd ) == m_Files.InvalidIndex() );
m_Files.AddToTail( vcd );
GetOwnerProject()->SetDirty( true );
}
void CScene::RemoveVCD( CVCDFile *vcd )
{
if ( m_Files.Find( vcd ) == m_Files.InvalidIndex() )
return;
m_Files.FindAndRemove( vcd );
GetOwnerProject()->SetDirty( true );
}
CVCDFile *CScene::FindVCD( char const *filename )
{
int c = GetVCDCount();
CVCDFile *vcd;
for ( int i = 0; i < c; i++ )
{
vcd = GetVCD( i );
if ( !vcd )
continue;
if ( !Q_stricmp( filename, vcd->GetName() ) )
return vcd;
}
return NULL;
}
void CScene::ValidateTree( mxTreeView *tree, mxTreeViewItem* parent )
{
CUtlVector< mxTreeViewItem * > m_KnownItems;
int c = GetVCDCount();
CVCDFile *vcd;
for ( int i = 0; i < c; i++ )
{
vcd = GetVCD( i );
if ( !vcd )
continue;
char sz[ 256 ];
if ( vcd->GetComments() && vcd->GetComments()[0] )
{
Q_snprintf( sz, sizeof( sz ), "%s : %s", vcd->GetName(), vcd->GetComments() );
}
else
{
Q_snprintf( sz, sizeof( sz ), "%s", vcd->GetName() );
}
mxTreeViewItem *spot = vcd->FindItem( tree, parent );
if ( !spot )
{
spot = tree->add( parent, sz );
}
m_KnownItems.AddToTail( spot );
vcd->SetOrdinal( i );
tree->setLabel( spot, sz );
tree->setImages( spot, vcd->GetIconIndex(), vcd->GetIconIndex() );
tree->setUserData( spot, vcd );
//tree->setOpen( spot, vcd->IsExpanded() );
vcd->ValidateTree( tree, spot );
}
mxTreeViewItem *start = tree->getFirstChild( parent );
while ( start )
{
mxTreeViewItem *next = tree->getNextChild( start );
if ( m_KnownItems.Find( start ) == m_KnownItems.InvalidIndex() )
{
tree->remove( start );
}
start = next;
}
tree->sortTree( parent, true, CWorkspaceBrowser::CompareFunc, 0 );
}
bool CScene::IsCheckedOut() const
{
return false;
}
int CScene::GetIconIndex() const
{
/*
if ( IsCheckedOut() )
{
return IMAGE_SCENE_CHECKEDOUT;
}
else
*/
{
return IMAGE_SCENE;
}
}
void CScene::Checkout(bool updatestateicons /*= true*/)
{
// Scenes aren't made for checkin / checkout
}
void CScene::Checkin(bool updatestateicons /*= true*/)
{
// Scenes aren't made for checkin / checkout
}
void CScene::MoveChildUp( ITreeItem *child )
{
int c = GetVCDCount();
for ( int i = 1; i < c; i++ )
{
CVCDFile *p = GetVCD( i );
if ( p != child )
continue;
CVCDFile *prev = GetVCD( i - 1 );
// Swap
m_Files[ i - 1 ] = p;
m_Files[ i ] = prev;
return;
}
}
void CScene::MoveChildDown( ITreeItem *child )
{
int c = GetVCDCount();
for ( int i = 0; i < c - 1; i++ )
{
CVCDFile *p = GetVCD( i );
if ( p != child )
continue;
CVCDFile *next = GetVCD( i + 1 );
// Swap
m_Files[ i ] = next;
m_Files[ i + 1 ] = p;
return;
}
}
bool CScene::IsChildFirst( ITreeItem *child )
{
int idx = m_Files.Find( (CVCDFile *)child );
if ( idx == m_Files.InvalidIndex() )
return false;
if ( idx != 0 )
return false;
return true;
}
bool CScene::IsChildLast( ITreeItem *child )
{
int idx = m_Files.Find( (CVCDFile *)child );
if ( idx == m_Files.InvalidIndex() )
return false;
if ( idx != m_Files.Count() - 1 )
return false;
return true;
}