CreateProjectCtrl.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
  3. * its licensors.
  4. *
  5. * For complete copyright and license terms please see the LICENSE at the root of this
  6. * distribution (the "License"). All use of this software is governed by the License,
  7. * or, if provided, by the license below or the license accompanying this file. Do not
  8. * remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
  9. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. *
  11. */
  12. #include <CreateProjectCtrl.h>
  13. #include <ScreensCtrl.h>
  14. #include <PythonBindingsInterface.h>
  15. #include <NewProjectSettingsScreen.h>
  16. #include <ScreenHeaderWidget.h>
  17. #include <GemCatalog/GemCatalogScreen.h>
  18. #include <QDialogButtonBox>
  19. #include <QHBoxLayout>
  20. #include <QVBoxLayout>
  21. #include <QPushButton>
  22. #include <QMessageBox>
  23. #include <QStackedWidget>
  24. #include <QLabel>
  25. #include <QSizePolicy>
  26. namespace O3DE::ProjectManager
  27. {
  28. CreateProjectCtrl::CreateProjectCtrl(QWidget* parent)
  29. : ScreenWidget(parent)
  30. {
  31. QVBoxLayout* vLayout = new QVBoxLayout();
  32. vLayout->setContentsMargins(0,0,0,0);
  33. m_header = new ScreenHeader(this);
  34. m_header->setTitle(tr("Create a New Project"));
  35. m_header->setSubTitle(tr("Enter Project Details"));
  36. connect(m_header->backButton(), &QPushButton::clicked, this, &CreateProjectCtrl::HandleBackButton);
  37. vLayout->addWidget(m_header);
  38. m_stack = new QStackedWidget(this);
  39. m_stack->setObjectName("body");
  40. m_stack->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding));
  41. m_stack->addWidget(new NewProjectSettingsScreen());
  42. m_stack->addWidget(new GemCatalogScreen());
  43. vLayout->addWidget(m_stack);
  44. QDialogButtonBox* backNextButtons = new QDialogButtonBox();
  45. backNextButtons->setObjectName("footer");
  46. vLayout->addWidget(backNextButtons);
  47. m_backButton = backNextButtons->addButton(tr("Back"), QDialogButtonBox::RejectRole);
  48. m_backButton->setProperty("secondary", true);
  49. m_nextButton = backNextButtons->addButton(tr("Next"), QDialogButtonBox::ApplyRole);
  50. connect(m_backButton, &QPushButton::clicked, this, &CreateProjectCtrl::HandleBackButton);
  51. connect(m_nextButton, &QPushButton::clicked, this, &CreateProjectCtrl::HandleNextButton);
  52. Update();
  53. setLayout(vLayout);
  54. }
  55. ProjectManagerScreen CreateProjectCtrl::GetScreenEnum()
  56. {
  57. return ProjectManagerScreen::CreateProject;
  58. }
  59. void CreateProjectCtrl::HandleBackButton()
  60. {
  61. if (m_stack->currentIndex() > 0)
  62. {
  63. m_stack->setCurrentIndex(m_stack->currentIndex() - 1);
  64. Update();
  65. }
  66. else
  67. {
  68. emit GotoPreviousScreenRequest();
  69. }
  70. }
  71. void CreateProjectCtrl::HandleNextButton()
  72. {
  73. ScreenWidget* currentScreen = reinterpret_cast<ScreenWidget*>(m_stack->currentWidget());
  74. ProjectManagerScreen screenEnum = currentScreen->GetScreenEnum();
  75. if (screenEnum == ProjectManagerScreen::NewProjectSettings)
  76. {
  77. auto newProjectScreen = reinterpret_cast<NewProjectSettingsScreen*>(currentScreen);
  78. if (newProjectScreen)
  79. {
  80. if (!newProjectScreen->Validate())
  81. {
  82. QMessageBox::critical(this, tr("Invalid project settings"), tr("Invalid project settings"));
  83. return;
  84. }
  85. m_projectInfo = newProjectScreen->GetProjectInfo();
  86. m_projectTemplatePath = newProjectScreen->GetProjectTemplatePath();
  87. }
  88. }
  89. if (m_stack->currentIndex() != m_stack->count() - 1)
  90. {
  91. m_stack->setCurrentIndex(m_stack->currentIndex() + 1);
  92. Update();
  93. }
  94. else
  95. {
  96. auto result = PythonBindingsInterface::Get()->CreateProject(m_projectTemplatePath, m_projectInfo);
  97. if (result.IsSuccess())
  98. {
  99. // adding gems is not implemented yet because we don't know what targets to add or how to add them
  100. emit ChangeScreenRequest(ProjectManagerScreen::Projects);
  101. }
  102. else
  103. {
  104. QMessageBox::critical(this, tr("Project creation failed"), tr("Failed to create project."));
  105. }
  106. }
  107. }
  108. void CreateProjectCtrl::Update()
  109. {
  110. ScreenWidget* currentScreen = reinterpret_cast<ScreenWidget*>(m_stack->currentWidget());
  111. if (currentScreen && currentScreen->GetScreenEnum() == ProjectManagerScreen::GemCatalog)
  112. {
  113. m_header->setTitle(tr("Create Project"));
  114. m_header->setSubTitle(tr("Configure project with Gems"));
  115. m_nextButton->setText(tr("Create Project"));
  116. }
  117. else
  118. {
  119. m_header->setTitle(tr("Create Project"));
  120. m_header->setSubTitle(tr("Enter Project Details"));
  121. m_nextButton->setText(tr("Next"));
  122. }
  123. }
  124. } // namespace O3DE::ProjectManager