diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 5c0938216a..b5eb4229df 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -3193,6 +3193,8 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) int prefabSaveSelection = prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. + // For example, QDialog::Rejected(0) is emitted when dialog is closed. But the int value corresponds to + // QDialogButtonBox::AcceptRole(0). switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 5df046bf54..b1186202f9 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -699,9 +699,7 @@ bool CCryEditDoc::SaveModified() } else { - using namespace AzToolsFramework::Prefab; - - TemplateId rootPrefabTemplateId = m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); if (!m_prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId)) { return true; @@ -710,6 +708,8 @@ bool CCryEditDoc::SaveModified() int prefabSaveSelection = m_prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. + // For example, QDialog::Rejected(0) is emitted when dialog is closed. But the int value corresponds to + // QDialogButtonBox::AcceptRole(0). switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 2cba7e7801..2b044e800a 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -97,7 +97,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); - editContext->Class("Global Save Settings (File>Save & Ctrl+S)", "") + editContext->Class("Global Save Settings", "") ->DataElement( AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", "This option controls whether prefabs should be saved along with the level") @@ -128,7 +128,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_generalSettings, "General Settings", "General Editor Preferences") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings (File>Save & Ctrl+S)") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index c9365683b5..114f45d501 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -362,11 +362,7 @@ namespace AzToolsFramework Prefab::TemplateId PrefabEditorEntityOwnershipService::GetRootPrefabTemplateId() { AZ_Assert(m_rootInstance, "A valid root prefab instance couldn't be found in PrefabEditorEntityOwnershipService."); - if (m_rootInstance) - { - return m_rootInstance->GetTemplateId(); - } - return Prefab::InvalidTemplateId; + return m_rootInstance ? m_rootInstance->GetTemplateId() : Prefab::InvalidTemplateId; } const AZStd::vector>& PrefabEditorEntityOwnershipService::GetPlayInEditorAssetData() diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 666386d4aa..3db78b1d39 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -670,7 +670,7 @@ namespace AzToolsFramework return finalPath; } - SaveAllPrefabsPreference PrefabLoader::GetSaveAllPrefabsPreference() + SaveAllPrefabsPreference PrefabLoader::GetSaveAllPrefabsPreference() const { SaveAllPrefabsPreference saveAllPrefabsPreference = SaveAllPrefabsPreference::AskEveryTime; if (auto* registry = AZ::SettingsRegistry::Get()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h index 5940d887da..15f201e027 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h @@ -110,7 +110,7 @@ namespace AzToolsFramework //! Returns if the path is a valid path for a prefab static bool IsValidPrefabPath(AZ::IO::PathView path); - SaveAllPrefabsPreference GetSaveAllPrefabsPreference() override; + SaveAllPrefabsPreference GetSaveAllPrefabsPreference() const override; void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) override; private: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index b34f868304..a428f8a7b9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -91,7 +91,7 @@ namespace AzToolsFramework //! The path will always use the '/' separator. virtual AZ::IO::Path GenerateRelativePath(AZ::IO::PathView path) = 0; - virtual SaveAllPrefabsPreference GetSaveAllPrefabsPreference() = 0; + virtual SaveAllPrefabsPreference GetSaveAllPrefabsPreference() const = 0; virtual void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) = 0; protected: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index a4fbd1e251..9059bf5368 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -756,7 +756,7 @@ namespace AzToolsFramework bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) { - auto prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(templateId); if (!prefabTemplate.has_value()) { @@ -769,9 +769,9 @@ namespace AzToolsFramework return true; } - auto linkIds = prefabTemplate->get().GetLinks(); + const Template::Links& linkIds = prefabTemplate->get().GetLinks(); - for (auto linkId : linkIds) + for (LinkId linkId : linkIds) { auto linkIterator = m_linkIdMap.find(linkId); if (linkIterator != m_linkIdMap.end()) @@ -784,10 +784,9 @@ namespace AzToolsFramework void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) { - AZStd::set dirtyTemplatePaths; - GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(templateId); - for (auto dirtyTemplatePath : dirtyTemplatePaths) + for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { auto dirtyTemplateIterator = m_templateFilePathToIdMap.find(dirtyTemplatePath); if (dirtyTemplateIterator == m_templateFilePathToIdMap.end()) @@ -801,9 +800,18 @@ namespace AzToolsFramework } } - void PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId, AZStd::set& dirtyTemplatePaths) + AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId) + { + AZStd::vector dirtyTemplatePathVector; + GetDirtyTemplatePathsHelper(templateId, dirtyTemplatePathVector); + AZStd::set dirtyTemplatePaths; + dirtyTemplatePaths.insert(dirtyTemplatePathVector.begin(), dirtyTemplatePathVector.end()); + return AZStd::move(dirtyTemplatePaths); + } + + void PrefabSystemComponent::GetDirtyTemplatePathsHelper(TemplateId templateId, AZStd::vector& dirtyTemplatePaths) { - auto prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(templateId); if (!prefabTemplate.has_value()) { @@ -813,17 +821,17 @@ namespace AzToolsFramework if (IsTemplateDirty(templateId)) { - dirtyTemplatePaths.emplace(prefabTemplate->get().GetFilePath()); + dirtyTemplatePaths.emplace_back(prefabTemplate->get().GetFilePath()); } - auto linkIds = prefabTemplate->get().GetLinks(); + const Template::Links& linkIds = prefabTemplate->get().GetLinks(); - for (auto linkId : linkIds) + for (LinkId linkId : linkIds) { auto linkIterator = m_linkIdMap.find(linkId); if (linkIterator != m_linkIdMap.end()) { - GetDirtyTemplatePaths(linkIterator->second.GetSourceTemplateId(), dirtyTemplatePaths); + GetDirtyTemplatePathsHelper(linkIterator->second.GetSourceTemplateId(), dirtyTemplatePaths); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 153a0e2b47..a09edfe03a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -187,7 +187,7 @@ namespace AzToolsFramework void SaveAllDirtyTemplates(TemplateId templateId) override; - void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) override; + AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) override; ////////////////////////////////////////////////////////////////////////// @@ -341,6 +341,9 @@ namespace AzToolsFramework */ bool RemoveLinkFromTargetTemplate(const LinkId& linkId, const Link& link); + // Helper function for GetDirtyTemplatePaths(). It uses vector to speed up iteration times. + void GetDirtyTemplatePathsHelper(TemplateId parentTemplateId, AZStd::vector& dirtyTemplatePaths); + // A container for mapping Templates to the Links they may propagate changes to. AZStd::unordered_map> m_templateToLinkIdsMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 98e7719907..72b8fad162 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -61,8 +61,8 @@ namespace AzToolsFramework //! Recursive function that fetches the set of dirty templates given a starting template to check for outgoing links. //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - //! @param[out] dirtyTemplatePaths The set of dirty template paths populated. - virtual void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) = 0; + //! @return The set of dirty template paths populated. + virtual AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 3df7e68008..e82e8fa0ca 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1096,13 +1096,12 @@ namespace AzToolsFramework { SavePrefabsInDialog(prefabSaveSelectionDialog.get()); } + return prefabSaveSelection; } void PrefabIntegrationManager::ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) { - using namespace AzToolsFramework::Prefab; - auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); @@ -1252,8 +1251,8 @@ namespace AzToolsFramework levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); contentLayout->addWidget(prefabSaveWarningFrame); - AZStd::set dirtyTemplatePaths; - s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId); + auto templateToSave = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path templateToSaveFilePath = templateToSave->get().GetFilePath(); AZStd::unique_ptr unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); @@ -1284,8 +1283,7 @@ namespace AzToolsFramework { FlowLayout* unsavedPrefabsLayout = new FlowLayout(AzToolsFramework::GetActiveWindow()); - AZStd::set dirtyTemplatePaths; - s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId); for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) {