You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Editor/Objects/ObjectManagerLegacyUndo.cpp

279 lines
7.6 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "EditorDefs.h"
#include "ObjectManagerLegacyUndo.h"
// AzToolsFramework
#include <AzToolsFramework/API/ComponentEntityObjectBus.h>
// Editor
#include "Include/IObjectManager.h"
#include "Objects/BaseObject.h"
#include "Objects/ObjectLoader.h"
#include "Objects/SelectionGroup.h"
//////////////////////////////////////////////////////////////////////////
// CUndoBaseObjectNew implementation.
//////////////////////////////////////////////////////////////////////////
CUndoBaseObjectNew::CUndoBaseObjectNew(CBaseObject* object)
{
m_object = object;
}
void CUndoBaseObjectNew::Undo(bool bUndo)
{
if (bUndo)
{
m_redo = XmlHelpers::CreateXmlNode("Redo");
// Save current object state.
CObjectArchive ar(GetIEditor()->GetObjectManager(), m_redo, false);
ar.bUndo = true;
m_object->Serialize(ar);
}
// Delete this object.
GetIEditor()->DeleteObject(m_object);
}
void CUndoBaseObjectNew::Redo()
{
if (!m_redo)
{
return;
}
IObjectManager* objectManager = GetIEditor()->GetObjectManager();
{
CObjectArchive ar(objectManager, m_redo, true);
ar.bUndo = true;
ar.MakeNewIds(false);
ar.LoadObject(m_redo, m_object);
}
objectManager->ClearSelection();
objectManager->SelectObject(m_object);
}
//////////////////////////////////////////////////////////////////////////
// CUndoBaseObjectDelete implementation.
//////////////////////////////////////////////////////////////////////////
CUndoBaseObjectDelete::CUndoBaseObjectDelete(CBaseObject* object)
{
AZ_Assert(object, "Object does not exist");
object->SetTransformDelegate(nullptr);
m_object = object;
// Save current object state.
m_undo = XmlHelpers::CreateXmlNode("Undo");
CObjectArchive ar(GetIEditor()->GetObjectManager(), m_undo, false);
ar.bUndo = true;
m_bSelected = m_object->IsSelected();
m_object->Serialize(ar);
}
void CUndoBaseObjectDelete::Undo([[maybe_unused]] bool bUndo)
{
IObjectManager* objectManager = GetIEditor()->GetObjectManager();
{
CObjectArchive ar(objectManager, m_undo, true);
ar.bUndo = true;
ar.MakeNewIds(false);
ar.LoadObject(m_undo, m_object);
m_object->ClearFlags(OBJFLAG_SELECTED);
}
if (m_bSelected)
{
objectManager->ClearSelection();
objectManager->SelectObject(m_object);
}
}
void CUndoBaseObjectDelete::Redo()
{
// Delete this object.
GetIEditor()->DeleteObject(m_object);
}
//////////////////////////////////////////////////////////////////////////
// CUndoBaseObjectSelect implementation.
//////////////////////////////////////////////////////////////////////////
CUndoBaseObjectSelect::CUndoBaseObjectSelect(CBaseObject* object)
{
AZ_Assert(object, "Object does not exist");
m_guid = object->GetId();
m_bUndoSelect = object->IsSelected();
}
CUndoBaseObjectSelect::CUndoBaseObjectSelect(CBaseObject* object, bool isSelect)
{
AZ_Assert(object, "Object does not exist");
m_guid = object->GetId();
m_bUndoSelect = !isSelect;
}
QString CUndoBaseObjectSelect::GetObjectName()
{
CBaseObject* object = GetIEditor()->GetObjectManager()->FindObject(m_guid);
if (!object)
{
return "";
}
return object->GetName();
}
void CUndoBaseObjectSelect::Undo(bool bUndo)
{
CBaseObject* object = GetIEditor()->GetObjectManager()->FindObject(m_guid);
if (!object)
{
return;
}
if (bUndo)
{
m_bRedoSelect = object->IsSelected();
}
if (m_bUndoSelect)
{
GetIEditor()->GetObjectManager()->SelectObject(object);
}
else
{
GetIEditor()->GetObjectManager()->UnselectObject(object);
}
}
void CUndoBaseObjectSelect::Redo()
{
if (CBaseObject* object = GetIEditor()->GetObjectManager()->FindObject(m_guid))
{
if (m_bRedoSelect)
{
GetIEditor()->GetObjectManager()->SelectObject(object);
}
else
{
GetIEditor()->GetObjectManager()->UnselectObject(object);
}
}
}
//////////////////////////////////////////////////////////////////////////
// CUndoBaseObjectBulkSelect implementation.
//////////////////////////////////////////////////////////////////////////
CUndoBaseObjectBulkSelect::CUndoBaseObjectBulkSelect(const AZStd::unordered_set<const CBaseObject*>& previousSelection, const CSelectionGroup& selectionGroup)
{
int numSelectedObjects = selectionGroup.GetCount();
m_entityIdList.reserve(numSelectedObjects);
// Populate list of entities to restore selection to
for (int objectIndex = 0; objectIndex < numSelectedObjects; ++objectIndex)
{
CBaseObject* object = selectionGroup.GetObject(objectIndex);
// Don't track Undo/Redo for Legacy Objects or entities that were not selected in this step
if (object->GetType() != OBJTYPE_AZENTITY || previousSelection.find(object) != previousSelection.end())
{
continue;
}
AZ::EntityId id;
AzToolsFramework::ComponentEntityObjectRequestBus::EventResult(
id,
object,
&AzToolsFramework::ComponentEntityObjectRequestBus::Events::GetAssociatedEntityId);
m_entityIdList.push_back(id);
}
}
void CUndoBaseObjectBulkSelect::Undo(bool bUndo)
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor);
if (!bUndo)
{
return;
}
AzToolsFramework::ToolsApplicationRequestBus::Broadcast(
&AzToolsFramework::ToolsApplicationRequests::MarkEntitiesDeselected,
m_entityIdList);
}
void CUndoBaseObjectBulkSelect::Redo()
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor);
AzToolsFramework::ToolsApplicationRequestBus::Broadcast(
&AzToolsFramework::ToolsApplicationRequests::MarkEntitiesSelected,
m_entityIdList);
}
//////////////////////////////////////////////////////////////////////////
// CUndoBaseObjectClearSelection implementation.
//////////////////////////////////////////////////////////////////////////
CUndoBaseObjectClearSelection::CUndoBaseObjectClearSelection(const CSelectionGroup& selectionGroup)
{
int numSelectedObjects = selectionGroup.GetCount();
m_entityIdList.reserve(numSelectedObjects);
// Populate list of entities to restore selection to
for (int objectIndex = 0; objectIndex < numSelectedObjects; ++objectIndex)
{
CBaseObject* object = selectionGroup.GetObject(objectIndex);
// Don't track Undo/Redo for Legacy Objects
if (object->GetType() != OBJTYPE_AZENTITY)
{
continue;
}
AZ::EntityId id;
AzToolsFramework::ComponentEntityObjectRequestBus::EventResult(
id,
object,
&AzToolsFramework::ComponentEntityObjectRequestBus::Events::GetAssociatedEntityId);
m_entityIdList.push_back(id);
}
}
void CUndoBaseObjectClearSelection::Undo(bool bUndo)
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor);
if (!bUndo)
{
return;
}
AzToolsFramework::ToolsApplicationRequestBus::Broadcast(
&AzToolsFramework::ToolsApplicationRequests::SetSelectedEntities,
m_entityIdList);
}
void CUndoBaseObjectClearSelection::Redo()
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor);
AzToolsFramework::ToolsApplicationRequestBus::Broadcast(
&AzToolsFramework::ToolsApplicationRequests::SetSelectedEntities,
AzToolsFramework::EntityIdList());
}