diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index 1e9cc35230..46c3eaefe4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -89,7 +89,7 @@ namespace AzToolsFramework if (!RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, commonRootEntityOwningInstance->get(), entities, instances)) { return AZ::Failure( - AZStd::string("Could not create a new prefab out of the entities provided - entities do not share a common root.")); + AZStd::string("Could not create a new prefab out of the entities provided - invalid selection.")); } // When we create a prefab with other prefab instances, we have to remove the existing links between the source and @@ -142,9 +142,13 @@ namespace AzToolsFramework // Mark them as dirty so this change is correctly applied to the template for (AZ::Entity* topLevelEntity : topLevelEntities) { - m_prefabUndoCache.UpdateCache(topLevelEntity->GetId()); - undoBatch.MarkEntityDirty(topLevelEntity->GetId()); - AZ::TransformBus::Event(topLevelEntity->GetId(), &AZ::TransformBus::Events::SetParent, containerEntityId); + AZ::EntityId topLevelEntityId = topLevelEntity->GetId(); + if (topLevelEntityId.IsValid() && !IsLevelInstanceContainerEntity(topLevelEntityId)) + { + m_prefabUndoCache.UpdateCache(topLevelEntityId); + undoBatch.MarkEntityDirty(topLevelEntityId); + AZ::TransformBus::Event(topLevelEntityId, &AZ::TransformBus::Events::SetParent, containerEntityId); + } } // Select Container Entity @@ -223,6 +227,14 @@ namespace AzToolsFramework // Retrieve entityList from entityIds inputEntityList = EntityIdListToEntityList(entityIds); + // Remove Level Container Entity if it's part of the list + AZ::Entity* levelEntity = GetEntityById(GetLevelInstanceContainerEntityId()); + auto levelEntityIter = AZStd::find(inputEntityList.begin(), inputEntityList.end(), levelEntity); + if (levelEntityIter != inputEntityList.end()) + { + inputEntityList.erase(levelEntityIter); + } + // Find common root and top level entities bool entitiesHaveCommonRoot = false; @@ -840,7 +852,7 @@ namespace AzToolsFramework outInstances.push_back(AZStd::move(commonRootEntityOwningInstance.DetachNestedInstance(instancePtr->GetInstanceAlias()))); } - return true; + return (outEntities.size() + outInstances.size()) > 0; } bool PrefabPublicHandler::EntitiesBelongToSameInstance(const EntityIdList& entityIds) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 6ce3fdc755..71354b8a1b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -151,32 +151,36 @@ namespace AzToolsFramework { if (!selectedEntities.empty()) { - bool layerInSelection = false; - - for (AZ::EntityId entityId : selectedEntities) + // Hide if the only selected entity is the Level Container + if (selectedEntities.size() > 1 || !s_prefabPublicInterface->IsLevelInstanceContainerEntity(selectedEntities[0])) { - if (!layerInSelection) - { - AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - layerInSelection, entityId, - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); + bool layerInSelection = false; - if (layerInSelection) + for (AZ::EntityId entityId : selectedEntities) + { + if (!layerInSelection) { - break; + AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( + layerInSelection, entityId, + &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); + + if (layerInSelection) + { + break; + } } } - } - // Layers can't be in prefabs. - if (!layerInSelection) - { - QAction* createAction = menu->addAction(QObject::tr("Create Prefab...")); - createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities.")); + // Layers can't be in prefabs. + if (!layerInSelection) + { + QAction* createAction = menu->addAction(QObject::tr("Create Prefab...")); + createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities.")); - QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] { - ContextMenu_CreatePrefab(selectedEntities); - }); + QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] { + ContextMenu_CreatePrefab(selectedEntities); + }); + } } } }