From bc20208f139568751c34bef92e8a8b80bf838ea7 Mon Sep 17 00:00:00 2001 From: AMZN-Phil Date: Thu, 11 Nov 2021 14:39:10 -0800 Subject: [PATCH 1/3] Create file in project directory on successful build for Project Manager Signed-off-by: AMZN-Phil --- .../Source/ProjectBuilderController.cpp | 15 ++++++++++++ .../ProjectManager/Source/ProjectsScreen.cpp | 23 ++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp index 7981e9d758..e892336a6f 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp @@ -10,6 +10,8 @@ #include #include +#include + #include #include #include @@ -80,6 +82,10 @@ namespace O3DE::ProjectManager void ProjectBuilderController::HandleResults(const QString& result) { + AZ::IO::LocalFileIO fileIO; + AZStd::string successBuildFilePath = AZStd::string::format("%s/%s", + m_projectInfo.m_path.toStdString().c_str(), "ProjectManagerBuildSuccess"); + if (!result.isEmpty()) { if (result.contains(tr("log"))) @@ -109,12 +115,21 @@ namespace O3DE::ProjectManager emit NotifyBuildProject(m_projectInfo); } + fileIO.Remove(successBuildFilePath.c_str()); + emit Done(false); return; } else { m_projectInfo.m_buildFailed = false; + + AZ::IO::HandleType fileHandle; + if (fileIO.Open(successBuildFilePath.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText, fileHandle)) + { + // We just need the file to exist + fileIO.Close(fileHandle); + } } emit Done(true); diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index f86a689e59..11ff7e0a10 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -269,17 +270,33 @@ namespace O3DE::ProjectManager // Add any missing project buttons and restore buttons to default state for (const ProjectInfo& project : projectsVector) { + ProjectButton* currentButton = nullptr; if (!m_projectButtons.contains(QDir::toNativeSeparators(project.m_path))) { - m_projectButtons.insert(QDir::toNativeSeparators(project.m_path), CreateProjectButton(project)); + currentButton = CreateProjectButton(project); + m_projectButtons.insert(QDir::toNativeSeparators(project.m_path), currentButton); } else { auto projectButtonIter = m_projectButtons.find(QDir::toNativeSeparators(project.m_path)); if (projectButtonIter != m_projectButtons.end()) { - projectButtonIter.value()->RestoreDefaultState(); - m_projectsFlowLayout->addWidget(projectButtonIter.value()); + currentButton = projectButtonIter.value(); + currentButton->RestoreDefaultState(); + m_projectsFlowLayout->addWidget(currentButton); + } + } + + // Check whether project manager has successfully built the project + if (currentButton) + { + AZStd::string successfulBuildFilePath = AZStd::string::format("%s/%s", + project.m_path.toStdString().c_str(), "ProjectManagerBuildSuccess"); + + AZ::IO::LocalFileIO fileIO; + if (!fileIO.Exists(successfulBuildFilePath.c_str())) + { + currentButton->ShowBuildRequired(); } } } From 07c142b97598a46c6c5cbb34d2b30116091da9f3 Mon Sep 17 00:00:00 2001 From: AMZN-Phil Date: Mon, 15 Nov 2021 08:51:00 -0800 Subject: [PATCH 2/3] Remove temporary changes and remove key before building Signed-off-by: AMZN-Phil --- .../Source/ProjectBuilderController.cpp | 32 ++++++++---- .../Source/ProjectManagerSettings.cpp | 49 +++++++++++++++++++ .../Source/ProjectManagerSettings.h | 16 ++++++ .../ProjectManager/Source/ProjectsScreen.cpp | 17 ++++--- .../Source/UpdateProjectCtrl.cpp | 20 ++++++++ .../project_manager_files.cmake | 2 + 6 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp create mode 100644 Code/Tools/ProjectManager/Source/ProjectManagerSettings.h diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp index e892336a6f..3cc131e0c0 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp @@ -9,14 +9,16 @@ #include #include #include +#include -#include +#include #include #include #include + namespace O3DE::ProjectManager { ProjectBuilderController::ProjectBuilderController(const ProjectInfo& projectInfo, ProjectButton* projectButton, QWidget* parent) @@ -29,6 +31,15 @@ namespace O3DE::ProjectManager m_worker = new ProjectBuilderWorker(m_projectInfo); m_worker->moveToThread(&m_workerThread); + auto settingsRegistry = AZ::SettingsRegistry::Get(); + if (settingsRegistry) + { + // Remove key here in case Project Manager crashing while building that causes HandleResults to not be called + QString settingsKey = QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); + settingsRegistry->Remove(settingsKey.toStdString().c_str()); + SaveProjectManagerSettings(); + } + connect(&m_workerThread, &QThread::finished, m_worker, &ProjectBuilderWorker::deleteLater); connect(&m_workerThread, &QThread::started, m_worker, &ProjectBuilderWorker::BuildProject); connect(m_worker, &ProjectBuilderWorker::Done, this, &ProjectBuilderController::HandleResults); @@ -82,9 +93,7 @@ namespace O3DE::ProjectManager void ProjectBuilderController::HandleResults(const QString& result) { - AZ::IO::LocalFileIO fileIO; - AZStd::string successBuildFilePath = AZStd::string::format("%s/%s", - m_projectInfo.m_path.toStdString().c_str(), "ProjectManagerBuildSuccess"); + QString settingsKey = QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); if (!result.isEmpty()) { @@ -115,7 +124,12 @@ namespace O3DE::ProjectManager emit NotifyBuildProject(m_projectInfo); } - fileIO.Remove(successBuildFilePath.c_str()); + auto settingsRegistry = AZ::SettingsRegistry::Get(); + if (settingsRegistry) + { + settingsRegistry->Remove(settingsKey.toStdString().c_str()); + SaveProjectManagerSettings(); + } emit Done(false); return; @@ -124,11 +138,11 @@ namespace O3DE::ProjectManager { m_projectInfo.m_buildFailed = false; - AZ::IO::HandleType fileHandle; - if (fileIO.Open(successBuildFilePath.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText, fileHandle)) + auto settingsRegistry = AZ::SettingsRegistry::Get(); + if (settingsRegistry) { - // We just need the file to exist - fileIO.Close(fileHandle); + settingsRegistry->Set(settingsKey.toStdString().c_str(), true); + SaveProjectManagerSettings(); } } diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp new file mode 100644 index 0000000000..e775affaf6 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp @@ -0,0 +1,49 @@ +/* + * 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 "ProjectManagerSettings.h" + +#include +#include +#include + +namespace O3DE::ProjectManager +{ + void SaveProjectManagerSettings() + { + auto settingsRegistry = AZ::SettingsRegistry::Get(); + AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings; + dumperSettings.m_prettifyOutput = true; + dumperSettings.m_jsonPointerPrefix = ProjectManagerKeyPrefix; + + AZStd::string stringBuffer; + AZ::IO::ByteContainerStream stringStream(&stringBuffer); + if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream( + *settingsRegistry, ProjectManagerKeyPrefix, stringStream, dumperSettings)) + { + AZ_Warning("ProjectManager", false, "Could not save Project Manager settings to stream"); + return; + } + + AZ::IO::FixedMaxPath o3deUserPath = AZ::Utils::GetO3deManifestDirectory(); + o3deUserPath /= AZ::SettingsRegistryInterface::RegistryFolder; + o3deUserPath /= "ProjectManager.setreg"; + + bool saved = false; + constexpr auto configurationMode = + AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_CREATE_PATH | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY; + + AZ::IO::SystemFile outputFile; + if (outputFile.Open(o3deUserPath.c_str(), configurationMode)) + { + saved = outputFile.Write(stringBuffer.data(), stringBuffer.size()) == stringBuffer.size(); + } + + AZ_Warning("ProjectManager", saved, "Unable to save Project Manager registry file to path: %s", o3deUserPath.c_str()); + } +} diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h new file mode 100644 index 0000000000..8488e4c5db --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h @@ -0,0 +1,16 @@ +/* + * 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 + * + */ + +#pragma once + +namespace O3DE::ProjectManager +{ + static constexpr char ProjectManagerKeyPrefix[] = "/O3DE/ProjectManager"; + + void SaveProjectManagerSettings(); +} diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index 11ff7e0a10..1e305a3586 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -22,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -290,11 +291,15 @@ namespace O3DE::ProjectManager // Check whether project manager has successfully built the project if (currentButton) { - AZStd::string successfulBuildFilePath = AZStd::string::format("%s/%s", - project.m_path.toStdString().c_str(), "ProjectManagerBuildSuccess"); - - AZ::IO::LocalFileIO fileIO; - if (!fileIO.Exists(successfulBuildFilePath.c_str())) + auto settingsRegistry = AZ::SettingsRegistry::Get(); + bool projectBuiltSuccessfully = false; + if (settingsRegistry) + { + QString settingsKey = + QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(project.m_projectName); + settingsRegistry->Get(projectBuiltSuccessfully, settingsKey.toStdString().c_str()); + } + if (!projectBuiltSuccessfully) { currentButton->ShowBuildRequired(); } diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp index fb16484961..85e8e2af0d 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp +++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp @@ -15,6 +15,9 @@ #include #include #include +#include + +#include #include #include @@ -280,6 +283,23 @@ namespace O3DE::ProjectManager } } + if (newProjectSettings.m_projectName != m_projectInfo.m_projectName) + { + // update reg key + QString oldSettingsKey = + QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); + QString newSettingsKey = + QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(newProjectSettings.m_projectName); + + auto settingsRegistry = AZ::SettingsRegistry::Get(); + bool projectBuiltSuccessfully = false; + if (settingsRegistry && settingsRegistry->Get(projectBuiltSuccessfully, oldSettingsKey.toStdString().c_str())) + { + settingsRegistry->Set(newSettingsKey.toStdString().c_str(), projectBuiltSuccessfully); + SaveProjectManagerSettings(); + } + } + if (!newProjectSettings.m_newPreviewImagePath.isEmpty()) { if (!ProjectUtils::ReplaceProjectFile( diff --git a/Code/Tools/ProjectManager/project_manager_files.cmake b/Code/Tools/ProjectManager/project_manager_files.cmake index e2e35717f6..1a6be36eb3 100644 --- a/Code/Tools/ProjectManager/project_manager_files.cmake +++ b/Code/Tools/ProjectManager/project_manager_files.cmake @@ -58,6 +58,8 @@ set(FILES Source/CreateProjectCtrl.cpp Source/UpdateProjectCtrl.h Source/UpdateProjectCtrl.cpp + Source/ProjectManagerSettings.h + Source/ProjectManagerSettings.cpp Source/ProjectsScreen.h Source/ProjectsScreen.cpp Source/ProjectSettingsScreen.h From 18cf128854dab40e2af78b6848b132908f6bc3f2 Mon Sep 17 00:00:00 2001 From: AMZN-Phil Date: Mon, 15 Nov 2021 11:50:28 -0800 Subject: [PATCH 3/3] Remove some code duplication Signed-off-by: AMZN-Phil --- .../ProjectManager/Source/ProjectBuilderController.cpp | 6 ++---- Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp | 5 +++++ Code/Tools/ProjectManager/Source/ProjectManagerSettings.h | 5 +++++ Code/Tools/ProjectManager/Source/ProjectsScreen.cpp | 3 +-- Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp | 6 ++---- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp index 3cc131e0c0..ecb125ae4e 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp @@ -17,8 +17,6 @@ #include #include - - namespace O3DE::ProjectManager { ProjectBuilderController::ProjectBuilderController(const ProjectInfo& projectInfo, ProjectButton* projectButton, QWidget* parent) @@ -35,7 +33,7 @@ namespace O3DE::ProjectManager if (settingsRegistry) { // Remove key here in case Project Manager crashing while building that causes HandleResults to not be called - QString settingsKey = QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); + QString settingsKey = GetProjectBuiltSuccessfullyKey(m_projectInfo.m_projectName); settingsRegistry->Remove(settingsKey.toStdString().c_str()); SaveProjectManagerSettings(); } @@ -93,7 +91,7 @@ namespace O3DE::ProjectManager void ProjectBuilderController::HandleResults(const QString& result) { - QString settingsKey = QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); + QString settingsKey = GetProjectBuiltSuccessfullyKey(m_projectInfo.m_projectName); if (!result.isEmpty()) { diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp index e775affaf6..3049a6d70c 100644 --- a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp @@ -46,4 +46,9 @@ namespace O3DE::ProjectManager AZ_Warning("ProjectManager", saved, "Unable to save Project Manager registry file to path: %s", o3deUserPath.c_str()); } + + QString GetProjectBuiltSuccessfullyKey(const QString& projectName) + { + return QString("%1/Projects/%2/BuiltSuccessfully").arg(ProjectManagerKeyPrefix).arg(projectName); + } } diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h index 8488e4c5db..3454909062 100644 --- a/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h +++ b/Code/Tools/ProjectManager/Source/ProjectManagerSettings.h @@ -8,9 +8,14 @@ #pragma once +#if !defined(Q_MOC_RUN) +#include +#endif + namespace O3DE::ProjectManager { static constexpr char ProjectManagerKeyPrefix[] = "/O3DE/ProjectManager"; void SaveProjectManagerSettings(); + QString GetProjectBuiltSuccessfullyKey(const QString& projectName); } diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index 1e305a3586..7f962bee88 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -295,8 +295,7 @@ namespace O3DE::ProjectManager bool projectBuiltSuccessfully = false; if (settingsRegistry) { - QString settingsKey = - QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(project.m_projectName); + QString settingsKey = GetProjectBuiltSuccessfullyKey(project.m_projectName); settingsRegistry->Get(projectBuiltSuccessfully, settingsKey.toStdString().c_str()); } if (!projectBuiltSuccessfully) diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp index 85e8e2af0d..6cb934560a 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp +++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp @@ -286,10 +286,8 @@ namespace O3DE::ProjectManager if (newProjectSettings.m_projectName != m_projectInfo.m_projectName) { // update reg key - QString oldSettingsKey = - QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(m_projectInfo.m_projectName); - QString newSettingsKey = - QString("%1/Projects/%2/BuiltSuccesfully").arg(ProjectManagerKeyPrefix).arg(newProjectSettings.m_projectName); + QString oldSettingsKey = GetProjectBuiltSuccessfullyKey(m_projectInfo.m_projectName); + QString newSettingsKey = GetProjectBuiltSuccessfullyKey(newProjectSettings.m_projectName); auto settingsRegistry = AZ::SettingsRegistry::Get(); bool projectBuiltSuccessfully = false;