123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- * 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 <GemCatalog/GemCatalogScreen.h>
- #include <PythonBindingsInterface.h>
- #include <ScreenHeaderWidget.h>
- #include <ScreensCtrl.h>
- #include <UpdateProjectCtrl.h>
- #include <UpdateProjectSettingsScreen.h>
- #include <ProjectUtils.h>
- #include <QDialogButtonBox>
- #include <QMessageBox>
- #include <QPushButton>
- #include <QStackedWidget>
- #include <QTabWidget>
- #include <QVBoxLayout>
- namespace O3DE::ProjectManager
- {
- UpdateProjectCtrl::UpdateProjectCtrl(QWidget* parent)
- : ScreenWidget(parent)
- {
- QVBoxLayout* vLayout = new QVBoxLayout();
- vLayout->setContentsMargins(0, 0, 0, 0);
- m_header = new ScreenHeader(this);
- m_header->setTitle(tr(""));
- m_header->setSubTitle(tr("Edit Project Settings:"));
- connect(m_header->backButton(), &QPushButton::clicked, this, &UpdateProjectCtrl::HandleBackButton);
- vLayout->addWidget(m_header);
- m_updateSettingsScreen = new UpdateProjectSettingsScreen();
- m_gemCatalogScreen = new GemCatalogScreen();
- m_stack = new QStackedWidget(this);
- m_stack->setObjectName("body");
- m_stack->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding));
- vLayout->addWidget(m_stack);
- QFrame* topBarFrameWidget = new QFrame(this);
- topBarFrameWidget->setObjectName("projectSettingsTopFrame");
- QHBoxLayout* topBarHLayout = new QHBoxLayout();
- topBarHLayout->setContentsMargins(0, 0, 0, 0);
- topBarFrameWidget->setLayout(topBarHLayout);
- QTabWidget* tabWidget = new QTabWidget();
- tabWidget->setObjectName("projectSettingsTab");
- tabWidget->tabBar()->setObjectName("projectSettingsTabBar");
- tabWidget->addTab(m_updateSettingsScreen, tr("General"));
- QPushButton* gemsButton = new QPushButton(tr("Add More Gems"), this);
- topBarHLayout->addWidget(gemsButton);
- tabWidget->setCornerWidget(gemsButton);
- topBarHLayout->addWidget(tabWidget);
- m_stack->addWidget(topBarFrameWidget);
- m_stack->addWidget(m_gemCatalogScreen);
- QDialogButtonBox* backNextButtons = new QDialogButtonBox();
- backNextButtons->setObjectName("footer");
- vLayout->addWidget(backNextButtons);
- m_backButton = backNextButtons->addButton(tr("Back"), QDialogButtonBox::RejectRole);
- m_backButton->setProperty("secondary", true);
- m_nextButton = backNextButtons->addButton(tr("Next"), QDialogButtonBox::ApplyRole);
- connect(gemsButton, &QPushButton::clicked, this, &UpdateProjectCtrl::HandleGemsButton);
- connect(m_backButton, &QPushButton::clicked, this, &UpdateProjectCtrl::HandleBackButton);
- connect(m_nextButton, &QPushButton::clicked, this, &UpdateProjectCtrl::HandleNextButton);
- connect(reinterpret_cast<ScreensCtrl*>(parent), &ScreensCtrl::NotifyCurrentProject, this, &UpdateProjectCtrl::UpdateCurrentProject);
- Update();
- setLayout(vLayout);
- }
- ProjectManagerScreen UpdateProjectCtrl::GetScreenEnum()
- {
- return ProjectManagerScreen::UpdateProject;
- }
- void UpdateProjectCtrl::NotifyCurrentScreen()
- {
- m_stack->setCurrentIndex(ScreenOrder::Settings);
- Update();
- }
- void UpdateProjectCtrl::HandleGemsButton()
- {
- // The next page is the gem catalog. Gather the available gems that will be shown in the gem catalog.
- m_gemCatalogScreen->ReinitForProject(m_projectInfo.m_path, /*isNewProject=*/false);
- m_stack->setCurrentWidget(m_gemCatalogScreen);
- Update();
- }
- void UpdateProjectCtrl::HandleBackButton()
- {
- if (m_stack->currentIndex() > 0)
- {
- m_stack->setCurrentIndex(m_stack->currentIndex() - 1);
- Update();
- }
- else
- {
- emit GotoPreviousScreenRequest();
- }
- }
- void UpdateProjectCtrl::HandleNextButton()
- {
- bool shouldRebuild = false;
- if (m_stack->currentIndex() == ScreenOrder::Settings && m_updateSettingsScreen)
- {
- if (m_updateSettingsScreen)
- {
- if (!m_updateSettingsScreen->Validate())
- {
- QMessageBox::critical(this, tr("Invalid project settings"), tr("Invalid project settings"));
- return;
- }
- ProjectInfo newProjectSettings = m_updateSettingsScreen->GetProjectInfo();
- // Update project if settings changed
- if (m_projectInfo != newProjectSettings)
- {
- bool result = PythonBindingsInterface::Get()->UpdateProject(newProjectSettings);
- if (!result)
- {
- QMessageBox::critical(this, tr("Project update failed"), tr("Failed to update project."));
- return;
- }
- }
- // Check if project path has changed and move it
- if (newProjectSettings.m_path != m_projectInfo.m_path)
- {
- if (!ProjectUtils::MoveProject(m_projectInfo.m_path, newProjectSettings.m_path))
- {
- QMessageBox::critical(this, tr("Project move failed"), tr("Failed to move project."));
- return;
- }
- }
- m_projectInfo = newProjectSettings;
- }
- }
- else if (m_stack->currentIndex() == ScreenOrder::Gems && m_gemCatalogScreen)
- {
- // Enable or disable the gems that got adjusted in the gem catalog and apply them to the given project.
- m_gemCatalogScreen->EnableDisableGemsForProject(m_projectInfo.m_path);
- shouldRebuild = true;
- }
- if (shouldRebuild)
- {
- emit NotifyBuildProject(m_projectInfo);
- }
- emit ChangeScreenRequest(ProjectManagerScreen::Projects);
- }
- void UpdateProjectCtrl::UpdateCurrentProject(const QString& projectPath)
- {
- auto projectResult = PythonBindingsInterface::Get()->GetProject(projectPath);
- if (projectResult.IsSuccess())
- {
- m_projectInfo = projectResult.GetValue();
- }
- Update();
- UpdateSettingsScreen();
- }
- void UpdateProjectCtrl::Update()
- {
- if (m_stack->currentIndex() == ScreenOrder::Gems)
- {
- m_header->setSubTitle(QString(tr("Add More Gems to \"%1\"")).arg(m_projectInfo.m_projectName));
- m_nextButton->setText(tr("Confirm"));
- }
- else
- {
- m_header->setSubTitle(QString(tr("Edit Project Settings: \"%1\"")).arg(m_projectInfo.m_projectName));
- m_nextButton->setText(tr("Save"));
- }
- }
- void UpdateProjectCtrl::UpdateSettingsScreen()
- {
- m_updateSettingsScreen->SetProjectInfo(m_projectInfo);
- }
- } // namespace O3DE::ProjectManager
|