From 4ae95719dee570926fd29696f66f04fde2f66d5f Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Wed, 22 Sep 2021 12:44:18 -0700 Subject: [PATCH] Initialization changes to pass unit tests. Some interfaces are now retrieved on demand and there's clearer failure paths that don't involve asserts to better handle test/headless initializations. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../FocusMode/FocusModeSystemComponent.cpp | 8 +-- .../FocusMode/FocusModeSystemComponent.h | 2 +- .../Prefab/PrefabFocusHandler.cpp | 49 +++++++++++-------- .../Prefab/PrefabFocusHandler.h | 11 +---- .../Prefab/PrefabPublicHandler.h | 4 ++ .../Prefab/PrefabSystemComponent.cpp | 1 - .../Prefab/PrefabSystemComponent.h | 4 -- 7 files changed, 37 insertions(+), 42 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp index 450e19da3e..e08191032d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp @@ -31,22 +31,18 @@ namespace AzToolsFramework return IsInFocusSubTree(parentId, focusRootId); } - FocusModeSystemComponent::~FocusModeSystemComponent() - { - AZ::Interface::Unregister(this); - } - void FocusModeSystemComponent::Init() { - AZ::Interface::Register(this); } void FocusModeSystemComponent::Activate() { + AZ::Interface::Register(this); } void FocusModeSystemComponent::Deactivate() { + AZ::Interface::Unregister(this); } void FocusModeSystemComponent::Reflect([[maybe_unused]] AZ::ReflectContext* context) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h index 9943d72951..697a4ff998 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h @@ -26,7 +26,7 @@ namespace AzToolsFramework AZ_COMPONENT(FocusModeSystemComponent, "{6CE522FE-2057-4794-BD05-61E04BD8EA30}"); FocusModeSystemComponent() = default; - virtual ~FocusModeSystemComponent(); + virtual ~FocusModeSystemComponent() = default; // AZ::Component overrides ... void Init() override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp index f74029aa73..2338c8892b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp @@ -14,15 +14,8 @@ namespace AzToolsFramework::Prefab { - PrefabFocusHandler::~PrefabFocusHandler() + PrefabFocusHandler::PrefabFocusHandler() { - AZ::Interface::Unregister(this); - } - - void PrefabFocusHandler::Initialize() - { - m_focusModeInterface = AZ::Interface::Get(); - m_instanceEntityMapperInterface = AZ::Interface::Get(); AZ_Assert( m_instanceEntityMapperInterface, @@ -30,21 +23,35 @@ namespace AzToolsFramework::Prefab "Instance Entity Mapper Interface could not be found. " "Check that it is being correctly initialized."); - m_prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AZ_Assert( - m_prefabEditorEntityOwnershipInterface, - "Prefab - PrefabFocusHandler - " - "Prefab Editor Entity Ownership Interface could not be found. " - "Check that it is being correctly initialized."); - AZ::Interface::Register(this); } + PrefabFocusHandler::~PrefabFocusHandler() + { + AZ::Interface::Unregister(this); + } + PrefabFocusOperationResult PrefabFocusHandler::FocusOnOwningPrefab(AZ::EntityId entityId) { - InstanceOptionalReference focusedInstance = (entityId == AZ::EntityId()) - ? m_prefabEditorEntityOwnershipInterface->GetRootPrefabInstance() - : m_instanceEntityMapperInterface->FindOwningInstance(entityId); + InstanceOptionalReference focusedInstance; + + if (entityId == AZ::EntityId()) + { + PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface = + AZ::Interface::Get(); + + if(!prefabEditorEntityOwnershipInterface) + { + return AZ::Failure(AZStd::string("Could not focus on root prefab instance - internal error " + "(PrefabEditorEntityOwnershipInterface unavailable).")); + } + + focusedInstance = prefabEditorEntityOwnershipInterface->GetRootPrefabInstance(); + } + else + { + focusedInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + } if (!focusedInstance.has_value()) { @@ -54,9 +61,11 @@ namespace AzToolsFramework::Prefab m_focusedInstance = focusedInstance; m_focusedTemplateId = focusedInstance->get().GetTemplateId(); - if (m_focusModeInterface) + + FocusModeInterface* focusModeInterface = AZ::Interface::Get(); + if (focusModeInterface) { - m_focusModeInterface->SetFocusRoot(focusedInstance->get().GetContainerEntityId()); + focusModeInterface->SetFocusRoot(focusedInstance->get().GetContainerEntityId()); } return AZ::Success(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.h index b465f97908..fa7727894d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.h @@ -14,12 +14,6 @@ #include #include -namespace AzToolsFramework -{ - class FocusModeInterface; - class PrefabEditorEntityOwnershipInterface; -} - namespace AzToolsFramework::Prefab { class InstanceEntityMapperInterface; @@ -31,10 +25,9 @@ namespace AzToolsFramework::Prefab public: AZ_CLASS_ALLOCATOR(PrefabFocusHandler, AZ::SystemAllocator, 0); + PrefabFocusHandler(); ~PrefabFocusHandler(); - void Initialize(); - // PrefabFocusInterface override ... PrefabFocusOperationResult FocusOnOwningPrefab(AZ::EntityId entityId) override; TemplateId GetFocusedPrefabTemplateId() override; @@ -45,9 +38,7 @@ namespace AzToolsFramework::Prefab InstanceOptionalReference m_focusedInstance; TemplateId m_focusedTemplateId; - FocusModeInterface* m_focusModeInterface; InstanceEntityMapperInterface* m_instanceEntityMapperInterface; - PrefabEditorEntityOwnershipInterface* m_prefabEditorEntityOwnershipInterface; }; } // namespace AzToolsFramework::Prefab diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h index 42b6bc1666..f3c0e67d46 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -189,6 +190,9 @@ namespace AzToolsFramework PrefabLoaderInterface* m_prefabLoaderInterface = nullptr; PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; + // Handles the Prefab Focus API that determines what prefab is being edited. + PrefabFocusHandler m_prefabFocusHandler; + // Caches entity states for undo/redo purposes PrefabUndoCache m_prefabUndoCache; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 7220cf3cce..0d2696f14b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -34,7 +34,6 @@ namespace AzToolsFramework m_prefabLoader.RegisterPrefabLoaderInterface(); m_instanceUpdateExecutor.RegisterInstanceUpdateExecutorInterface(); m_instanceToTemplatePropagator.RegisterInstanceToTemplateInterface(); - m_prefabFocusHandler.Initialize(); m_prefabPublicHandler.RegisterPrefabPublicHandlerInterface(); m_prefabPublicRequestHandler.Connect(); AZ::SystemTickBus::Handler::BusConnect(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index a9e16374e9..746c306c2b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -379,9 +378,6 @@ namespace AzToolsFramework // Used for loading/saving Prefab Template files. PrefabLoader m_prefabLoader; - // Handles the Prefab Focus API that determines what prefab is being edited. - PrefabFocusHandler m_prefabFocusHandler; - // Handles the public Prefab API used by UI and scripting. PrefabPublicHandler m_prefabPublicHandler;