diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/scenemanager/project.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'utils/scenemanager/project.cpp')
| -rw-r--r-- | utils/scenemanager/project.cpp | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/utils/scenemanager/project.cpp b/utils/scenemanager/project.cpp new file mode 100644 index 0000000..48710f2 --- /dev/null +++ b/utils/scenemanager/project.cpp @@ -0,0 +1,416 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// +#include "cbase.h" +#include "project.h" +#include "cmdlib.h" +#include <KeyValues.h> +#include "scene.h" +#include "UtlBuffer.h" +#include "vcdfile.h" +#include "workspacemanager.h" +#include "workspacebrowser.h" + +CProject::CProject( CWorkspace *ws, char const *filename ) : m_pOwner( ws ) +{ + Q_strncpy( m_szFile, filename, sizeof( m_szFile ) ); + // By default, name is the same as the filename + Q_FileBase( m_szFile, m_szName, sizeof( m_szName ) ); + + m_bDirty = false; + m_pszComments = NULL; + + LoadFromFile(); +} + +CProject::~CProject() +{ + while ( m_Scenes.Count() > 0 ) + { + CScene *p = m_Scenes[ 0 ]; + m_Scenes.Remove( 0 ); + delete p; + } + delete[] m_pszComments; +} + +CWorkspace *CProject::GetOwnerWorkspace() +{ + return m_pOwner; +} + +char const *CProject::GetName() const +{ + return m_szName; +} + +char const *CProject::GetFileName() const +{ + return m_szFile; +} + +bool CProject::IsDirty( void ) const +{ + return m_bDirty; +} + +void CProject::SetDirty( bool dirty ) +{ + m_bDirty = dirty; +} + +void CProject::SetComments( char const *comments ) +{ + delete[] m_pszComments; + m_pszComments = V_strdup( comments ); + + SetDirty( true ); +} + +char const *CProject::GetComments() const +{ + return m_pszComments ? m_pszComments : ""; +} + +int CProject::GetSceneCount() const +{ + return m_Scenes.Count(); +} + +CScene *CProject::GetScene( int index ) const +{ + if ( index < 0 || index >= m_Scenes.Count() ) + return NULL; + return m_Scenes[ index ]; +} + +void CProject::AddScene( CScene *scene ) +{ + SetDirty( true ); + + Assert( m_Scenes.Find( scene ) == m_Scenes.InvalidIndex() ); + + m_Scenes.AddToTail( scene ); +} + +void CProject::RemoveScene( CScene *scene ) +{ + if ( m_Scenes.Find( scene ) == m_Scenes.InvalidIndex() ) + return; + + m_Scenes.FindAndRemove( scene ); + SetDirty( true ); +} + +void CProject::LoadFromFile() +{ + KeyValues *kv = new KeyValues( m_szName ); + if ( kv->LoadFromFile( filesystem, m_szFile ) ) + { + for ( KeyValues *s = kv->GetFirstSubKey(); s; s = s->GetNextKey() ) + { + if ( !Q_stricmp( s->GetName(), "comments" ) ) + { + SetComments( s->GetString() ); + continue; + } + + // Add named scenes + CScene *scene = new CScene( this, s->GetName() ); + + for ( KeyValues *sub = s->GetFirstSubKey(); sub; sub = sub->GetNextKey() ) + { + if ( !Q_stricmp( sub->GetName(), "comments" ) ) + { + scene->SetComments( sub->GetString() ); + continue; + } + + if ( !Q_stricmp( sub->GetName(), "expanded" ) ) + { + scene->SetExpanded( sub->GetInt() ? true : false ); + continue; + } + + if ( !Q_stricmp( sub->GetName(), "vcd" ) ) + { + char filename[ 256 ]; + char comments[ 512 ]; + bool expanded = false; + + filename[ 0 ] = 0; + comments[ 0 ] = 0; + + for ( KeyValues *vcdKeys = sub->GetFirstSubKey(); vcdKeys; vcdKeys = vcdKeys->GetNextKey() ) + { + if ( !Q_stricmp( vcdKeys->GetName(), "expanded" ) ) + { + expanded = vcdKeys->GetInt() ? true : false; + continue; + } + else if ( !Q_stricmp( vcdKeys->GetName(), "file" ) ) + { + Q_strncpy( filename, vcdKeys->GetString(), sizeof( filename ) ); + continue; + } + if ( !Q_stricmp( vcdKeys->GetName(), "comments" ) ) + { + Q_strncpy( comments, vcdKeys->GetString(), sizeof( comments ) ); + continue; + } + + Assert( 0 ); + + } + + CVCDFile *file = new CVCDFile( scene, filename); + file->SetExpanded( expanded ); + if ( comments[0] ) + { + file->SetComments( comments ); + } + + scene->AddVCD( file ); + continue; + } + + Assert( !va( "Unknown scene token %s\n", sub->GetName() ) ); + } + + m_Scenes.AddToTail( scene ); + } + } + kv->deleteThis(); + + SetDirty( false ); +} + +void CProject::SaveToFile() +{ + SetDirty( false ); + + CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER ); + + buf.Printf( "%s\n{\n", GetName() ); + + if ( GetComments() && GetComments()[0] ) + { + buf.Printf( "\t\"comments\"\t\"%s\"\n", + GetComments() ); + } + + // walk projects + int c = GetSceneCount(); + for ( int i = 0; i < c; i++ ) + { + CScene *scene = GetScene( i ); + Assert( scene ); + + buf.Printf( "\t\"%s\"\n", scene->GetName() ); + buf.Printf( "\t{\n" ); + + buf.Printf( "\t\t\"expanded\"\t\"%i\"\n", scene->IsExpanded() ? 1 : 0 ); + + if ( scene->GetComments() && scene->GetComments()[0] ) + { + buf.Printf( "\t\t\"comments\"\t\"%s\"\n", + scene->GetComments() ); + } + + int vcdcount = scene->GetVCDCount(); + for ( int j = 0; j < vcdcount; j++ ) + { + CVCDFile *vcd = scene->GetVCD( j ); + Assert( vcd ); + + buf.Printf( "\t\tvcd\n" ); + buf.Printf( "\t\t{\n" ); + + buf.Printf( "\t\t\t\"expanded\"\t\"%i\"\n", + vcd->IsExpanded() ? 1 : 0 ); + buf.Printf( "\t\t\t\"file\"\t\"%s\"\n", + vcd->GetName() ); + if ( vcd->GetComments() && vcd->GetComments()[0] ) + { + buf.Printf( "\t\t\t\"comments\"\t\"%s\"\n", + vcd->GetComments() ); + } + + buf.Printf( "\t\t}\n" ); + } + + buf.Printf( "\t}\n" ); + + if ( i != c - 1 ) + { + buf.Printf( "\n" ); + } + } + + buf.Printf( "}\n" ); + + // Write it out baby + FileHandle_t fh = filesystem->Open( m_szFile, "wt" ); + if (fh) + { + filesystem->Write( buf.Base(), buf.TellPut(), fh ); + filesystem->Close(fh); + } + else + { + Con_Printf( "CWorkspace::SaveToFile: Unable to write file %s!!!\n", m_szFile ); + } +} + +void CProject::SaveChanges() +{ + if ( !IsDirty() ) + return; + + SaveToFile(); +} + +void CProject::ValidateTree( mxTreeView *tree, mxTreeViewItem* parent ) +{ + CUtlVector< mxTreeViewItem * > m_KnownItems; + + int c = GetSceneCount(); + CScene *scene; + for ( int i = 0; i < c; i++ ) + { + scene = GetScene( i ); + if ( !scene ) + continue; + + char sz[ 256 ]; + if ( scene->GetComments() && scene->GetComments()[0] ) + { + Q_snprintf( sz, sizeof( sz ) , "%s : %s", scene->GetName(), scene->GetComments() ); + } + else + { + Q_snprintf( sz, sizeof( sz ) , "%s", scene->GetName() ); + } + + + mxTreeViewItem *spot = scene->FindItem( tree, parent ); + if ( !spot ) + { + spot = tree->add( parent, sz ); + } + + m_KnownItems.AddToTail( spot ); + + scene->SetOrdinal( i ); + + tree->setLabel( spot, sz ); + + tree->setImages( spot, scene->GetIconIndex(), scene->GetIconIndex() ); + tree->setUserData( spot, scene ); + //tree->setOpen( spot, scene->IsExpanded() ); + + scene->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 ); +} + +void CProject::Checkout(bool updatestateicons /*= true*/) +{ + VSS_Checkout( GetFileName(), updatestateicons ); +} + +void CProject::Checkin(bool updatestateicons /*= true*/) +{ + VSS_Checkin( GetFileName(), updatestateicons ); +} + +bool CProject::IsCheckedOut() const +{ + return filesystem->IsFileWritable( GetFileName() ); +} + +int CProject::GetIconIndex() const +{ + if ( IsCheckedOut() ) + { + return IMAGE_PROJECT_CHECKEDOUT; + } + else + { + return IMAGE_PROJECT; + } +} + +bool CProject::IsChildFirst( ITreeItem *child ) +{ + int idx = m_Scenes.Find( (CScene *)child ); + if ( idx == m_Scenes.InvalidIndex() ) + return false; + + if ( idx != 0 ) + return false; + + return true; +} + +bool CProject::IsChildLast( ITreeItem *child ) +{ + int idx = m_Scenes.Find( (CScene *)child ); + if ( idx == m_Scenes.InvalidIndex() ) + return false; + + if ( idx != m_Scenes.Count() - 1 ) + return false; + + return true; +} + +void CProject::MoveChildUp( ITreeItem *child ) +{ + int c = GetSceneCount(); + for ( int i = 1; i < c; i++ ) + { + CScene *p = GetScene( i ); + if ( p != child ) + continue; + + CScene *prev = GetScene( i - 1 ); + // Swap + m_Scenes[ i - 1 ] = p; + m_Scenes[ i ] = prev; + return; + } +} + +void CProject::MoveChildDown( ITreeItem *child ) +{ + int c = GetSceneCount(); + for ( int i = 0; i < c - 1; i++ ) + { + CScene *p = GetScene( i ); + if ( p != child ) + continue; + + CScene *next = GetScene( i + 1 ); + // Swap + m_Scenes[ i ] = next; + m_Scenes[ i + 1 ] = p; + return; + } +} |