Move Component editor mode logic to ComponentModeCollection.

Signed-off-by: John <jonawals@amazon.com>
This commit is contained in:
John
2021-09-22 16:46:44 +01:00
parent beaa90a968
commit 4909c91614
3 changed files with 24 additions and 16 deletions
@@ -9,6 +9,7 @@
#include "ComponentModeCollection.h"
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzToolsFramework/API/ViewportEditorModeTrackerInterface.h>
#include <AzToolsFramework/Commands/ComponentModeCommand.h>
namespace AzToolsFramework
@@ -119,6 +120,11 @@ namespace AzToolsFramework
}
};
ComponentModeCollection::ComponentModeCollection(ViewportEditorModeTrackerInterface* viewportEditorModeTracker)
: m_viewportEditorModeTracker(viewportEditorModeTracker)
{
}
void ComponentModeCollection::AddComponentMode(
const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Uuid componentType,
const ComponentModeFactoryFunction& componentModeBuilder)
@@ -209,6 +215,14 @@ namespace AzToolsFramework
GetEntityContextId(), &EditorComponentModeNotifications::EnteredComponentMode,
m_activeComponentTypes);
// this call to activate the component mode editor state should eventually replace the bus call in
// ComponentModeCollection::BeginComponentMode() to EditorComponentModeNotifications::EnteredComponentMode
// such that all of the notifications for activating/deactivating the different editor modes are in a central location
if (m_viewportEditorModeTracker)
{
m_viewportEditorModeTracker->ActivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Component);
}
// enable actions for the first/primary ComponentMode
// note: if multiple ComponentModes are activated at the same time, actions
// are not available together, the 'active' mode will bind its actions one at a time
@@ -282,6 +296,13 @@ namespace AzToolsFramework
&EditorComponentModeNotifications::LeftComponentMode,
m_activeComponentTypes);
// this call to deactivate the component mode editor state should eventually replace the bus call in
// ComponentModeCollection::EndComponentMode() to EditorComponentModeNotifications::LeftComponentMode
// such that all of the notifications for activating/deactivating the different editor modes are in a central location
if (m_viewportEditorModeTracker)
{
m_viewportEditorModeTracker->DeactivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Component);
}
// clear stored modes and builders for this ComponentMode
// TLDR: avoid 'use after free' error
@@ -15,6 +15,7 @@
namespace AzToolsFramework
{
class EditorMetricsEventsBusTraits;
class ViewportEditorModeTrackerInterface;
namespace ComponentModeFramework
{
@@ -26,6 +27,7 @@ namespace AzToolsFramework
/// @cond
ComponentModeCollection() = default;
ComponentModeCollection(ViewportEditorModeTrackerInterface* viewportEditorModeTracker);
~ComponentModeCollection() = default;
ComponentModeCollection(const ComponentModeCollection&) = delete;
ComponentModeCollection& operator=(const ComponentModeCollection&) = delete;
@@ -101,6 +103,7 @@ namespace AzToolsFramework
size_t m_selectedComponentModeIndex = 0; ///< Index into the array of active ComponentModes, current index is 'selected' ComponentMode.
bool m_adding = false; ///< Are we currently adding individual ComponentModes to the Editor wide ComponentMode.
bool m_componentMode = false; ///< Editor (global) ComponentMode flag - is ComponentMode active or not.
ViewportEditorModeTrackerInterface* m_viewportEditorModeTracker = nullptr; //!< Tracker for activating/deactivating viewport editor modes.
};
} // namespace ComponentModeFramework
} // namespace AzToolsFramework
@@ -107,14 +107,6 @@ namespace AzToolsFramework
m_componentModeCollection.BeginComponentMode();
// this call to activate the component mode editor state should eventually replace the bus call in
// ComponentModeCollection::BeginComponentMode() to EditorComponentModeNotifications::EnteredComponentMode
// such that all of the notifications for activating/deactivating the different editor modes are in a central location
if (m_viewportEditorModeTracker)
{
m_viewportEditorModeTracker->ActivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Component);
}
// refresh button ui
ToolsApplicationEvents::Bus::Broadcast(
&ToolsApplicationEvents::Bus::Events::InvalidatePropertyDisplay, PropertyModificationRefreshLevel::Refresh_EntireTree);
@@ -124,14 +116,6 @@ namespace AzToolsFramework
{
m_componentModeCollection.EndComponentMode();
// this call to deactivate the component mode editor state should eventually replace the bus call in
// ComponentModeCollection::EndComponentMode() to EditorComponentModeNotifications::LeftComponentMode
// such that all of the notifications for activating/deactivating the different editor modes are in a central location
if (m_viewportEditorModeTracker)
{
m_viewportEditorModeTracker->DeactivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Component);
}
if (m_transformComponentSelection)
{
// safe to show manipulators again