diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 2b044e800a..95b3bc4c50 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -42,9 +42,9 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("EnableSceneInspector", &GeneralSettings::m_enableSceneInspector) ->Field("RestoreViewportCamera", &GeneralSettings::m_restoreViewportCamera); - serialize.Class() + serialize.Class() ->Version(1) - ->Field("SaveAllPrefabsPreference", &GlobalSaveSettings::m_saveAllPrefabsPreference); + ->Field("SaveAllPrefabsPreference", &LevelSaveSettings::m_saveAllPrefabsPreference); serialize.Class() ->Version(2) @@ -68,7 +68,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) serialize.Class() ->Version(1) ->Field("General Settings", &CEditorPreferencesPage_General::m_generalSettings) - ->Field("Global Save Settings", &CEditorPreferencesPage_General::m_globalSaveSettings) + ->Field("Level Save Settings", &CEditorPreferencesPage_General::m_levelSaveSettings) ->Field("Messaging", &CEditorPreferencesPage_General::m_messaging) ->Field("Undo", &CEditorPreferencesPage_General::m_undo) ->Field("Deep Selection", &CEditorPreferencesPage_General::m_deepSelection) @@ -97,9 +97,9 @@ 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", "") + editContext->Class("Level Save Settings", "") ->DataElement( - AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", + AZ::Edit::UIHandlers::ComboBox, &LevelSaveSettings::m_saveAllPrefabsPreference, "Save All Prefabs Preference", "This option controls whether prefabs should be saved along with the level") ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime, "Ask every time") ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::SaveAll, "Save all") @@ -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 (File>Save & Ctrl+S)") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_levelSaveSettings, "Level Save Settings", "File>Save") ->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") @@ -176,7 +176,7 @@ void CEditorPreferencesPage_General::OnApply() } //prefabs - gSettings.globalSaveSettings.saveAllPrefabsPreference = m_globalSaveSettings.m_saveAllPrefabsPreference; + gSettings.levelSaveSettings.saveAllPrefabsPreference = m_levelSaveSettings.m_saveAllPrefabsPreference; //undo gSettings.undoLevels = m_undo.m_undoLevels; @@ -208,7 +208,7 @@ void CEditorPreferencesPage_General::InitializeSettings() m_generalSettings.m_toolbarIconSize = static_cast(gSettings.gui.nToolbarIconSize); //prefabs - m_globalSaveSettings.m_saveAllPrefabsPreference = gSettings.globalSaveSettings.saveAllPrefabsPreference; + m_levelSaveSettings.m_saveAllPrefabsPreference = gSettings.levelSaveSettings.saveAllPrefabsPreference; //Messaging m_messaging.m_showDashboard = gSettings.bShowDashboardAtStartup; diff --git a/Code/Editor/EditorPreferencesPageGeneral.h b/Code/Editor/EditorPreferencesPageGeneral.h index e5888b2705..01700dea88 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Editor/EditorPreferencesPageGeneral.h @@ -58,9 +58,9 @@ private: bool m_enableSceneInspector; }; - struct GlobalSaveSettings + struct LevelSaveSettings { - AZ_TYPE_INFO(GlobalSaveSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); + AZ_TYPE_INFO(LevelSaveSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); AzToolsFramework::Prefab::SaveAllPrefabsPreference m_saveAllPrefabsPreference; }; @@ -96,7 +96,7 @@ private: }; GeneralSettings m_generalSettings; - GlobalSaveSettings m_globalSaveSettings; + LevelSaveSettings m_levelSaveSettings; Messaging m_messaging; Undo m_undo; DeepSelection m_deepSelection; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 92617248d3..81182c0a20 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -254,7 +254,7 @@ SEditorSettings::SEditorSettings() g_TemporaryLevelName = nullptr; sliceSettings.dynamicByDefault = false; - globalSaveSettings.saveAllPrefabsPreference = AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime; + levelSaveSettings.saveAllPrefabsPreference = AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime; } void SEditorSettings::Connect() @@ -671,7 +671,7 @@ void SEditorSettings::Save() AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - prefabLoaderInterface->SetSaveAllPrefabsPreference(globalSaveSettings.saveAllPrefabsPreference); + prefabLoaderInterface->SetSaveAllPrefabsPreference(levelSaveSettings.saveAllPrefabsPreference); SaveSettingsRegistryFile(); } @@ -681,7 +681,7 @@ void SEditorSettings::Load() { AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - globalSaveSettings.saveAllPrefabsPreference = prefabLoaderInterface->GetSaveAllPrefabsPreference(); + levelSaveSettings.saveAllPrefabsPreference = prefabLoaderInterface->GetSaveAllPrefabsPreference(); // Load from Settings Registry AzFramework::ApplicationRequests::Bus::BroadcastResult( diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index fca3480241..8f94e482d3 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -231,7 +231,7 @@ struct SSliceSettings bool dynamicByDefault; }; -struct SGlobalSaveSettings +struct SLevelSaveSettings { AzToolsFramework::Prefab::SaveAllPrefabsPreference saveAllPrefabsPreference; }; @@ -472,7 +472,7 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING SSliceSettings sliceSettings; - SGlobalSaveSettings globalSaveSettings; + SLevelSaveSettings levelSaveSettings; bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 9059bf5368..5863ccfbf9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -370,7 +370,7 @@ namespace AzToolsFramework PrefabDom& PrefabSystemComponent::FindTemplateDom(TemplateId templateId) { AZStd::optional> findTemplateResult = FindTemplate(templateId); - AZ_Assert(findTemplateResult.has_value(), + AZ_Assert(false, "PrefabSystemComponent::FindTemplateDom - Unable to retrieve Prefab template with id: '%llu'. " "Template could not be found", templateId); @@ -754,17 +754,17 @@ namespace AzToolsFramework } } - bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) + bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId rootTemplateId) { - TemplateReference prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(rootTemplateId); if (!prefabTemplate.has_value()) { - AZ_Assert(false, "Template with id %llu is not found", templateId); + AZ_Assert(false, "Template with id %llu is not found", rootTemplateId); return false; } - if (IsTemplateDirty(templateId)) + if (IsTemplateDirty(rootTemplateId)) { return true; } @@ -782,9 +782,9 @@ namespace AzToolsFramework return false; } - void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) + void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId rootTemplateId) { - AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(templateId); + AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(rootTemplateId); for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { @@ -800,26 +800,27 @@ namespace AzToolsFramework } } - AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId) + AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId rootTemplateId) { AZStd::vector dirtyTemplatePathVector; - GetDirtyTemplatePathsHelper(templateId, dirtyTemplatePathVector); + GetDirtyTemplatePathsHelper(rootTemplateId, dirtyTemplatePathVector); AZStd::set dirtyTemplatePaths; dirtyTemplatePaths.insert(dirtyTemplatePathVector.begin(), dirtyTemplatePathVector.end()); return AZStd::move(dirtyTemplatePaths); } - void PrefabSystemComponent::GetDirtyTemplatePathsHelper(TemplateId templateId, AZStd::vector& dirtyTemplatePaths) + void PrefabSystemComponent::GetDirtyTemplatePathsHelper( + TemplateId rootTemplateId, AZStd::vector& dirtyTemplatePaths) { - TemplateReference prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(rootTemplateId); if (!prefabTemplate.has_value()) { - AZ_Assert(false, "Template with id %llu is not found", templateId); + AZ_Assert(false, "Template with id %llu is not found", rootTemplateId); return; } - if (IsTemplateDirty(templateId)) + if (IsTemplateDirty(rootTemplateId)) { dirtyTemplatePaths.emplace_back(prefabTemplate->get().GetFilePath()); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index a09edfe03a..04bcee2961 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -183,11 +183,11 @@ namespace AzToolsFramework */ void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; - bool AreDirtyTemplatesPresent(TemplateId templateId) override; + bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) override; - void SaveAllDirtyTemplates(TemplateId templateId) override; + void SaveAllDirtyTemplates(TemplateId rootTemplateId) override; - AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) override; + AZStd::set GetDirtyTemplatePaths(TemplateId rootTemplateId) override; ////////////////////////////////////////////////////////////////////////// @@ -342,7 +342,7 @@ 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); + void GetDirtyTemplatePathsHelper(TemplateId rootTemplateId, 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 72b8fad162..ae66700728 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -52,17 +52,17 @@ namespace AzToolsFramework virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; //! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template. - //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - virtual bool AreDirtyTemplatesPresent(TemplateId templateId) = 0; + //! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links. + virtual bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) = 0; //! Recursive function to save if the template is dirty and save all the dirty templates in the links of the template. - //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - virtual void SaveAllDirtyTemplates(TemplateId templateId) = 0; + //! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links. + virtual void SaveAllDirtyTemplates(TemplateId rootTemplateId) = 0; //! 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 rootTemplateId The id of the template provided as the beginning template to check the outgoing links. //! @return The set of dirty template paths populated. - virtual AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) = 0; + virtual AZStd::set GetDirtyTemplatePaths(TemplateId rootTemplateId) = 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 e82e8fa0ca..6b67f94582 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1088,16 +1088,21 @@ namespace AzToolsFramework int PrefabIntegrationManager::ExecuteClosePrefabDialog(TemplateId templateId) { - auto prefabSaveSelectionDialog = ConstructClosePrefabDialog(templateId); - - int prefabSaveSelection = prefabSaveSelectionDialog->exec(); - - if (prefabSaveSelection == QDialog::Accepted) + if (s_prefabSystemComponentInterface->AreDirtyTemplatesPresent(templateId)) { - SavePrefabsInDialog(prefabSaveSelectionDialog.get()); + auto prefabSaveSelectionDialog = ConstructClosePrefabDialog(templateId); + + int prefabSaveSelection = prefabSaveSelectionDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(prefabSaveSelectionDialog.get()); + } + + return prefabSaveSelection; } - return prefabSaveSelection; + return QDialogButtonBox::DestructiveRole; } void PrefabIntegrationManager::ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) @@ -1114,29 +1119,32 @@ namespace AzToolsFramework } } - if (useSaveAllPrefabsPreference) + if (s_prefabSystemComponentInterface->AreDirtyTemplatesPresent(templateId)) { - SaveAllPrefabsPreference saveAllPrefabsPreference = s_prefabLoaderInterface->GetSaveAllPrefabsPreference(); - - if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveAll) + if (useSaveAllPrefabsPreference) { - s_prefabSystemComponentInterface->SaveAllDirtyTemplates(templateId); - return; + SaveAllPrefabsPreference saveAllPrefabsPreference = s_prefabLoaderInterface->GetSaveAllPrefabsPreference(); + + if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveAll) + { + s_prefabSystemComponentInterface->SaveAllDirtyTemplates(templateId); + return; + } + else if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveNone) + { + return; + } } - else if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveNone) - { - return; - } - } - AZStd::unique_ptr savePrefabDialog = ConstructSavePrefabDialog(templateId, useSaveAllPrefabsPreference); - if (savePrefabDialog) - { - int prefabSaveSelection = savePrefabDialog->exec(); - - if (prefabSaveSelection == QDialog::Accepted) + AZStd::unique_ptr savePrefabDialog = ConstructSavePrefabDialog(templateId, useSaveAllPrefabsPreference); + if (savePrefabDialog) { - SavePrefabsInDialog(savePrefabDialog.get()); + int prefabSaveSelection = savePrefabDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(savePrefabDialog.get()); + } } } } @@ -1152,7 +1160,7 @@ namespace AzToolsFramework AzToolsFramework::Prefab::TemplateId unsavedPrefabTemplateId = s_prefabSystemComponentInterface->GetTemplateIdFromFilePath(unsavedPrefabFileName.data()); bool isTemplateSavedSuccessfully = s_prefabLoaderInterface->SaveTemplate(unsavedPrefabTemplateId); - AZ_Assert(isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str()); + AZ_Error("Prefab", isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str()); } } } @@ -1222,6 +1230,7 @@ namespace AzToolsFramework connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, savePrefabDialog.get(), &QDialog::reject); AzQtComponents::StyleManager::setStyleSheet(savePrefabDialog->parentWidget(), QStringLiteral("style:Editor.qss")); + savePrefabDialog->setLayout(contentLayout); return AZStd::move(savePrefabDialog); } @@ -1251,8 +1260,6 @@ namespace AzToolsFramework levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); contentLayout->addWidget(prefabSaveWarningFrame); - 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); @@ -1276,6 +1283,7 @@ namespace AzToolsFramework closePrefabDialogWeakPtr.lock()->done(prefabSaveSelection); }); AzQtComponents::StyleManager::setStyleSheet(closePrefabDialog.get(), QStringLiteral("style:Editor.qss")); + closePrefabDialog->setLayout(contentLayout); return closePrefabDialog; }