diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 114f45d501..0f2b896b40 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -221,7 +221,8 @@ namespace AzToolsFramework AZ::IO::Path relativePath = m_loaderInterface->GenerateRelativePath(filename); m_rootInstance->SetTemplateSourcePath(relativePath); - + m_prefabSystemComponent->UpdateTemplateFilePath(m_rootInstance->GetTemplateId(), relativePath); + AZStd::string out; if (!m_loaderInterface->SaveTemplateToString(m_rootInstance->GetTemplateId(), out)) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index e88e999878..0d2696f14b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -424,6 +424,48 @@ namespace AzToolsFramework return newTemplateId; } + void PrefabSystemComponent::UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) + { + auto findTemplateResult = FindTemplate(templateId); + if (!findTemplateResult.has_value()) + { + AZ_Error( + "Prefab", false, + "Template associated by given Id '%llu' doesn't exist in PrefabSystemComponent.", + templateId); + return; + } + + if (!filePath.IsRelative()) + { + AZ_Error("Prefab", false, "Provided filePath '%.*s' must be relative.", AZ_STRING_ARG(filePath.Native())); + return; + } + + Template& templateToChange = findTemplateResult->get(); + if (templateToChange.GetFilePath() == filePath) + { + return; + } + + m_templateFilePathToIdMap.erase(templateToChange.GetFilePath()); + if (!m_templateFilePathToIdMap.try_emplace(filePath, templateId).second) + { + AZ_Error("Prefab", false, "Provided filePath '%.*s' already exists.", AZ_STRING_ARG(filePath.Native())); + return; + } + + PrefabDom& prefabDom = templateToChange.GetPrefabDom(); + PrefabDomValueReference pathReference = Prefab::PrefabDomUtils::FindPrefabDomValue(prefabDom, "Source"); + if (pathReference) + { + const AZStd::string_view pathStr = filePath.Native(); + pathReference->get().SetString(pathStr.data(), aznumeric_caster(pathStr.length()), prefabDom.GetAllocator()); + } + + templateToChange.SetFilePath(filePath); + } + void PrefabSystemComponent::RemoveTemplate(const TemplateId& templateId) { auto findTemplateResult = FindTemplate(templateId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 04bcee2961..d6908922c9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -101,6 +101,13 @@ namespace AzToolsFramework */ TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) override; + /** + * Updates relative filepath location of a prefab (in case of SaveAs operation). + * @param templateId An id of a Template to change filepath of. + * @param filePath new relative path of the Template. + */ + void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) override; + /** * Remove the Template associated with the given id from Prefab System Component. * @param templateId A unique id of a Template. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index ae66700728..1f59088518 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -33,6 +33,7 @@ namespace AzToolsFramework virtual LinkReference FindLink(const LinkId& id) = 0; virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0; + virtual void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) = 0; virtual void RemoveTemplate(const TemplateId& templateId) = 0; virtual void RemoveAllTemplates() = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp index 99dce3d14f..e5ab403ea6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp @@ -180,5 +180,9 @@ namespace AzToolsFramework return m_filePath; } + void Template::SetFilePath(const AZ::IO::PathView& path) + { + m_filePath = path; + } } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h index fbc9a26f36..f7a41431f8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h @@ -63,6 +63,7 @@ namespace AzToolsFramework PrefabDomValueConstReference GetInstancesValue() const; const AZ::IO::Path& GetFilePath() const; + void SetFilePath(const AZ::IO::PathView& path); private: // Container for keeping links representing the Template's nested instances.