2014-12-07 19:09:38 -05:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
2014-03-14 14:13:41 -04:00
# pragma once
2015-07-07 10:31:39 -04:00
namespace DirectoryWatcher { class FFileCache ; }
2015-07-06 09:40:48 -04:00
/** Collection info for a given object - gives the collection name, as well as the reason this object is considered to be part of this collection */
struct FObjectCollectionInfo
{
explicit FObjectCollectionInfo ( const FCollectionNameType & InCollectionKey )
: CollectionKey ( InCollectionKey )
, Reason ( 0 )
{
}
FObjectCollectionInfo ( const FCollectionNameType & InCollectionKey , const ECollectionRecursionFlags : : Flags InReason )
: CollectionKey ( InCollectionKey )
, Reason ( InReason )
{
}
/** The key identifying the collection that contains this object */
FCollectionNameType CollectionKey ;
/** The reason(s) why this collection contains this object - this can be tested against the recursion mode when getting the collections for an object */
ECollectionRecursionFlags : : Flags Reason ;
} ;
typedef TMap < FCollectionNameType , TSharedRef < FCollection > > FAvailableCollectionsMap ;
typedef TMap < FGuid , FCollectionNameType > FGuidToCollectionNamesMap ;
typedef TMap < FName , TArray < FObjectCollectionInfo > > FCollectionObjectsMap ;
typedef TMap < FGuid , TArray < FGuid > > FCollectionHierarchyMap ;
/** Wraps up the lazy caching of the collection manager */
class FCollectionManagerCache
{
public :
FCollectionManagerCache ( FAvailableCollectionsMap & InAvailableCollections ) ;
/** Dirty the parts of the cache that need to change when a collection is added to our collection manager */
void HandleCollectionAdded ( ) ;
/** Dirty the parts of the cache that need to change when a collection is removed from our collection manager */
void HandleCollectionRemoved ( ) ;
/** Dirty the parts of the cache that need to change when a collection is modified */
void HandleCollectionChanged ( ) ;
/** Access the CachedCollectionNamesFromGuids map, ensuring that it is up-to-date */
const FGuidToCollectionNamesMap & GetCachedCollectionNamesFromGuids ( ) const ;
/** Access the CachedObjects map, ensuring that it is up-to-date */
const FCollectionObjectsMap & GetCachedObjects ( ) const ;
/** Access the CachedHierarchy map, ensuring that it is up-to-date */
const FCollectionHierarchyMap & GetCachedHierarchy ( ) const ;
enum class ERecursiveWorkerFlowControl : uint8
{
Stop ,
Continue ,
} ;
typedef TFunctionRef < ERecursiveWorkerFlowControl ( const FCollectionNameType & , ECollectionRecursionFlags : : Flag ) > FRecursiveWorkerFunc ;
void RecursionHelper_DoWork ( const FCollectionNameType & InCollectionKey , const ECollectionRecursionFlags : : Flags InRecursionMode , const FRecursiveWorkerFunc & InWorkerFunc ) const ;
ERecursiveWorkerFlowControl RecursionHelper_DoWorkOnParents ( const FCollectionNameType & InCollectionKey , const FRecursiveWorkerFunc & InWorkerFunc ) const ;
ERecursiveWorkerFlowControl RecursionHelper_DoWorkOnChildren ( const FCollectionNameType & InCollectionKey , const FRecursiveWorkerFunc & InWorkerFunc ) const ;
private :
/** Reference to the collections that are currently available in our owner collection manager */
FAvailableCollectionsMap & AvailableCollections ;
/** A map of collection GUIDs to their associated collection names */
mutable FGuidToCollectionNamesMap CachedCollectionNamesFromGuids_Internal ;
/** A map of object paths to their associated collection info - only objects that are in collections will appear in here */
mutable FCollectionObjectsMap CachedObjects_Internal ;
/** A map of parent collection GUIDs to their child collection GUIDs - only collections that have children will appear in here */
mutable FCollectionHierarchyMap CachedHierarchy_Internal ;
/** Flag to say whether the CachedCollectionNamesFromGuids map is dirty */
mutable bool bIsCachedCollectionNamesFromGuidsDirty : 1 ;
/** Flag to say whether the CachedObjects map is dirty */
mutable bool bIsCachedObjectsDirty : 1 ;
/** Flag to say whether the CachedHierarchy map is dirty */
mutable bool bIsCachedHierarchyDirty : 1 ;
} ;
2014-03-14 14:13:41 -04:00
class FCollectionManager : public ICollectionManager
{
public :
FCollectionManager ( ) ;
virtual ~ FCollectionManager ( ) ;
// ICollectionManager implementation
2015-05-29 13:15:23 -04:00
virtual bool HasCollections ( ) const override ;
2015-06-19 07:33:02 -04:00
virtual void GetCollections ( TArray < FCollectionNameType > & OutCollections ) const override ;
2014-06-13 06:14:46 -04:00
virtual void GetCollectionNames ( ECollectionShareType : : Type ShareType , TArray < FName > & CollectionNames ) const override ;
2015-06-19 07:33:02 -04:00
virtual void GetRootCollections ( TArray < FCollectionNameType > & OutCollections ) const override ;
virtual void GetRootCollectionNames ( ECollectionShareType : : Type ShareType , TArray < FName > & CollectionNames ) const override ;
virtual void GetChildCollections ( FName CollectionName , ECollectionShareType : : Type ShareType , TArray < FCollectionNameType > & OutCollections ) const override ;
virtual void GetChildCollectionNames ( FName CollectionName , ECollectionShareType : : Type ShareType , ECollectionShareType : : Type ChildShareType , TArray < FName > & CollectionNames ) const override ;
2015-07-01 11:36:19 -04:00
virtual TOptional < FCollectionNameType > GetParentCollection ( FName CollectionName , ECollectionShareType : : Type ShareType ) const override ;
2014-06-13 06:14:46 -04:00
virtual bool CollectionExists ( FName CollectionName , ECollectionShareType : : Type ShareType ) const override ;
2015-06-19 07:33:02 -04:00
virtual bool GetAssetsInCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , TArray < FName > & AssetPaths , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual bool GetObjectsInCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , TArray < FName > & ObjectPaths , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual bool GetClassesInCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , TArray < FName > & ClassPaths , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual void GetCollectionsContainingObject ( FName ObjectPath , ECollectionShareType : : Type ShareType , TArray < FName > & OutCollectionNames , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual void GetCollectionsContainingObject ( FName ObjectPath , TArray < FCollectionNameType > & OutCollections , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual void GetCollectionsContainingObjects ( const TArray < FName > & ObjectPaths , TMap < FCollectionNameType , TArray < FName > > & OutCollectionsAndMatchedObjects , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual FString GetCollectionsStringForObject ( FName ObjectPath , ECollectionShareType : : Type ShareType , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
2014-06-13 06:14:46 -04:00
virtual void CreateUniqueCollectionName ( const FName & BaseName , ECollectionShareType : : Type ShareType , FName & OutCollectionName ) const override ;
2015-07-02 12:20:22 -04:00
virtual bool IsValidCollectionName ( const FString & CollectionName , ECollectionShareType : : Type ShareType ) const override ;
2015-07-09 09:59:51 -04:00
virtual bool CreateCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , ECollectionStorageMode : : Type StorageMode ) override ;
2014-06-13 06:14:46 -04:00
virtual bool RenameCollection ( FName CurrentCollectionName , ECollectionShareType : : Type CurrentShareType , FName NewCollectionName , ECollectionShareType : : Type NewShareType ) override ;
2015-06-19 07:33:02 -04:00
virtual bool ReparentCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , FName ParentCollectionName , ECollectionShareType : : Type ParentShareType ) override ;
2014-06-13 06:14:46 -04:00
virtual bool DestroyCollection ( FName CollectionName , ECollectionShareType : : Type ShareType ) override ;
virtual bool AddToCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , FName ObjectPath ) override ;
2015-05-21 07:43:16 -04:00
virtual bool AddToCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , const TArray < FName > & ObjectPaths , int32 * OutNumAdded = nullptr ) override ;
2014-06-13 06:14:46 -04:00
virtual bool RemoveFromCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , FName ObjectPath ) override ;
2015-05-21 07:43:16 -04:00
virtual bool RemoveFromCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , const TArray < FName > & ObjectPaths , int32 * OutNumRemoved = nullptr ) override ;
2015-07-09 09:59:51 -04:00
virtual bool SetDynamicQueryText ( FName CollectionName , ECollectionShareType : : Type ShareType , const FString & InQueryText ) override ;
virtual bool GetDynamicQueryText ( FName CollectionName , ECollectionShareType : : Type ShareType , FString & OutQueryText ) const override ;
2015-07-09 14:24:02 -04:00
virtual bool TestDynamicQuery ( FName CollectionName , ECollectionShareType : : Type ShareType , const ITextFilterExpressionContext & InContext , bool & OutResult ) const override ;
2014-06-13 06:14:46 -04:00
virtual bool EmptyCollection ( FName CollectionName , ECollectionShareType : : Type ShareType ) override ;
2015-07-03 13:54:34 -04:00
virtual bool SaveCollection ( FName CollectionName , ECollectionShareType : : Type ShareType ) override ;
virtual bool UpdateCollection ( FName CollectionName , ECollectionShareType : : Type ShareType ) override ;
virtual bool GetCollectionStatusInfo ( FName CollectionName , ECollectionShareType : : Type ShareType , FCollectionStatusInfo & OutStatusInfo ) const override ;
2015-07-09 09:59:51 -04:00
virtual bool GetCollectionStorageMode ( FName CollectionName , ECollectionShareType : : Type ShareType , ECollectionStorageMode : : Type & OutStorageMode ) const override ;
2015-06-19 07:33:02 -04:00
virtual bool IsObjectInCollection ( FName ObjectPath , FName CollectionName , ECollectionShareType : : Type ShareType , ECollectionRecursionFlags : : Flags RecursionMode = ECollectionRecursionFlags : : Self ) const override ;
virtual bool IsValidParentCollection ( FName CollectionName , ECollectionShareType : : Type ShareType , FName ParentCollectionName , ECollectionShareType : : Type ParentShareType ) const override ;
2014-06-13 06:14:46 -04:00
virtual FText GetLastError ( ) const override { return LastError ; }
2015-06-26 13:13:02 -04:00
virtual void HandleFixupRedirectors ( ICollectionRedirectorFollower & InRedirectorFollower ) override ;
virtual bool HandleRedirectorDeleted ( const FName & ObjectPath ) override ;
virtual void HandleObjectRenamed ( const FName & OldObjectPath , const FName & NewObjectPath ) override ;
virtual void HandleObjectDeleted ( const FName & ObjectPath ) override ;
2014-03-14 14:13:41 -04:00
/** Event for when collections are created */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FCollectionCreatedEvent , FCollectionCreatedEvent ) ;
2014-06-13 06:14:46 -04:00
virtual FCollectionCreatedEvent & OnCollectionCreated ( ) override { return CollectionCreatedEvent ; }
2014-03-14 14:13:41 -04:00
/** Event for when collections are destroyed */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FCollectionDestroyedEvent , FCollectionDestroyedEvent ) ;
2014-06-13 06:14:46 -04:00
virtual FCollectionDestroyedEvent & OnCollectionDestroyed ( ) override { return CollectionDestroyedEvent ; }
2014-03-14 14:13:41 -04:00
/** Event for when assets are added to a collection */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FAssetsAddedEvent , FAssetsAddedEvent ) ;
2014-06-13 06:14:46 -04:00
virtual FAssetsAddedEvent & OnAssetsAdded ( ) override { return AssetsAddedEvent ; }
2014-03-14 14:13:41 -04:00
/** Event for when assets are removed to a collection */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FAssetsRemovedEvent , FAssetsRemovedEvent ) ;
2014-06-13 06:14:46 -04:00
virtual FAssetsRemovedEvent & OnAssetsRemoved ( ) override { return AssetsRemovedEvent ; }
2014-03-14 14:13:41 -04:00
/** Event for when collections are renamed */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FCollectionRenamedEvent , FCollectionRenamedEvent ) ;
2014-06-13 06:14:46 -04:00
virtual FCollectionRenamedEvent & OnCollectionRenamed ( ) override { return CollectionRenamedEvent ; }
2014-03-14 14:13:41 -04:00
2015-06-19 07:33:02 -04:00
/** Event for when collections are re-parented */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FCollectionReparentedEvent , FCollectionReparentedEvent ) ;
virtual FCollectionReparentedEvent & OnCollectionReparented ( ) override { return CollectionReparentedEvent ; }
2015-07-03 13:54:34 -04:00
/** Event for when collections is updated, or otherwise changed and we can't tell exactly how (eg, after updating from source control and merging) */
DECLARE_DERIVED_EVENT ( FCollectionManager , ICollectionManager : : FCollectionUpdatedEvent , FCollectionUpdatedEvent ) ;
virtual FCollectionUpdatedEvent & OnCollectionUpdated ( ) override { return CollectionUpdatedEvent ; }
2014-03-14 14:13:41 -04:00
private :
2015-07-07 10:31:39 -04:00
/** Tick this collection manager so it can process any file cache events */
bool TickFileCache ( float InDeltaTime ) ;
2014-03-14 14:13:41 -04:00
/** Loads all collection files from disk */
void LoadCollections ( ) ;
/** Returns true if the specified share type requires source control */
bool ShouldUseSCC ( ECollectionShareType : : Type ShareType ) const ;
2015-06-19 07:33:02 -04:00
/** Given a collection name and share type, work out the full filename for the collection to use on disk */
FString GetCollectionFilename ( const FName & InCollectionName , const ECollectionShareType : : Type InCollectionShareType ) const ;
2014-03-14 14:13:41 -04:00
/** Adds a collection to the lookup maps */
2015-05-21 07:43:16 -04:00
bool AddCollection ( const TSharedRef < FCollection > & CollectionRef , ECollectionShareType : : Type ShareType ) ;
2014-03-14 14:13:41 -04:00
/** Removes a collection from the lookup maps */
2015-05-21 07:43:16 -04:00
bool RemoveCollection ( const TSharedRef < FCollection > & CollectionRef , ECollectionShareType : : Type ShareType ) ;
2014-03-14 14:13:41 -04:00
2015-07-03 13:54:34 -04:00
/** Removes an object from any collections that contain it */
void RemoveObjectFromCollections ( const FName & ObjectPath , TArray < FCollectionNameType > & OutUpdatedCollections ) ;
/** Replaces an object with another in any collections that contain it */
void ReplaceObjectInCollections ( const FName & OldObjectPath , const FName & NewObjectPath , TArray < FCollectionNameType > & OutUpdatedCollections ) ;
2014-03-14 14:13:41 -04:00
private :
/** The folders that contain collections */
FString CollectionFolders [ ECollectionShareType : : CST_All ] ;
/** The extension used for collection files */
FString CollectionExtension ;
2015-07-07 10:31:39 -04:00
/** Array of file cache instances that are watching for the collection files changing on disk */
TSharedPtr < DirectoryWatcher : : FFileCache > CollectionFileCaches [ ECollectionShareType : : CST_All ] ;
/** Delegate handle for the TickFileCache function */
FDelegateHandle TickFileCacheDelegateHandle ;
2014-03-14 14:13:41 -04:00
/** A map of collection names to FCollection objects */
2015-07-06 09:40:48 -04:00
TMap < FCollectionNameType , TSharedRef < FCollection > > AvailableCollections ;
2014-03-14 14:13:41 -04:00
2015-07-06 09:40:48 -04:00
/** The lazily updated cache for this collection manager */
FCollectionManagerCache CollectionCache ;
2015-05-29 13:15:23 -04:00
2014-03-14 14:13:41 -04:00
/** The most recent error that occurred */
2015-05-21 07:43:16 -04:00
mutable FText LastError ;
2014-03-14 14:13:41 -04:00
/** Event for when assets are added to a collection */
FAssetsAddedEvent AssetsAddedEvent ;
/** Event for when assets are removed from a collection */
FAssetsRemovedEvent AssetsRemovedEvent ;
/** Event for when collections are renamed */
FCollectionRenamedEvent CollectionRenamedEvent ;
2015-06-19 07:33:02 -04:00
/** Event for when collections are re-parented */
FCollectionReparentedEvent CollectionReparentedEvent ;
2015-07-03 13:54:34 -04:00
/** Event for when collections are updated, or otherwise changed and we can't tell exactly how (eg, after updating from source control and merging) */
FCollectionUpdatedEvent CollectionUpdatedEvent ;
2014-03-14 14:13:41 -04:00
/** Event for when collections are created */
FCollectionCreatedEvent CollectionCreatedEvent ;
/** Event for when collections are destroyed */
FCollectionDestroyedEvent CollectionDestroyedEvent ;
2015-05-21 07:43:16 -04:00
} ;