From 27f0aa7f137babf9097bf90d8fcbdf42a692ac06 Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Wed, 10 Nov 2021 14:43:32 -0800 Subject: [PATCH] LYN-7468 | Viewport manipulators for the container of the focused prefab should be hidden (#5432) * Extend the level entity behavior to open prefab containers in focus mode. Disable manipulators for these entities too. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Minor adjustments Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Fix enum casing in Entity Inspector. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Split views between for Level and FocusedContainer entities. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Slightly different fix to support components on focused containers. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Minor fixesto RefreshSelectedEntityIds. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../Prefab/PrefabFocusHandler.cpp | 16 ++--- .../PropertyEditor/EntityPropertyEditor.cpp | 68 +++++++++++++++---- .../PropertyEditor/EntityPropertyEditor.hxx | 12 ++-- .../EditorTransformComponentSelection.cpp | 11 +++ 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp index 8098727177..5b51944a75 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp @@ -175,20 +175,14 @@ namespace AzToolsFramework::Prefab m_focusedInstance = focusedInstance; m_focusedTemplateId = focusedInstance->get().GetTemplateId(); - AZ::EntityId containerEntityId; - - if (focusedInstance->get().GetParentInstance() != AZStd::nullopt) - { - containerEntityId = focusedInstance->get().GetContainerEntityId(); - } - else - { - containerEntityId = AZ::EntityId(); - } - // Focus on the descendants of the container entity in the Editor, if the interface is initialized. if (m_focusModeInterface) { + const AZ::EntityId containerEntityId = + (focusedInstance->get().GetParentInstance() != AZStd::nullopt) + ? focusedInstance->get().GetContainerEntityId() + : AZ::EntityId(); + m_focusModeInterface->SetFocusRoot(containerEntityId); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp index a449fa0055..29bc106eed 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp @@ -45,6 +45,7 @@ AZ_POP_DISABLE_WARNING #include #include #include +#include #include #include #include @@ -894,25 +895,51 @@ namespace AzToolsFramework { if (!m_prefabsAreEnabled) { - return m_isLevelEntityEditor ? InspectorLayout::LEVEL : InspectorLayout::ENTITY; + return m_isLevelEntityEditor ? InspectorLayout::Level : InspectorLayout::Entity; } + // Prefabs layout logic + + // If this is the container entity for the root instance, treat it like a level entity. AZ::EntityId levelContainerEntityId = m_prefabPublicInterface->GetLevelInstanceContainerEntityId(); if (AZStd::find(m_selectedEntityIds.begin(), m_selectedEntityIds.end(), levelContainerEntityId) != m_selectedEntityIds.end()) { if (m_selectedEntityIds.size() > 1) { - return InspectorLayout::INVALID; + return InspectorLayout::Invalid; } else { - return InspectorLayout::LEVEL; + return InspectorLayout::Level; } } else { - return InspectorLayout::ENTITY; + // If this is the container entity for the currently focused prefab, utilize a separate layout. + if (auto prefabFocusPublicInterface = AZ::Interface::Get()) + { + AzFramework::EntityContextId editorEntityContextId = AzFramework::EntityContextId::CreateNull(); + EditorEntityContextRequestBus::BroadcastResult( + editorEntityContextId, &EditorEntityContextRequests::GetEditorEntityContextId); + + AZ::EntityId focusedPrefabContainerEntityId = + prefabFocusPublicInterface->GetFocusedPrefabContainerEntityId(editorEntityContextId); + if (AZStd::find(m_selectedEntityIds.begin(), m_selectedEntityIds.end(), focusedPrefabContainerEntityId) != + m_selectedEntityIds.end()) + { + if (m_selectedEntityIds.size() > 1) + { + return InspectorLayout::Invalid; + } + else + { + return InspectorLayout::ContainerEntityOfFocusedPrefab; + } + } + } } + + return InspectorLayout::Entity; } void EntityPropertyEditor::UpdateEntityDisplay() @@ -921,7 +948,7 @@ namespace AzToolsFramework InspectorLayout layout = GetCurrentInspectorLayout(); - if (layout == InspectorLayout::LEVEL) + if (!m_prefabsAreEnabled && layout == InspectorLayout::Level) { AZStd::string levelName; AzToolsFramework::EditorRequestBus::BroadcastResult(levelName, &AzToolsFramework::EditorRequests::GetLevelName); @@ -963,14 +990,19 @@ namespace AzToolsFramework InspectorLayout layout = GetCurrentInspectorLayout(); - if (layout == InspectorLayout::LEVEL) + if (layout == InspectorLayout::Level) { // The Level Inspector should only have a list of selectable components after the // level entity itself is valid (i.e. "selected"). return selection.empty() ? SelectionEntityTypeInfo::None : SelectionEntityTypeInfo::LevelEntity; } - if (layout == InspectorLayout::INVALID) + if (layout == InspectorLayout::ContainerEntityOfFocusedPrefab) + { + return selection.empty() ? SelectionEntityTypeInfo::None : SelectionEntityTypeInfo::ContainerEntityOfFocusedPrefab; + } + + if (layout == InspectorLayout::Invalid) { return SelectionEntityTypeInfo::Mixed; } @@ -1140,7 +1172,8 @@ namespace AzToolsFramework } } - bool isLevelLayout = GetCurrentInspectorLayout() == InspectorLayout::LEVEL; + bool isLevelLayout = GetCurrentInspectorLayout() == InspectorLayout::Level; + bool isContainerOfFocusedPrefabLayout = GetCurrentInspectorLayout() == InspectorLayout::ContainerEntityOfFocusedPrefab; m_gui->m_entityDetailsLabel->setText(entityDetailsLabelText); m_gui->m_entityDetailsLabel->setVisible(entityDetailsVisible); @@ -1148,10 +1181,14 @@ namespace AzToolsFramework m_gui->m_entityNameLabel->setVisible(hasEntitiesDisplayed); m_gui->m_entityIcon->setVisible(hasEntitiesDisplayed); m_gui->m_pinButton->setVisible(m_overrideSelectedEntityIds.empty() && hasEntitiesDisplayed && !m_isSystemEntityEditor); - m_gui->m_statusLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); - m_gui->m_statusComboBox->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); - m_gui->m_entityIdLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); - m_gui->m_entityIdText->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_statusLabel->setVisible( + hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_statusComboBox->setVisible( + hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_entityIdLabel->setVisible( + hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_entityIdText->setVisible( + hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); bool displayComponentSearchBox = hasEntitiesDisplayed; if (hasEntitiesDisplayed) @@ -1159,7 +1196,9 @@ namespace AzToolsFramework // Build up components to display SharedComponentArray sharedComponentArray; BuildSharedComponentArray(sharedComponentArray, - !(selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyStandardEntities || selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyPrefabEntities)); + !(selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyStandardEntities || + selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyPrefabEntities) || + selectionEntityTypeInfo == SelectionEntityTypeInfo::ContainerEntityOfFocusedPrefab); if (sharedComponentArray.size() == 0) { @@ -1175,7 +1214,8 @@ namespace AzToolsFramework UpdateEntityDisplay(); } - m_gui->m_darkBox->setVisible(displayComponentSearchBox && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_darkBox->setVisible( + displayComponentSearchBox && !m_isSystemEntityEditor && !isLevelLayout && !isContainerOfFocusedPrefabLayout); m_gui->m_entitySearchBox->setVisible(displayComponentSearchBox); bool displayAddComponentMenu = CanAddComponentsToSelection(selectionEntityTypeInfo); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx index 5279cefa9f..8dd0ffc4ee 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx @@ -354,7 +354,8 @@ namespace AzToolsFramework OnlyLayerEntities, OnlyPrefabEntities, Mixed, - LevelEntity + LevelEntity, + ContainerEntityOfFocusedPrefab }; /** * Returns what kinds of entities are in the current selection. This is used because mixed selection @@ -364,7 +365,7 @@ namespace AzToolsFramework SelectionEntityTypeInfo GetSelectionEntityTypeInfo(const EntityIdList& selection) const; /** - * Returns true if a selection matching the passed in selection informatation allows components to be added. + * Returns true if a selection matching the passed in selection information allows components to be added. */ bool CanAddComponentsToSelection(const SelectionEntityTypeInfo& selectionEntityTypeInfo) const; @@ -581,9 +582,10 @@ namespace AzToolsFramework enum class InspectorLayout { - ENTITY = 0, // All selected entities are regular entities - LEVEL, // The selected entity is the level prefab container entity - INVALID // Other entities are selected alongside the level prefab container entity + Entity = 0, // All selected entities are regular entities. + Level, // The selected entity is the prefab container entity for the level prefab, or the slice level entity. + ContainerEntityOfFocusedPrefab, // The selected entity is the prefab container entity for the focused prefab. + Invalid // Other entities are selected alongside the level prefab container entity. }; InspectorLayout GetCurrentInspectorLayout() const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 39c882b766..084b489aa1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -3604,6 +3605,16 @@ namespace AzToolsFramework m_selectedEntityIds.clear(); m_selectedEntityIds.reserve(selectedEntityIds.size()); AZStd::copy(selectedEntityIds.begin(), selectedEntityIds.end(), AZStd::inserter(m_selectedEntityIds, m_selectedEntityIds.end())); + + // Do not create manipulators for the container entity of the focused prefab. + if (auto prefabFocusPublicInterface = AZ::Interface::Get()) + { + AzFramework::EntityContextId editorEntityContextId = GetEntityContextId(); + if (AZ::EntityId focusRoot = prefabFocusPublicInterface->GetFocusedPrefabContainerEntityId(editorEntityContextId); focusRoot.IsValid()) + { + m_selectedEntityIds.erase(focusRoot); + } + } } void EditorTransformComponentSelection::OnTransformChanged(