void SDetailsView::RemoveDeletedObjects( const TArray<UObject*>& DeletedObjects ) { TArray< TWeakObjectPtr< UObject > > NewObjectList; bool bObjectsRemoved = false; for(const TSharedPtr<FComplexPropertyNode>& ComplexRootNode : RootPropertyNodes) { FObjectPropertyNode* RootPropertyNode = ComplexRootNode->AsObjectNode(); // Scan all objects and look for objects which need to be replaced for ( TPropObjectIterator Itor( RootPropertyNode->ObjectIterator() ); Itor; ++Itor ) { if( DeletedObjects.Contains( Itor->Get() ) ) { // An object we had needs to be removed bObjectsRemoved = true; } else { // If the deleted object list does not contain the current object, its ok to keep it in the list NewObjectList.Add( Itor->Get() ); } } } // if any objects were replaced update the observed objects if( bObjectsRemoved ) { SetObjectArrayPrivate( NewObjectList ); } }
void SDetailsView::RemoveInvalidObjects() { TArray< TWeakObjectPtr< UObject > > ResetArray; bool bAllFound = true; for(const TSharedPtr<FComplexPropertyNode>& ComplexRootNode : RootPropertyNodes) { FObjectPropertyNode* RootPropertyNode = ComplexRootNode->AsObjectNode(); if(RootPropertyNode) { for(TPropObjectIterator Itor(RootPropertyNode->ObjectIterator()); Itor; ++Itor) { TWeakObjectPtr<UObject> Object = *Itor; if(Object.IsValid() && !Object->IsPendingKill()) { ResetArray.Add(Object); } else { bAllFound = false; } } } } if (!bAllFound) { SetObjectArrayPrivate(ResetArray); } }
void SDetailsView::SetObjects( const TArray< TWeakObjectPtr< UObject > >& InObjects, bool bForceRefresh/* = false*/, bool bOverrideLock/* = false*/ ) { if (!IsLocked() || bOverrideLock) { if( bForceRefresh || ShouldSetNewObjects( InObjects ) ) { SetObjectArrayPrivate( InObjects ); } } }
void SDetailsView::SetObjects( const TArray< TWeakObjectPtr< UObject > >& InObjects, bool bForceRefresh/* = false*/, bool bOverrideLock/* = false*/ ) { if (!IsLocked() || bOverrideLock) { // Temporary fix for UE-10298. It doesn't break API and can be used in 4.7.1. The line should restored in 4.8 // if( bForceRefresh || ShouldSetNewObjects( InObjects ) ) { SetObjectArrayPrivate( InObjects ); } } }
void SDetailsView::ForceRefresh() { TArray< TWeakObjectPtr< UObject > > NewObjectList; // Simply re-add the same existing objects to cause a refresh for ( TPropObjectIterator Itor( RootPropertyNode->ObjectIterator() ); Itor; ++Itor ) { TWeakObjectPtr<UObject> Object = *Itor; if( Object.IsValid() ) { NewObjectList.Add( Object.Get() ); } } SetObjectArrayPrivate( NewObjectList ); }
void SDetailsView::SetObjects( const TArray<UObject*>& InObjects, bool bForceRefresh/* = false*/, bool bOverrideLock/* = false*/ ) { if (!IsLocked() || bOverrideLock) { TArray< TWeakObjectPtr< UObject > > ObjectWeakPtrs; for( auto ObjectIter = InObjects.CreateConstIterator(); ObjectIter; ++ObjectIter ) { ObjectWeakPtrs.Add( *ObjectIter ); } if( bForceRefresh || ShouldSetNewObjects( ObjectWeakPtrs ) ) { SetObjectArrayPrivate( ObjectWeakPtrs ); } } }
void SDetailsView::SetObjects( const TArray<UObject*>& InObjects, bool bForceRefresh/* = false*/, bool bOverrideLock/* = false*/ ) { if (!IsLocked() || bOverrideLock) { TArray< TWeakObjectPtr< UObject > > ObjectWeakPtrs; for( auto ObjectIter = InObjects.CreateConstIterator(); ObjectIter; ++ObjectIter ) { ObjectWeakPtrs.Add( *ObjectIter ); } // Temporary fix for UE-10298. It doesn't break API and can be used in 4.7.1. The line should restored in 4.8 // if( bForceRefresh || ShouldSetNewObjects( ObjectWeakPtrs ) ) { SetObjectArrayPrivate( ObjectWeakPtrs ); } } }
void SDetailsView::ReplaceObjects( const TMap<UObject*, UObject*>& OldToNewObjectMap ) { TArray< TWeakObjectPtr< UObject > > NewObjectList; bool bObjectsReplaced = false; TArray< FObjectPropertyNode* > ObjectNodes; for(TSharedPtr<FComplexPropertyNode>& RootNode : RootPropertyNodes) { PropertyEditorHelpers::CollectObjectNodes(RootNode, ObjectNodes ); } for( int32 ObjectNodeIndex = 0; ObjectNodeIndex < ObjectNodes.Num(); ++ObjectNodeIndex ) { FObjectPropertyNode* CurrentNode = ObjectNodes[ObjectNodeIndex]; // Scan all objects and look for objects which need to be replaced for ( TPropObjectIterator Itor( CurrentNode->ObjectIterator() ); Itor; ++Itor ) { UObject* Replacement = OldToNewObjectMap.FindRef( Itor->Get() ); if( Replacement && Replacement->GetClass() == Itor->Get()->GetClass() ) { bObjectsReplaced = true; if( CurrentNode->IsRootNode() ) { // Note: only root objects count for the new object list. Sub-Objects (i.e components count as needing to be replaced but they don't belong in the top level object list NewObjectList.Add( Replacement ); } } else if( CurrentNode->IsRootNode() ) { // Note: only root objects count for the new object list. Sub-Objects (i.e components count as needing to be replaced but they don't belong in the top level object list NewObjectList.Add( Itor->Get() ); } } } if( bObjectsReplaced ) { SetObjectArrayPrivate( NewObjectList ); } }
void SDetailsView::ForceRefresh() { TArray< TWeakObjectPtr< UObject > > NewObjectList; const FRootPropertyNodeList& RootNodes = GetRootNodes(); for(const TSharedPtr<FComplexPropertyNode>& ComplexRootNode : RootNodes) { FObjectPropertyNode* RootNode = ComplexRootNode->AsObjectNode(); if(RootNode) { // Simply re-add the same existing objects to cause a refresh for(TPropObjectIterator Itor(RootNode->ObjectIterator()); Itor; ++Itor) { TWeakObjectPtr<UObject> Object = *Itor; if(Object.IsValid()) { NewObjectList.Add(Object.Get()); } } } } SetObjectArrayPrivate( NewObjectList ); }
void SDetailsView::RemoveInvalidObjects() { TArray< TWeakObjectPtr< UObject > > ResetArray; bool bAllFound = true; for (TPropObjectIterator Itor(RootPropertyNode->ObjectIterator()); Itor; ++Itor) { TWeakObjectPtr<UObject> Object = *Itor; if( Object.IsValid() && !Object->IsPendingKill() ) { ResetArray.Add(Object); } else { bAllFound = false; } } if (!bAllFound) { SetObjectArrayPrivate(ResetArray); } }