From 7ecd1b176140b7cfeaa704b8af0c5763cc1c6a60 Mon Sep 17 00:00:00 2001 From: AMZN-nggieber <52797929+AMZN-nggieber@users.noreply.github.com> Date: Thu, 13 May 2021 10:47:49 -0700 Subject: [PATCH] Rearchitecture Project Manager Screens Workflow and Create Project Settings Ctrl * Renamed UX screen files and classes to include screen in the name * Changed screens to emit a screen change request a controller can connect to * Made ScreensCtrl that owns and manages screens and their changing and history * Made Project Settings Control managing back and next buttons * Add Project Setting Model and moved New Project Settings Ui into Screen file * Goto previous screen always works * Removed unnecessary QObject namespace from connect calls * Merged ProjectSettingsModel into ProjectInfo --- ...eSettings.cpp => EngineSettingsScreen.cpp} | 17 +- ...ngineSettings.h => EngineSettingsScreen.h} | 10 +- ...ineSettings.ui => EngineSettingsScreen.ui} | 0 .../ProjectManager/Source/FirstTimeUse.cpp | 47 ------ .../Source/FirstTimeUseScreen.cpp | 44 ++++++ .../{FirstTimeUse.h => FirstTimeUseScreen.h} | 10 +- ...{FirstTimeUse.ui => FirstTimeUseScreen.ui} | 0 .../{GemCatalog.cpp => GemCatalogScreen.cpp} | 25 +-- .../{GemCatalog.h => GemCatalogScreen.h} | 12 +- .../Source/NewProjectSettings.cpp | 47 ------ .../Source/NewProjectSettings.ui | 97 ------------ .../Source/NewProjectSettingsScreen.cpp | 82 ++++++++++ .../Source/NewProjectSettingsScreen.h | 30 ++++ .../ProjectManager/Source/ProjectInfo.cpp | 6 +- .../Tools/ProjectManager/Source/ProjectInfo.h | 14 +- .../Source/ProjectManagerWindow.cpp | 71 ++------- .../Source/ProjectManagerWindow.h | 16 +- .../Source/ProjectManagerWindow.ui | 6 +- .../Source/ProjectSettingsCtrl.cpp | 95 +++++++++++ ...rojectSettings.h => ProjectSettingsCtrl.h} | 26 +-- ...Settings.cpp => ProjectSettingsScreen.cpp} | 22 ++- ...jectSettings.h => ProjectSettingsScreen.h} | 10 +- ...ctSettings.ui => ProjectSettingsScreen.ui} | 0 .../ProjectManager/Source/ProjectsHome.cpp | 57 ------- .../Source/ProjectsHomeScreen.cpp | 51 ++++++ .../{ProjectsHome.h => ProjectsHomeScreen.h} | 10 +- ...{ProjectsHome.ui => ProjectsHomeScreen.ui} | 0 Code/Tools/ProjectManager/Source/ScreenDefs.h | 5 +- .../ProjectManager/Source/ScreenFactory.cpp | 43 +++-- .../ProjectManager/Source/ScreenFactory.h | 7 +- .../ProjectManager/Source/ScreenWidget.h | 29 +++- .../ProjectManager/Source/ScreensCtrl.cpp | 149 ++++++++++++++++++ .../Tools/ProjectManager/Source/ScreensCtrl.h | 53 +++++++ .../project_manager_files.cmake | 41 ++--- 34 files changed, 679 insertions(+), 453 deletions(-) rename Code/Tools/ProjectManager/Source/{EngineSettings.cpp => EngineSettingsScreen.cpp} (70%) rename Code/Tools/ProjectManager/Source/{EngineSettings.h => EngineSettingsScreen.h} (81%) rename Code/Tools/ProjectManager/Source/{EngineSettings.ui => EngineSettingsScreen.ui} (100%) delete mode 100644 Code/Tools/ProjectManager/Source/FirstTimeUse.cpp create mode 100644 Code/Tools/ProjectManager/Source/FirstTimeUseScreen.cpp rename Code/Tools/ProjectManager/Source/{FirstTimeUse.h => FirstTimeUseScreen.h} (83%) rename Code/Tools/ProjectManager/Source/{FirstTimeUse.ui => FirstTimeUseScreen.ui} (100%) rename Code/Tools/ProjectManager/Source/GemCatalog/{GemCatalog.cpp => GemCatalogScreen.cpp} (78%) rename Code/Tools/ProjectManager/Source/GemCatalog/{GemCatalog.h => GemCatalogScreen.h} (79%) delete mode 100644 Code/Tools/ProjectManager/Source/NewProjectSettings.cpp delete mode 100644 Code/Tools/ProjectManager/Source/NewProjectSettings.ui create mode 100644 Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp create mode 100644 Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h create mode 100644 Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.cpp rename Code/Tools/ProjectManager/Source/{NewProjectSettings.h => ProjectSettingsCtrl.h} (65%) rename Code/Tools/ProjectManager/Source/{ProjectSettings.cpp => ProjectSettingsScreen.cpp} (57%) rename Code/Tools/ProjectManager/Source/{ProjectSettings.h => ProjectSettingsScreen.h} (82%) rename Code/Tools/ProjectManager/Source/{ProjectSettings.ui => ProjectSettingsScreen.ui} (100%) delete mode 100644 Code/Tools/ProjectManager/Source/ProjectsHome.cpp create mode 100644 Code/Tools/ProjectManager/Source/ProjectsHomeScreen.cpp rename Code/Tools/ProjectManager/Source/{ProjectsHome.h => ProjectsHomeScreen.h} (83%) rename Code/Tools/ProjectManager/Source/{ProjectsHome.ui => ProjectsHomeScreen.ui} (100%) create mode 100644 Code/Tools/ProjectManager/Source/ScreensCtrl.cpp create mode 100644 Code/Tools/ProjectManager/Source/ScreensCtrl.h diff --git a/Code/Tools/ProjectManager/Source/EngineSettings.cpp b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp similarity index 70% rename from Code/Tools/ProjectManager/Source/EngineSettings.cpp rename to Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp index bc359637e4..1adab41c0e 100644 --- a/Code/Tools/ProjectManager/Source/EngineSettings.cpp +++ b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp @@ -10,26 +10,21 @@ * */ -#include +#include -#include +#include namespace O3DE::ProjectManager { - EngineSettings::EngineSettings(ProjectManagerWindow* window) - : ScreenWidget(window) + EngineSettingsScreen::EngineSettingsScreen(QWidget* parent) + : ScreenWidget(parent) , m_ui(new Ui::EngineSettingsClass()) { m_ui->setupUi(this); } - EngineSettings::~EngineSettings() + ProjectManagerScreen EngineSettingsScreen::GetScreenEnum() { + return ProjectManagerScreen::EngineSettings; } - - void EngineSettings::ConnectSlotsAndSignals() - { - // Do nothing for now - } - } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/EngineSettings.h b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.h similarity index 81% rename from Code/Tools/ProjectManager/Source/EngineSettings.h rename to Code/Tools/ProjectManager/Source/EngineSettingsScreen.h index f90f760798..4baa3fb28c 100644 --- a/Code/Tools/ProjectManager/Source/EngineSettings.h +++ b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.h @@ -22,15 +22,13 @@ namespace Ui namespace O3DE::ProjectManager { - class EngineSettings + class EngineSettingsScreen : public ScreenWidget { public: - explicit EngineSettings(ProjectManagerWindow* window); - ~EngineSettings(); - - protected: - void ConnectSlotsAndSignals() override; + explicit EngineSettingsScreen(QWidget* parent = nullptr); + ~EngineSettingsScreen() = default; + ProjectManagerScreen GetScreenEnum() override; private: QScopedPointer m_ui; diff --git a/Code/Tools/ProjectManager/Source/EngineSettings.ui b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.ui similarity index 100% rename from Code/Tools/ProjectManager/Source/EngineSettings.ui rename to Code/Tools/ProjectManager/Source/EngineSettingsScreen.ui diff --git a/Code/Tools/ProjectManager/Source/FirstTimeUse.cpp b/Code/Tools/ProjectManager/Source/FirstTimeUse.cpp deleted file mode 100644 index 5f5dcd5087..0000000000 --- a/Code/Tools/ProjectManager/Source/FirstTimeUse.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include - -#include - -namespace O3DE::ProjectManager -{ - FirstTimeUse::FirstTimeUse(ProjectManagerWindow* window) - : ScreenWidget(window) - , m_ui(new Ui::FirstTimeUseClass()) - { - m_ui->setupUi(this); - - ConnectSlotsAndSignals(); - } - - FirstTimeUse::~FirstTimeUse() - { - } - - void FirstTimeUse::ConnectSlotsAndSignals() - { - QObject::connect(m_ui->createProjectButton, &QPushButton::pressed, this, &FirstTimeUse::HandleNewProjectButton); - QObject::connect(m_ui->openProjectButton, &QPushButton::pressed, this, &FirstTimeUse::HandleOpenProjectButton); - } - - void FirstTimeUse::HandleNewProjectButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::NewProjectSettings); - } - void FirstTimeUse::HandleOpenProjectButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::ProjectsHome); - } - -} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.cpp b/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.cpp new file mode 100644 index 0000000000..aa4dee1aa6 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.cpp @@ -0,0 +1,44 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include + +namespace O3DE::ProjectManager +{ + FirstTimeUseScreen::FirstTimeUseScreen(QWidget* parent) + : ScreenWidget(parent) + , m_ui(new Ui::FirstTimeUseClass()) + { + m_ui->setupUi(this); + + connect(m_ui->createProjectButton, &QPushButton::pressed, this, &FirstTimeUseScreen::HandleNewProjectButton); + connect(m_ui->openProjectButton, &QPushButton::pressed, this, &FirstTimeUseScreen::HandleOpenProjectButton); + } + + ProjectManagerScreen FirstTimeUseScreen::GetScreenEnum() + { + return ProjectManagerScreen::FirstTimeUse; + } + + void FirstTimeUseScreen::HandleNewProjectButton() + { + emit ResetScreenRequest(ProjectManagerScreen::NewProjectSettingsCore); + emit ChangeScreenRequest(ProjectManagerScreen::NewProjectSettingsCore); + } + void FirstTimeUseScreen::HandleOpenProjectButton() + { + emit ChangeScreenRequest(ProjectManagerScreen::ProjectsHome); + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FirstTimeUse.h b/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.h similarity index 83% rename from Code/Tools/ProjectManager/Source/FirstTimeUse.h rename to Code/Tools/ProjectManager/Source/FirstTimeUseScreen.h index 708513d493..4b4a99f16a 100644 --- a/Code/Tools/ProjectManager/Source/FirstTimeUse.h +++ b/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.h @@ -22,15 +22,13 @@ namespace Ui namespace O3DE::ProjectManager { - class FirstTimeUse + class FirstTimeUseScreen : public ScreenWidget { public: - explicit FirstTimeUse(ProjectManagerWindow* window); - ~FirstTimeUse(); - - protected: - void ConnectSlotsAndSignals() override; + explicit FirstTimeUseScreen(QWidget* parent = nullptr); + ~FirstTimeUseScreen() = default; + ProjectManagerScreen GetScreenEnum() override; protected slots: void HandleNewProjectButton(); diff --git a/Code/Tools/ProjectManager/Source/FirstTimeUse.ui b/Code/Tools/ProjectManager/Source/FirstTimeUseScreen.ui similarity index 100% rename from Code/Tools/ProjectManager/Source/FirstTimeUse.ui rename to Code/Tools/ProjectManager/Source/FirstTimeUseScreen.ui diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp similarity index 78% rename from Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.cpp rename to Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp index 6bb1e4959f..9f3d3b6e23 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp @@ -10,16 +10,15 @@ * */ -#include -#include +#include #include #include #include namespace O3DE::ProjectManager { - GemCatalog::GemCatalog(ProjectManagerWindow* window) - : ScreenWidget(window) + GemCatalogScreen::GemCatalogScreen(QWidget* parent) + : ScreenWidget(parent) { m_gemModel = new GemModel(this); @@ -40,15 +39,6 @@ namespace O3DE::ProjectManager inspectorPlaceholderWidget->setFixedWidth(250); hLayout->addWidget(inspectorPlaceholderWidget); - // Temporary back and next buttons until they are centralized and shared. - QDialogButtonBox* backNextButtons = new QDialogButtonBox(); - vLayout->addWidget(backNextButtons); - - QPushButton* tempBackButton = backNextButtons->addButton("Back", QDialogButtonBox::RejectRole); - QPushButton* tempNextButton = backNextButtons->addButton("Next", QDialogButtonBox::AcceptRole); - connect(tempBackButton, &QPushButton::pressed, this, &GemCatalog::HandleBackButton); - connect(tempNextButton, &QPushButton::pressed, this, &GemCatalog::HandleConfirmButton); - // Start: Temporary gem test data { m_gemModel->AddGem(GemInfo("EMotion FX", @@ -90,12 +80,13 @@ namespace O3DE::ProjectManager // End: Temporary gem test data } - void GemCatalog::HandleBackButton() + ProjectManagerScreen GemCatalogScreen::GetScreenEnum() { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::NewProjectSettings); + return ProjectManagerScreen::GemCatalog; } - void GemCatalog::HandleConfirmButton() + + QString GemCatalogScreen::GetNextButtonText() { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::ProjectsHome); + return "Create Project"; } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h similarity index 79% rename from Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.h rename to Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h index 489752bbe7..baa7af88b9 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalog.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h @@ -19,16 +19,14 @@ namespace O3DE::ProjectManager { - class GemCatalog + class GemCatalogScreen : public ScreenWidget { public: - explicit GemCatalog(ProjectManagerWindow* window); - ~GemCatalog() = default; - - protected slots: - void HandleBackButton(); - void HandleConfirmButton(); + explicit GemCatalogScreen(QWidget* parent = nullptr); + ~GemCatalogScreen() = default; + ProjectManagerScreen GetScreenEnum() override; + QString GetNextButtonText() override; private: GemListView* m_gemListView = nullptr; diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettings.cpp b/Code/Tools/ProjectManager/Source/NewProjectSettings.cpp deleted file mode 100644 index 2ebe54e682..0000000000 --- a/Code/Tools/ProjectManager/Source/NewProjectSettings.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include - -#include - -namespace O3DE::ProjectManager -{ - NewProjectSettings::NewProjectSettings(ProjectManagerWindow* window) - : ScreenWidget(window) - , m_ui(new Ui::NewProjectSettingsClass()) - { - m_ui->setupUi(this); - - ConnectSlotsAndSignals(); - } - - NewProjectSettings::~NewProjectSettings() - { - } - - void NewProjectSettings::ConnectSlotsAndSignals() - { - QObject::connect(m_ui->backButton, &QPushButton::pressed, this, &NewProjectSettings::HandleBackButton); - QObject::connect(m_ui->nextButton, &QPushButton::pressed, this, &NewProjectSettings::HandleNextButton); - } - - void NewProjectSettings::HandleBackButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::FirstTimeUse); - } - void NewProjectSettings::HandleNextButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::GemCatalog); - } - -} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettings.ui b/Code/Tools/ProjectManager/Source/NewProjectSettings.ui deleted file mode 100644 index 98db10338e..0000000000 --- a/Code/Tools/ProjectManager/Source/NewProjectSettings.ui +++ /dev/null @@ -1,97 +0,0 @@ - - - NewProjectSettingsClass - - - - 0 - 0 - 880 - 546 - - - - Form - - - - - - Project Name - - - - - - - - - - Project Path - - - - - - - - - - Project Template - - - - - - - - - Standard (Recommened) - - - - - - - Empty - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Back - - - - - - - Next - - - - - - - - - - diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp new file mode 100644 index 0000000000..976850cb87 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp @@ -0,0 +1,82 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +namespace O3DE::ProjectManager +{ + NewProjectSettingsScreen::NewProjectSettingsScreen(QWidget* parent) + : ScreenWidget(parent) + { + QHBoxLayout* hLayout = new QHBoxLayout(); + this->setLayout(hLayout); + + QVBoxLayout* vLayout = new QVBoxLayout(this); + + QLabel* projectNameLabel = new QLabel(this); + projectNameLabel->setText("Project Name"); + vLayout->addWidget(projectNameLabel); + + QLineEdit* projectNameLineEdit = new QLineEdit(this); + vLayout->addWidget(projectNameLineEdit); + + QLabel* projectPathLabel = new QLabel(this); + projectPathLabel->setText("Project Location"); + vLayout->addWidget(projectPathLabel); + + QLineEdit* projectPathLineEdit = new QLineEdit(this); + vLayout->addWidget(projectPathLineEdit); + + QLabel* projectTemplateLabel = new QLabel(this); + projectTemplateLabel->setText("Project Template"); + vLayout->addWidget(projectTemplateLabel); + + QHBoxLayout* templateLayout = new QHBoxLayout(this); + vLayout->addItem(templateLayout); + + QRadioButton* projectTemplateStandardRadioButton = new QRadioButton(this); + projectTemplateStandardRadioButton->setText("Standard (Recommened)"); + projectTemplateStandardRadioButton->setChecked(true); + templateLayout->addWidget(projectTemplateStandardRadioButton); + + QRadioButton* projectTemplateEmptyRadioButton = new QRadioButton(this); + projectTemplateEmptyRadioButton->setText("Empty"); + templateLayout->addWidget(projectTemplateEmptyRadioButton); + + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + vLayout->addItem(verticalSpacer); + + hLayout->addItem(vLayout); + + QWidget* gemsListPlaceholder = new QWidget(this); + gemsListPlaceholder->setFixedWidth(250); + hLayout->addWidget(gemsListPlaceholder); + } + + ProjectManagerScreen NewProjectSettingsScreen::GetScreenEnum() + { + return ProjectManagerScreen::NewProjectSettings; + } + + QString NewProjectSettingsScreen::GetNextButtonText() + { + return "Create Project"; + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h new file mode 100644 index 0000000000..2589f00fcd --- /dev/null +++ b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h @@ -0,0 +1,30 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#if !defined(Q_MOC_RUN) +#include +#endif + +namespace O3DE::ProjectManager +{ + class NewProjectSettingsScreen + : public ScreenWidget + { + public: + explicit NewProjectSettingsScreen(QWidget* parent = nullptr); + ~NewProjectSettingsScreen() = default; + ProjectManagerScreen GetScreenEnum() override; + QString GetNextButtonText() override; + }; + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectInfo.cpp b/Code/Tools/ProjectManager/Source/ProjectInfo.cpp index b3bdb87224..77bcb6f1b2 100644 --- a/Code/Tools/ProjectManager/Source/ProjectInfo.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectInfo.cpp @@ -14,11 +14,15 @@ namespace O3DE::ProjectManager { - ProjectInfo::ProjectInfo(const QString& path, const QString& projectName, const QString& productName, const AZ::Uuid projectId) + ProjectInfo::ProjectInfo(const QString& path, const QString& projectName, const QString& productName, const AZ::Uuid projectId, + const QString& imagePath, const QString& backgroundImagePath, bool isNew) : m_path(path) , m_projectName(projectName) , m_productName(productName) , m_projectId(projectId) + , m_imagePath(imagePath) + , m_backgroundImagePath(backgroundImagePath) + , m_isNew(isNew) { } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectInfo.h b/Code/Tools/ProjectManager/Source/ProjectInfo.h index e5dca97d5e..04ae358c14 100644 --- a/Code/Tools/ProjectManager/Source/ProjectInfo.h +++ b/Code/Tools/ProjectManager/Source/ProjectInfo.h @@ -23,14 +23,22 @@ namespace O3DE::ProjectManager { public: ProjectInfo() = default; - ProjectInfo(const QString& path, const QString& projectName, const QString& productName, const AZ::Uuid projectId); + ProjectInfo(const QString& path, const QString& projectName, const QString& productName, const AZ::Uuid projectId, + const QString& imagePath, const QString& backgroundImagePath, bool isNew); - // from o3de_manifest.json and o3de_projects.json + // From o3de_manifest.json and o3de_projects.json QString m_path; - // from project.json + // From project.json QString m_projectName; QString m_productName; AZ::Uuid m_projectId; + + // Used on projects home screen + QString m_imagePath; + QString m_backgroundImagePath; + + // Used in project creation + bool m_isNew = false; //! Is this a new project or existing }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.cpp b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.cpp index c86ebeee86..977667071f 100644 --- a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.cpp @@ -30,7 +30,11 @@ namespace O3DE::ProjectManager m_pythonBindings = AZStd::make_unique(engineRootPath); - ConnectSlotsAndSignals(); + m_screensCtrl = new ScreensCtrl(); + m_ui->verticalLayout->addWidget(m_screensCtrl); + + connect(m_ui->projectsMenu, &QMenu::aboutToShow, this, &ProjectManagerWindow::HandleProjectsMenu); + connect(m_ui->engineMenu, &QMenu::aboutToShow, this, &ProjectManagerWindow::HandleEngineMenu); QDir rootDir = QString::fromUtf8(engineRootPath.Native().data(), aznumeric_cast(engineRootPath.Native().size())); const auto pathOnDisk = rootDir.absoluteFilePath("Code/Tools/ProjectManager/Resources"); @@ -39,9 +43,16 @@ namespace O3DE::ProjectManager AzQtComponents::StyleManager::setStyleSheet(this, QStringLiteral("projectlauncherwindow:ProjectManagerWindow.qss")); - BuildScreens(); - - ChangeToScreen(ProjectManagerScreen::FirstTimeUse); + QVector screenEnums = + { + ProjectManagerScreen::FirstTimeUse, + ProjectManagerScreen::NewProjectSettingsCore, + ProjectManagerScreen::ProjectsHome, + ProjectManagerScreen::ProjectSettings, + ProjectManagerScreen::EngineSettings + }; + m_screensCtrl->BuildScreens(screenEnums); + m_screensCtrl->ForceChangeToScreen(ProjectManagerScreen::FirstTimeUse, false); } ProjectManagerWindow::~ProjectManagerWindow() @@ -49,61 +60,13 @@ namespace O3DE::ProjectManager m_pythonBindings.reset(); } - void ProjectManagerWindow::BuildScreens() - { - // Basically just iterate over the ProjectManagerScreen enum creating each screen - // Could add some fancy to do this but there are few screens right now - - ResetScreen(ProjectManagerScreen::FirstTimeUse); - ResetScreen(ProjectManagerScreen::NewProjectSettings); - ResetScreen(ProjectManagerScreen::GemCatalog); - ResetScreen(ProjectManagerScreen::ProjectsHome); - ResetScreen(ProjectManagerScreen::ProjectSettings); - ResetScreen(ProjectManagerScreen::EngineSettings); - } - - QStackedWidget* ProjectManagerWindow::GetScreenStack() - { - return m_ui->stackedScreens; - } - - void ProjectManagerWindow::ChangeToScreen(ProjectManagerScreen screen) - { - int index = aznumeric_cast(screen); - m_ui->stackedScreens->setCurrentIndex(index); - } - - void ProjectManagerWindow::ResetScreen(ProjectManagerScreen screen) - { - int index = aznumeric_cast(screen); - - // Fine the old screen if it exists and get rid of it so we can start fresh - QWidget* oldScreen = m_ui->stackedScreens->widget(index); - - if (oldScreen) - { - m_ui->stackedScreens->removeWidget(oldScreen); - oldScreen->deleteLater(); - } - - // Add new screen - QWidget* newScreen = BuildScreen(this, screen); - m_ui->stackedScreens->insertWidget(index, newScreen); - } - - void ProjectManagerWindow::ConnectSlotsAndSignals() - { - QObject::connect(m_ui->projectsMenu, &QMenu::aboutToShow, this, &ProjectManagerWindow::HandleProjectsMenu); - QObject::connect(m_ui->engineMenu, &QMenu::aboutToShow, this, &ProjectManagerWindow::HandleEngineMenu); - } - void ProjectManagerWindow::HandleProjectsMenu() { - ChangeToScreen(ProjectManagerScreen::ProjectsHome); + m_screensCtrl->ChangeToScreen(ProjectManagerScreen::ProjectsHome); } void ProjectManagerWindow::HandleEngineMenu() { - ChangeToScreen(ProjectManagerScreen::EngineSettings); + m_screensCtrl->ChangeToScreen(ProjectManagerScreen::EngineSettings); } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.h b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.h index 6a17c4464c..d5c586e59b 100644 --- a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.h +++ b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.h @@ -12,10 +12,9 @@ #pragma once #if !defined(Q_MOC_RUN) -#include - #include -#include + +#include #include #endif @@ -36,22 +35,13 @@ namespace O3DE::ProjectManager explicit ProjectManagerWindow(QWidget* parent, const AZ::IO::PathView& engineRootPath); ~ProjectManagerWindow(); - void BuildScreens(); - QStackedWidget* GetScreenStack(); - - public slots: - void ChangeToScreen(ProjectManagerScreen screen); - void ResetScreen(ProjectManagerScreen screen); - - protected: - void ConnectSlotsAndSignals(); - protected slots: void HandleProjectsMenu(); void HandleEngineMenu(); private: QScopedPointer m_ui; + ScreensCtrl* m_screensCtrl; AZStd::unique_ptr m_pythonBindings; }; diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.ui b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.ui index 704e74e38e..789dd1b656 100644 --- a/Code/Tools/ProjectManager/Source/ProjectManagerWindow.ui +++ b/Code/Tools/ProjectManager/Source/ProjectManagerWindow.ui @@ -14,11 +14,7 @@ O3DE Project Manager - - - - - + diff --git a/Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.cpp b/Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.cpp new file mode 100644 index 0000000000..1dccabb484 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.cpp @@ -0,0 +1,95 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include +#include + +#include +#include +#include + +namespace O3DE::ProjectManager +{ + ProjectSettingsCtrl::ProjectSettingsCtrl(QWidget* parent) + : ScreenWidget(parent) + { + QVBoxLayout* vLayout = new QVBoxLayout(); + setLayout(vLayout); + + m_screensCtrl = new ScreensCtrl(); + vLayout->addWidget(m_screensCtrl); + + QDialogButtonBox* backNextButtons = new QDialogButtonBox(); + vLayout->addWidget(backNextButtons); + + m_backButton = backNextButtons->addButton("Back", QDialogButtonBox::RejectRole); + m_nextButton = backNextButtons->addButton("Next", QDialogButtonBox::ApplyRole); + + connect(m_backButton, &QPushButton::pressed, this, &ProjectSettingsCtrl::HandleBackButton); + connect(m_nextButton, &QPushButton::pressed, this, &ProjectSettingsCtrl::HandleNextButton); + + m_screensOrder = + { + ProjectManagerScreen::NewProjectSettings, + ProjectManagerScreen::GemCatalog + }; + m_screensCtrl->BuildScreens(m_screensOrder); + m_screensCtrl->ForceChangeToScreen(ProjectManagerScreen::NewProjectSettings, false); + UpdateNextButtonText(); + } + + ProjectManagerScreen ProjectSettingsCtrl::GetScreenEnum() + { + return ProjectManagerScreen::NewProjectSettingsCore; + } + + void ProjectSettingsCtrl::HandleBackButton() + { + if (!m_screensCtrl->GotoPreviousScreen()) + { + emit GotoPreviousScreenRequest(); + } + else + { + UpdateNextButtonText(); + } + } + void ProjectSettingsCtrl::HandleNextButton() + { + ProjectManagerScreen screenEnum = m_screensCtrl->GetCurrentScreen()->GetScreenEnum(); + auto screenOrderIter = m_screensOrder.begin(); + for (; screenOrderIter != m_screensOrder.end(); ++screenOrderIter) + { + if (*screenOrderIter == screenEnum) + { + ++screenOrderIter; + break; + } + } + + if (screenOrderIter != m_screensOrder.end()) + { + m_screensCtrl->ChangeToScreen(*screenOrderIter); + UpdateNextButtonText(); + } + else + { + emit ChangeScreenRequest(ProjectManagerScreen::ProjectsHome); + } + } + + void ProjectSettingsCtrl::UpdateNextButtonText() + { + m_nextButton->setText(m_screensCtrl->GetCurrentScreen()->GetNextButtonText()); + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettings.h b/Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.h similarity index 65% rename from Code/Tools/ProjectManager/Source/NewProjectSettings.h rename to Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.h index f5fa91a9b9..0b46436df1 100644 --- a/Code/Tools/ProjectManager/Source/NewProjectSettings.h +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsCtrl.h @@ -13,31 +13,33 @@ #if !defined(Q_MOC_RUN) #include -#endif -namespace Ui -{ - class NewProjectSettingsClass; -} +#include + +#include +#endif namespace O3DE::ProjectManager { - class NewProjectSettings + class ProjectSettingsCtrl : public ScreenWidget { public: - explicit NewProjectSettings(ProjectManagerWindow* window); - ~NewProjectSettings(); - - protected: - void ConnectSlotsAndSignals() override; + explicit ProjectSettingsCtrl(QWidget* parent = nullptr); + ~ProjectSettingsCtrl() = default; + ProjectManagerScreen GetScreenEnum() override; protected slots: void HandleBackButton(); void HandleNextButton(); private: - QScopedPointer m_ui; + void UpdateNextButtonText(); + + ScreensCtrl* m_screensCtrl; + QPushButton* m_backButton; + QPushButton* m_nextButton; + QVector m_screensOrder; }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectSettings.cpp b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp similarity index 57% rename from Code/Tools/ProjectManager/Source/ProjectSettings.cpp rename to Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp index bc653f9c5b..52fca439b4 100644 --- a/Code/Tools/ProjectManager/Source/ProjectSettings.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp @@ -10,33 +10,29 @@ * */ -#include +#include -#include +#include namespace O3DE::ProjectManager { - ProjectSettings::ProjectSettings(ProjectManagerWindow* window) - : ScreenWidget(window) + ProjectSettingsScreen::ProjectSettingsScreen(QWidget* parent) + : ScreenWidget(parent) , m_ui(new Ui::ProjectSettingsClass()) { m_ui->setupUi(this); - ConnectSlotsAndSignals(); + connect(m_ui->gemsButton, &QPushButton::pressed, this, &ProjectSettingsScreen::HandleGemsButton); } - ProjectSettings::~ProjectSettings() + ProjectManagerScreen ProjectSettingsScreen::GetScreenEnum() { + return ProjectManagerScreen::ProjectSettings; } - void ProjectSettings::ConnectSlotsAndSignals() + void ProjectSettingsScreen::HandleGemsButton() { - QObject::connect(m_ui->gemsButton, &QPushButton::pressed, this, &ProjectSettings::HandleGemsButton); - } - - void ProjectSettings::HandleGemsButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::GemCatalog); + emit ChangeScreenRequest(ProjectManagerScreen::GemCatalog); } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectSettings.h b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h similarity index 82% rename from Code/Tools/ProjectManager/Source/ProjectSettings.h rename to Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h index e7781d3a2a..1ec1b46f44 100644 --- a/Code/Tools/ProjectManager/Source/ProjectSettings.h +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h @@ -22,15 +22,13 @@ namespace Ui namespace O3DE::ProjectManager { - class ProjectSettings + class ProjectSettingsScreen : public ScreenWidget { public: - explicit ProjectSettings(ProjectManagerWindow* window); - ~ProjectSettings(); - - protected: - void ConnectSlotsAndSignals() override; + explicit ProjectSettingsScreen(QWidget* parent = nullptr); + ~ProjectSettingsScreen() = default; + ProjectManagerScreen GetScreenEnum() override; protected slots: void HandleGemsButton(); diff --git a/Code/Tools/ProjectManager/Source/ProjectSettings.ui b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.ui similarity index 100% rename from Code/Tools/ProjectManager/Source/ProjectSettings.ui rename to Code/Tools/ProjectManager/Source/ProjectSettingsScreen.ui diff --git a/Code/Tools/ProjectManager/Source/ProjectsHome.cpp b/Code/Tools/ProjectManager/Source/ProjectsHome.cpp deleted file mode 100644 index a45b923946..0000000000 --- a/Code/Tools/ProjectManager/Source/ProjectsHome.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include - -#include - -#include - -namespace O3DE::ProjectManager -{ - ProjectsHome::ProjectsHome(ProjectManagerWindow* window) - : ScreenWidget(window) - , m_ui(new Ui::ProjectsHomeClass()) - { - m_ui->setupUi(this); - - ConnectSlotsAndSignals(); - - // example of how to get the current project name - ProjectInfo currentProject = PythonBindingsInterface::Get()->GetCurrentProject(); - } - - ProjectsHome::~ProjectsHome() - { - } - - void ProjectsHome::ConnectSlotsAndSignals() - { - QObject::connect(m_ui->newProjectButton, &QPushButton::pressed, this, &ProjectsHome::HandleNewProjectButton); - QObject::connect(m_ui->addProjectButton, &QPushButton::pressed, this, &ProjectsHome::HandleAddProjectButton); - QObject::connect(m_ui->editProjectButton, &QPushButton::pressed, this, &ProjectsHome::HandleEditProjectButton); - } - - void ProjectsHome::HandleNewProjectButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::NewProjectSettings); - } - void ProjectsHome::HandleAddProjectButton() - { - //Do nothing for now - } - void ProjectsHome::HandleEditProjectButton() - { - m_projectManagerWindow->ChangeToScreen(ProjectManagerScreen::ProjectSettings); - } - -} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.cpp new file mode 100644 index 0000000000..539f79b017 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.cpp @@ -0,0 +1,51 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include + +#include + +namespace O3DE::ProjectManager +{ + ProjectsHomeScreen::ProjectsHomeScreen(QWidget* parent) + : ScreenWidget(parent) + , m_ui(new Ui::ProjectsHomeClass()) + { + m_ui->setupUi(this); + + connect(m_ui->newProjectButton, &QPushButton::pressed, this, &ProjectsHomeScreen::HandleNewProjectButton); + connect(m_ui->addProjectButton, &QPushButton::pressed, this, &ProjectsHomeScreen::HandleAddProjectButton); + connect(m_ui->editProjectButton, &QPushButton::pressed, this, &ProjectsHomeScreen::HandleEditProjectButton); + } + + ProjectManagerScreen ProjectsHomeScreen::GetScreenEnum() + { + return ProjectManagerScreen::ProjectsHome; + } + + void ProjectsHomeScreen::HandleNewProjectButton() + { + emit ResetScreenRequest(ProjectManagerScreen::NewProjectSettingsCore); + emit ChangeScreenRequest(ProjectManagerScreen::NewProjectSettingsCore); + } + void ProjectsHomeScreen::HandleAddProjectButton() + { + // Do nothing for now + } + void ProjectsHomeScreen::HandleEditProjectButton() + { + emit ChangeScreenRequest(ProjectManagerScreen::ProjectSettings); + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectsHome.h b/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.h similarity index 83% rename from Code/Tools/ProjectManager/Source/ProjectsHome.h rename to Code/Tools/ProjectManager/Source/ProjectsHomeScreen.h index 4cc2918a38..9fd5919d2d 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsHome.h +++ b/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.h @@ -22,16 +22,14 @@ namespace Ui namespace O3DE::ProjectManager { - class ProjectsHome + class ProjectsHomeScreen : public ScreenWidget { public: - explicit ProjectsHome(ProjectManagerWindow* window); - ~ProjectsHome(); - - protected: - void ConnectSlotsAndSignals() override; + explicit ProjectsHomeScreen(QWidget* parent = nullptr); + ~ProjectsHomeScreen() = default; + ProjectManagerScreen GetScreenEnum() override; protected slots: void HandleNewProjectButton(); diff --git a/Code/Tools/ProjectManager/Source/ProjectsHome.ui b/Code/Tools/ProjectManager/Source/ProjectsHomeScreen.ui similarity index 100% rename from Code/Tools/ProjectManager/Source/ProjectsHome.ui rename to Code/Tools/ProjectManager/Source/ProjectsHomeScreen.ui diff --git a/Code/Tools/ProjectManager/Source/ScreenDefs.h b/Code/Tools/ProjectManager/Source/ScreenDefs.h index f02b1de1b8..658b8d88fd 100644 --- a/Code/Tools/ProjectManager/Source/ScreenDefs.h +++ b/Code/Tools/ProjectManager/Source/ScreenDefs.h @@ -13,9 +13,12 @@ namespace O3DE::ProjectManager { - enum class ProjectManagerScreen + enum ProjectManagerScreen { + Invalid = -1, + Empty, FirstTimeUse, + NewProjectSettingsCore, NewProjectSettings, GemCatalog, ProjectsHome, diff --git a/Code/Tools/ProjectManager/Source/ScreenFactory.cpp b/Code/Tools/ProjectManager/Source/ScreenFactory.cpp index 9250b71ccd..1089f8ee94 100644 --- a/Code/Tools/ProjectManager/Source/ScreenFactory.cpp +++ b/Code/Tools/ProjectManager/Source/ScreenFactory.cpp @@ -11,33 +11,48 @@ */ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include namespace O3DE::ProjectManager { - QWidget* BuildScreen(ProjectManagerWindow* window, ProjectManagerScreen screen) + ScreenWidget* BuildScreen(QWidget* parent, ProjectManagerScreen screen) { + ScreenWidget* newScreen; + switch(screen) { case (ProjectManagerScreen::FirstTimeUse): - return new FirstTimeUse(window); + newScreen = new FirstTimeUseScreen(parent); + break; + case (ProjectManagerScreen::NewProjectSettingsCore): + newScreen = new ProjectSettingsCtrl(parent); + break; case (ProjectManagerScreen::NewProjectSettings): - return new NewProjectSettings(window); + newScreen = new NewProjectSettingsScreen(parent); + break; case (ProjectManagerScreen::GemCatalog): - return new GemCatalog(window); + newScreen = new GemCatalogScreen(parent); + break; case (ProjectManagerScreen::ProjectsHome): - return new ProjectsHome(window); + newScreen = new ProjectsHomeScreen(parent); + break; case (ProjectManagerScreen::ProjectSettings): - return new ProjectSettings(window); + newScreen = new ProjectSettingsScreen(parent); + break; case (ProjectManagerScreen::EngineSettings): - return new EngineSettings(window); + newScreen = new EngineSettingsScreen(parent); + break; + case (ProjectManagerScreen::Empty): default: - return new QWidget(window->GetScreenStack()); + newScreen = new ScreenWidget(parent); } + + return newScreen; } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ScreenFactory.h b/Code/Tools/ProjectManager/Source/ScreenFactory.h index ea68534a08..ad03be19c5 100644 --- a/Code/Tools/ProjectManager/Source/ScreenFactory.h +++ b/Code/Tools/ProjectManager/Source/ScreenFactory.h @@ -13,12 +13,11 @@ #include -#include - #include - namespace O3DE::ProjectManager { - QWidget* BuildScreen(ProjectManagerWindow* window, ProjectManagerScreen screen); + class ScreenWidget; + + ScreenWidget* BuildScreen(QWidget* parent = nullptr, ProjectManagerScreen screen = ProjectManagerScreen::Empty); } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ScreenWidget.h b/Code/Tools/ProjectManager/Source/ScreenWidget.h index ddf4add65b..ae235daf2b 100644 --- a/Code/Tools/ProjectManager/Source/ScreenWidget.h +++ b/Code/Tools/ProjectManager/Source/ScreenWidget.h @@ -12,7 +12,7 @@ #pragma once #if !defined(Q_MOC_RUN) -#include +#include #include #endif @@ -22,17 +22,32 @@ namespace O3DE::ProjectManager class ScreenWidget : public QWidget { + Q_OBJECT + public: - explicit ScreenWidget(ProjectManagerWindow* window) - : QWidget(window->GetScreenStack()) - , m_projectManagerWindow(window) + explicit ScreenWidget(QWidget* parent = nullptr) + : QWidget(parent) { } + ~ScreenWidget() = default; - protected: - virtual void ConnectSlotsAndSignals() {} + virtual ProjectManagerScreen GetScreenEnum() + { + return ProjectManagerScreen::Empty; + } + virtual bool IsReadyForNextScreen() + { + return true; + } + virtual QString GetNextButtonText() + { + return "Next"; + } - ProjectManagerWindow* m_projectManagerWindow; + signals: + void ChangeScreenRequest(ProjectManagerScreen screen); + void GotoPreviousScreenRequest(); + void ResetScreenRequest(ProjectManagerScreen screen); }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ScreensCtrl.cpp b/Code/Tools/ProjectManager/Source/ScreensCtrl.cpp new file mode 100644 index 0000000000..69af09f496 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ScreensCtrl.cpp @@ -0,0 +1,149 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include +#include +#include + +#include + +namespace O3DE::ProjectManager +{ + ScreensCtrl::ScreensCtrl(QWidget* parent) + : QWidget(parent) + { + QVBoxLayout* vLayout = new QVBoxLayout(); + setLayout(vLayout); + + m_screenStack = new QStackedWidget(); + vLayout->addWidget(m_screenStack); + + //Track the bottom of the stack + m_screenVisitOrder.push(ProjectManagerScreen::Invalid); + } + + void ScreensCtrl::BuildScreens(QVector screens) + { + for (ProjectManagerScreen screen : screens) + { + ResetScreen(screen); + } + } + + ScreenWidget* ScreensCtrl::FindScreen(ProjectManagerScreen screen) + { + const auto iterator = m_screenMap.find(screen); + if (iterator != m_screenMap.end()) + { + return iterator.value(); + } + else + { + return nullptr; + } + } + + ScreenWidget* ScreensCtrl::GetCurrentScreen() + { + return reinterpret_cast(m_screenStack->currentWidget()); + } + + bool ScreensCtrl::ChangeToScreen(ProjectManagerScreen screen) + { + if (m_screenStack->currentWidget()) + { + ScreenWidget* currentScreenWidget = GetCurrentScreen(); + if (currentScreenWidget->IsReadyForNextScreen()) + { + return ForceChangeToScreen(screen); + } + } + return false; + } + + bool ScreensCtrl::ForceChangeToScreen(ProjectManagerScreen screen, bool addVisit) + { + const auto iterator = m_screenMap.find(screen); + if (iterator != m_screenMap.end()) + { + ScreenWidget* currentScreen = GetCurrentScreen(); + if (currentScreen != iterator.value()) + { + if (addVisit) + { + m_screenVisitOrder.push(currentScreen->GetScreenEnum()); + } + m_screenStack->setCurrentWidget(iterator.value()); + return true; + } + } + + return false; + } + + bool ScreensCtrl::GotoPreviousScreen() + { + // Don't go back if we are on the first set screen + if (m_screenVisitOrder.top() != ProjectManagerScreen::Invalid) + { + // We do not check with screen if we can go back, we should always be able to go back + return ForceChangeToScreen(m_screenVisitOrder.pop(), false); + } + return false; + } + + void ScreensCtrl::ResetScreen(ProjectManagerScreen screen) + { + // Delete old screen if it exists to start fresh + DeleteScreen(screen); + + // Add new screen + ScreenWidget* newScreen = BuildScreen(this, screen); + m_screenStack->addWidget(newScreen); + m_screenMap.insert(screen, newScreen); + + connect(newScreen, &ScreenWidget::ChangeScreenRequest, this, &ScreensCtrl::ChangeToScreen); + connect(newScreen, &ScreenWidget::GotoPreviousScreenRequest, this, &ScreensCtrl::GotoPreviousScreen); + connect(newScreen, &ScreenWidget::ResetScreenRequest, this, &ScreensCtrl::ResetScreen); + } + + void ScreensCtrl::ResetAllScreens() + { + for (auto iter = m_screenMap.begin(); iter != m_screenMap.end(); ++iter) + { + ResetScreen(iter.key()); + } + } + + void ScreensCtrl::DeleteScreen(ProjectManagerScreen screen) + { + // Find the old screen if it exists and get rid of it + const auto iter = m_screenMap.find(screen); + if (iter != m_screenMap.end()) + { + m_screenStack->removeWidget(iter.value()); + iter.value()->deleteLater(); + + // Erase does not cause a rehash so interators remain valid + m_screenMap.erase(iter); + } + } + + void ScreensCtrl::DeleteAllScreens() + { + for (auto iter = m_screenMap.begin(); iter != m_screenMap.end(); ++iter) + { + DeleteScreen(iter.key()); + } + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ScreensCtrl.h b/Code/Tools/ProjectManager/Source/ScreensCtrl.h new file mode 100644 index 0000000000..7912a314e3 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ScreensCtrl.h @@ -0,0 +1,53 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#if !defined(Q_MOC_RUN) +#include + +#include +#include +#endif + +namespace O3DE::ProjectManager +{ + class ScreenWidget; + + class ScreensCtrl + : public QWidget + { + Q_OBJECT + + public: + explicit ScreensCtrl(QWidget* parent = nullptr); + ~ScreensCtrl() = default; + + void BuildScreens(QVector screens); + ScreenWidget* FindScreen(ProjectManagerScreen screen); + ScreenWidget* GetCurrentScreen(); + + public slots: + bool ChangeToScreen(ProjectManagerScreen screen); + bool ForceChangeToScreen(ProjectManagerScreen screen, bool addVisit = true); + bool GotoPreviousScreen(); + void ResetScreen(ProjectManagerScreen screen); + void ResetAllScreens(); + void DeleteScreen(ProjectManagerScreen screen); + void DeleteAllScreens(); + + private: + QStackedWidget* m_screenStack; + QHash m_screenMap; + QStack m_screenVisitOrder; + }; + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/project_manager_files.cmake b/Code/Tools/ProjectManager/project_manager_files.cmake index da0b7cdec7..86a538f9db 100644 --- a/Code/Tools/ProjectManager/project_manager_files.cmake +++ b/Code/Tools/ProjectManager/project_manager_files.cmake @@ -15,36 +15,39 @@ set(FILES Source/ScreenDefs.h Source/ScreenFactory.h Source/ScreenFactory.cpp + Source/ScreensCtrl.h + Source/ScreensCtrl.cpp Source/ScreenWidget.h - Source/FirstTimeUse.h - Source/FirstTimeUse.cpp - Source/FirstTimeUse.ui - Source/ProjectInfo.h - Source/ProjectInfo.cpp + Source/FirstTimeUseScreen.h + Source/FirstTimeUseScreen.cpp + Source/FirstTimeUseScreen.ui Source/ProjectManagerWindow.h Source/ProjectManagerWindow.cpp Source/ProjectManagerWindow.ui Source/PythonBindings.h Source/PythonBindings.cpp Source/PythonBindingsInterface.h - Source/NewProjectSettings.h - Source/NewProjectSettings.cpp - Source/NewProjectSettings.ui - Source/ProjectsHome.h - Source/ProjectsHome.cpp - Source/ProjectsHome.ui - Source/ProjectSettings.h - Source/ProjectSettings.cpp - Source/ProjectSettings.ui - Source/EngineSettings.h - Source/EngineSettings.cpp - Source/EngineSettings.ui + Source/ProjectInfo.h + Source/ProjectInfo.cpp + Source/NewProjectSettingsScreen.h + Source/NewProjectSettingsScreen.cpp + Source/ProjectSettingsCtrl.h + Source/ProjectSettingsCtrl.cpp + Source/ProjectsHomeScreen.h + Source/ProjectsHomeScreen.cpp + Source/ProjectsHomeScreen.ui + Source/ProjectSettingsScreen.h + Source/ProjectSettingsScreen.cpp + Source/ProjectSettingsScreen.ui + Source/EngineSettingsScreen.h + Source/EngineSettingsScreen.cpp + Source/EngineSettingsScreen.ui Source/LinkWidget.h Source/LinkWidget.cpp Source/TagWidget.h Source/TagWidget.cpp - Source/GemCatalog/GemCatalog.h - Source/GemCatalog/GemCatalog.cpp + Source/GemCatalog/GemCatalogScreen.h + Source/GemCatalog/GemCatalogScreen.cpp Source/GemCatalog/GemInfo.h Source/GemCatalog/GemInfo.cpp Source/GemCatalog/GemItemDelegate.h