bool FLevelModel::AttachTo(TSharedPtr<FLevelModel> InParent) { if (LevelCollectionModel.IsReadOnly() || !IsLoaded() || IsPersistent() || InParent.IsValid() == false || InParent.Get() == this || HasDescendant(InParent)) { return false; } TSharedPtr<FLevelModel> CurrentParent = GetParent(); if (CurrentParent.IsValid()) { CurrentParent->RemoveChild(this->AsShared()); } Parent = InParent; CurrentParent = GetParent(); if (CurrentParent.IsValid()) { CurrentParent->AddChild(this->AsShared()); } OnParentChanged(); return true; }
void FNativeClassHierarchy::AddClass(UClass* InClass, const TSet<FName>& InGameModules, const TMap<FName, FName>& InPluginModules, FAddClassMetrics& AddClassMetrics) { // Ignore deprecated and temporary classes if(InClass->HasAnyClassFlags(CLASS_Deprecated | CLASS_NewerVersionExists) || FKismetEditorUtilities::IsClassABlueprintSkeleton(InClass)) { return; } const FName ClassModuleName = GetClassModuleName(InClass); if(ClassModuleName.IsNone()) { return; } static const FName ModuleRelativePathMetaDataKey = "ModuleRelativePath"; const FString& ClassModuleRelativeIncludePath = InClass->GetMetaData(ModuleRelativePathMetaDataKey); if(ClassModuleRelativeIncludePath.IsEmpty()) { return; } // Work out which root this class should go under const FName RootNodeName = GetClassPathRootForModule(ClassModuleName, InGameModules, InPluginModules); // Work out the final path to this class within the hierarchy (which isn't the same as the path on disk) const FString ClassModuleRelativePath = ClassModuleRelativeIncludePath.Left(ClassModuleRelativeIncludePath.Find(TEXT("/"), ESearchCase::CaseSensitive, ESearchDir::FromEnd)); const FString ClassHierarchyPath = ClassModuleName.ToString() + TEXT("/") + ClassModuleRelativePath; // Ensure we've added a valid root node TSharedPtr<FNativeClassHierarchyNode>& RootNode = RootNodes.FindOrAdd(RootNodeName); if(!RootNode.IsValid()) { RootNode = FNativeClassHierarchyNode::MakeFolderEntry(RootNodeName, TEXT("/") + RootNodeName.ToString()); ++AddClassMetrics.NumFoldersAdded; } // Split the class path and ensure we have nodes for each part TArray<FString> HierarchyPathParts; ClassHierarchyPath.ParseIntoArray(HierarchyPathParts, TEXT("/"), true); TSharedPtr<FNativeClassHierarchyNode> CurrentNode = RootNode; for(const FString& HierarchyPathPart : HierarchyPathParts) { const FName HierarchyPathPartName = *HierarchyPathPart; TSharedPtr<FNativeClassHierarchyNode>& ChildNode = CurrentNode->Children.FindOrAdd(FNativeClassHierarchyNodeKey(HierarchyPathPartName, ENativeClassHierarchyNodeType::Folder)); if(!ChildNode.IsValid()) { ChildNode = FNativeClassHierarchyNode::MakeFolderEntry(HierarchyPathPartName, CurrentNode->EntryPath + TEXT("/") + HierarchyPathPart); ++AddClassMetrics.NumFoldersAdded; } CurrentNode = ChildNode; } // Now add the final entry for the class CurrentNode->AddChild(FNativeClassHierarchyNode::MakeClassEntry(InClass, ClassModuleName, ClassModuleRelativePath, CurrentNode->EntryPath + TEXT("/") + InClass->GetName())); ++AddClassMetrics.NumClassesAdded; }
void FStreamingLevelCollectionModel::OnLevelsCollectionChanged() { InvalidSelectedLevels.Empty(); // We have to have valid world if (!CurrentWorld.IsValid()) { return; } // Add model for a persistent level TSharedPtr<FStreamingLevelModel> PersistentLevelModel = MakeShareable(new FStreamingLevelModel(Editor, *this, NULL)); PersistentLevelModel->SetLevelExpansionFlag(true); RootLevelsList.Add(PersistentLevelModel); AllLevelsList.Add(PersistentLevelModel); AllLevelsMap.Add(PersistentLevelModel->GetLongPackageName(), PersistentLevelModel); // Add models for each streaming level in the world for (auto It = CurrentWorld->StreamingLevels.CreateConstIterator(); It; ++It) { ULevelStreaming* StreamingLevel = (*It); if (StreamingLevel != NULL) { TSharedPtr<FStreamingLevelModel> LevelModel = MakeShareable(new FStreamingLevelModel(Editor, *this, StreamingLevel)); AllLevelsList.Add(LevelModel); AllLevelsMap.Add(LevelModel->GetLongPackageName(), LevelModel); PersistentLevelModel->AddChild(LevelModel); LevelModel->SetParent(PersistentLevelModel); } } FLevelCollectionModel::OnLevelsCollectionChanged(); // Sync levels selection to world SetSelectedLevelsFromWorld(); }