diff --git a/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp
index 1aad4a7206..6b19e839d7 100644
--- a/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp
+++ b/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp
@@ -55,11 +55,7 @@ namespace O3DE::ProjectManager
vLayout->addWidget(m_stack);
connect(m_gemCatalogScreen, &ScreenWidget::ChangeScreenRequest, this, &CreateProjectCtrl::OnChangeScreenRequest);
- connect(m_gemRepoScreen, &GemRepoScreen::OnRefresh, [this]()
- {
- const QString projectTemplatePath = m_newProjectSettingsScreen->GetProjectTemplatePath();
- m_gemCatalogScreen->Refresh(projectTemplatePath + "/Template");
- });
+ connect(m_gemRepoScreen, &GemRepoScreen::OnRefresh, m_gemCatalogScreen, &GemCatalogScreen::Refresh);
// When there are multiple project templates present, we re-gather the gems when changing the selected the project template.
connect(m_newProjectSettingsScreen, &NewProjectSettingsScreen::OnTemplateSelectionChanged, this, [=](int oldIndex, [[maybe_unused]] int newIndex)
@@ -257,6 +253,12 @@ namespace O3DE::ProjectManager
{
if (m_newProjectSettingsScreen->Validate())
{
+ if (!m_gemCatalogScreen->GetDownloadController()->IsDownloadQueueEmpty())
+ {
+ QMessageBox::critical(this, tr("Gems downloading"), tr("You must wait for gems to finish downloading before continuing."));
+ return;
+ }
+
ProjectInfo projectInfo = m_newProjectSettingsScreen->GetProjectInfo();
QString projectTemplatePath = m_newProjectSettingsScreen->GetProjectTemplatePath();
diff --git a/Code/Tools/ProjectManager/Source/DownloadController.cpp b/Code/Tools/ProjectManager/Source/DownloadController.cpp
index 224b90299c..a8eecffd78 100644
--- a/Code/Tools/ProjectManager/Source/DownloadController.cpp
+++ b/Code/Tools/ProjectManager/Source/DownloadController.cpp
@@ -82,8 +82,9 @@ namespace O3DE::ProjectManager
succeeded = false;
}
+ const QString gemName = m_gemNames[0];
m_gemNames.erase(m_gemNames.begin());
- emit Done(succeeded);
+ emit Done(succeeded, gemName);
if (!m_gemNames.empty())
{
diff --git a/Code/Tools/ProjectManager/Source/DownloadController.h b/Code/Tools/ProjectManager/Source/DownloadController.h
index 11ceaacddb..8afe8ef029 100644
--- a/Code/Tools/ProjectManager/Source/DownloadController.h
+++ b/Code/Tools/ProjectManager/Source/DownloadController.h
@@ -58,7 +58,7 @@ namespace O3DE::ProjectManager
signals:
void StartGemDownload(const QString& gemName);
- void Done(bool success = true);
+ void Done(bool success, const QString& gemName);
void GemDownloadProgress(int percentage);
private:
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
index 5d65c740af..0db2b088c1 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
@@ -145,7 +145,7 @@ namespace O3DE::ProjectManager
}
else
{
- tagContainer->Update(ConvertFromModelIndices(tagIndices));
+ tagContainer->Update(GetTagsFromModelIndices(tagIndices));
label->setText(QString("%1 %2").arg(tagIndices.size()).arg(tagIndices.size() == 1 ? singularTitle : pluralTitle));
widget->show();
}
@@ -234,17 +234,23 @@ namespace O3DE::ProjectManager
for (int downloadingGemNumber = 0; downloadingGemNumber < downloadQueue.size(); ++downloadingGemNumber)
{
QHBoxLayout* nameProgressLayout = new QHBoxLayout();
- TagWidget* newTag = new TagWidget(downloadQueue[downloadingGemNumber]);
+
+ const QString& gemName = downloadQueue[downloadingGemNumber];
+ TagWidget* newTag = new TagWidget({gemName, gemName});
nameProgressLayout->addWidget(newTag);
+
QLabel* progress = new QLabel(downloadingGemNumber == 0? QString("%1%").arg(downloadProgress) : tr("Queued"));
nameProgressLayout->addWidget(progress);
+
QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
nameProgressLayout->addSpacerItem(spacer);
- QLabel* cancelText = new QLabel(QString("Cancel").arg(downloadQueue[downloadingGemNumber]));
+
+ QLabel* cancelText = new QLabel(QString("Cancel"));
cancelText->setTextInteractionFlags(Qt::LinksAccessibleByMouse);
connect(cancelText, &QLabel::linkActivated, this, &CartOverlayWidget::OnCancelDownloadActivated);
nameProgressLayout->addWidget(cancelText);
downloadingItemLayout->addLayout(nameProgressLayout);
+
QProgressBar* downloadProgessBar = new QProgressBar();
downloadingItemLayout->addWidget(downloadProgessBar);
downloadProgessBar->setValue(downloadingGemNumber == 0 ? downloadProgress : 0);
@@ -255,7 +261,7 @@ namespace O3DE::ProjectManager
}
};
- auto downloadEnded = [=](bool /*success*/)
+ auto downloadEnded = [=](bool /*success*/, const QString& /*gemName*/)
{
update(0); // update the list to remove the gem that has finished
};
@@ -265,15 +271,15 @@ namespace O3DE::ProjectManager
update(0);
}
- QStringList CartOverlayWidget::ConvertFromModelIndices(const QVector& gems) const
+ QVector CartOverlayWidget::GetTagsFromModelIndices(const QVector& gems) const
{
- QStringList gemNames;
- gemNames.reserve(gems.size());
+ QVector tags;
+ tags.reserve(gems.size());
for (const QModelIndex& modelIndex : gems)
{
- gemNames.push_back(GemModel::GetDisplayName(modelIndex));
+ tags.push_back({ GemModel::GetDisplayName(modelIndex), GemModel::GetName(modelIndex) });
}
- return gemNames;
+ return tags;
}
CartButton::CartButton(GemModel* gemModel, DownloadController* downloadController, QWidget* parent)
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
index 4d17259840..6da78cce7a 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
@@ -36,7 +36,7 @@ namespace O3DE::ProjectManager
CartOverlayWidget(GemModel* gemModel, DownloadController* downloadController, QWidget* parent = nullptr);
private:
- QStringList ConvertFromModelIndices(const QVector& gems) const;
+ QVector GetTagsFromModelIndices(const QVector& gems) const;
using GetTagIndicesCallback = AZStd::function()>;
void CreateGemSection(const QString& singularTitle, const QString& pluralTitle, GetTagIndicesCallback getTagIndices);
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
index 4574e8509b..b0e4fa73e1 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
@@ -49,6 +49,7 @@ namespace O3DE::ProjectManager
connect(m_gemModel, &GemModel::gemStatusChanged, this, &GemCatalogScreen::OnGemStatusChanged);
connect(m_headerWidget, &GemCatalogHeaderWidget::OpenGemsRepo, this, &GemCatalogScreen::HandleOpenGemRepo);
connect(m_headerWidget, &GemCatalogHeaderWidget::AddGem, this, &GemCatalogScreen::OnAddGemClicked);
+ connect(m_downloadController, &DownloadController::Done, this, &GemCatalogScreen::OnGemDownloadResult);
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->setMargin(0);
@@ -58,7 +59,7 @@ namespace O3DE::ProjectManager
m_gemInspector = new GemInspector(m_gemModel, this);
m_gemInspector->setFixedWidth(240);
- connect(m_gemInspector, &GemInspector::TagClicked, this, &GemCatalogScreen::SelectGem);
+ connect(m_gemInspector, &GemInspector::TagClicked, [=](const Tag& tag) { SelectGem(tag.id); });
QWidget* filterWidget = new QWidget(this);
filterWidget->setFixedWidth(240);
@@ -86,6 +87,7 @@ namespace O3DE::ProjectManager
void GemCatalogScreen::ReinitForProject(const QString& projectPath)
{
+ m_projectPath = projectPath;
m_gemModel->Clear();
m_gemsToRegisterWithProject.clear();
FillModel(projectPath);
@@ -155,15 +157,15 @@ namespace O3DE::ProjectManager
}
}
- void GemCatalogScreen::Refresh(const QString& projectPath)
+ void GemCatalogScreen::Refresh()
{
QHash gemInfoHash;
// create a hash with the gem name as key
- AZ::Outcome, AZStd::string> allGemInfosResult = PythonBindingsInterface::Get()->GetAllGemInfos(projectPath);
+ const AZ::Outcome, AZStd::string>& allGemInfosResult = PythonBindingsInterface::Get()->GetAllGemInfos(m_projectPath);
if (allGemInfosResult.IsSuccess())
{
- QVector gemInfos = allGemInfosResult.GetValue();
+ const QVector& gemInfos = allGemInfosResult.GetValue();
for (const GemInfo& gemInfo : gemInfos)
{
gemInfoHash.insert(gemInfo.m_name, gemInfo);
@@ -171,10 +173,10 @@ namespace O3DE::ProjectManager
}
// add all the gem repos into the hash
- AZ::Outcome, AZStd::string> allRepoGemInfosResult = PythonBindingsInterface::Get()->GetAllGemRepoGemsInfos();
+ const AZ::Outcome, AZStd::string>& allRepoGemInfosResult = PythonBindingsInterface::Get()->GetAllGemRepoGemsInfos();
if (allRepoGemInfosResult.IsSuccess())
{
- const QVector allRepoGemInfos = allRepoGemInfosResult.GetValue();
+ const QVector& allRepoGemInfos = allRepoGemInfosResult.GetValue();
for (const GemInfo& gemInfo : allRepoGemInfos)
{
if (!gemInfoHash.contains(gemInfo.m_name))
@@ -310,20 +312,22 @@ namespace O3DE::ProjectManager
void GemCatalogScreen::FillModel(const QString& projectPath)
{
- AZ::Outcome, AZStd::string> allGemInfosResult = PythonBindingsInterface::Get()->GetAllGemInfos(projectPath);
+ m_projectPath = projectPath;
+
+ const AZ::Outcome, AZStd::string>& allGemInfosResult = PythonBindingsInterface::Get()->GetAllGemInfos(projectPath);
if (allGemInfosResult.IsSuccess())
{
// Add all available gems to the model.
- const QVector allGemInfos = allGemInfosResult.GetValue();
+ const QVector& allGemInfos = allGemInfosResult.GetValue();
for (const GemInfo& gemInfo : allGemInfos)
{
m_gemModel->AddGem(gemInfo);
}
- AZ::Outcome, AZStd::string> allRepoGemInfosResult = PythonBindingsInterface::Get()->GetAllGemRepoGemsInfos();
+ const AZ::Outcome, AZStd::string>& allRepoGemInfosResult = PythonBindingsInterface::Get()->GetAllGemRepoGemsInfos();
if (allRepoGemInfosResult.IsSuccess())
{
- const QVector allRepoGemInfos = allRepoGemInfosResult.GetValue();
+ const QVector& allRepoGemInfos = allRepoGemInfosResult.GetValue();
for (const GemInfo& gemInfo : allRepoGemInfos)
{
// do not add gems that have already been downloaded
@@ -342,10 +346,10 @@ namespace O3DE::ProjectManager
m_notificationsEnabled = false;
// Gather enabled gems for the given project.
- auto enabledGemNamesResult = PythonBindingsInterface::Get()->GetEnabledGemNames(projectPath);
+ const auto& enabledGemNamesResult = PythonBindingsInterface::Get()->GetEnabledGemNames(projectPath);
if (enabledGemNamesResult.IsSuccess())
{
- const QVector enabledGemNames = enabledGemNamesResult.GetValue();
+ const QVector& enabledGemNames = enabledGemNamesResult.GetValue();
for (const AZStd::string& enabledGemName : enabledGemNames)
{
const QModelIndex modelIndex = m_gemModel->FindIndexByNameString(enabledGemName.c_str());
@@ -405,12 +409,24 @@ namespace O3DE::ProjectManager
for (const QModelIndex& modelIndex : toBeAdded)
{
- const QString gemPath = GemModel::GetPath(modelIndex);
+ const QString& gemPath = GemModel::GetPath(modelIndex);
+
+ // make sure any remote gems we added were downloaded successfully
+ if (GemModel::GetGemOrigin(modelIndex) == GemInfo::Remote && GemModel::GetDownloadStatus(modelIndex) != GemInfo::Downloaded)
+ {
+ QMessageBox::critical(
+ nullptr, "Cannot add gem that isn't downloaded",
+ tr("Cannot add gem %1 to project because it isn't downloaded yet or failed to download.")
+ .arg(GemModel::GetDisplayName(modelIndex)));
+
+ return EnableDisableGemsResult::Failed;
+ }
+
const AZ::Outcome result = pythonBindings->AddGemToProject(gemPath, projectPath);
if (!result.IsSuccess())
{
- QMessageBox::critical(nullptr, "Operation failed",
- QString("Cannot add gem %1 to project.\n\nError:\n%2").arg(GemModel::GetDisplayName(modelIndex), result.GetError().c_str()));
+ QMessageBox::critical(nullptr, "Failed to add gem to project",
+ tr("Cannot add gem %1 to project.
Error:
%2").arg(GemModel::GetDisplayName(modelIndex), result.GetError().c_str()));
return EnableDisableGemsResult::Failed;
}
@@ -428,8 +444,8 @@ namespace O3DE::ProjectManager
const AZ::Outcome result = pythonBindings->RemoveGemFromProject(gemPath, projectPath);
if (!result.IsSuccess())
{
- QMessageBox::critical(nullptr, "Operation failed",
- QString("Cannot remove gem %1 from project.\n\nError:\n%2").arg(GemModel::GetDisplayName(modelIndex), result.GetError().c_str()));
+ QMessageBox::critical(nullptr, "Failed to remove gem from project",
+ tr("Cannot remove gem %1 from project.
Error:
%2").arg(GemModel::GetDisplayName(modelIndex), result.GetError().c_str()));
return EnableDisableGemsResult::Failed;
}
@@ -443,6 +459,34 @@ namespace O3DE::ProjectManager
emit ChangeScreenRequest(ProjectManagerScreen::GemRepos);
}
+ void GemCatalogScreen::OnGemDownloadResult(bool succeeded, const QString& gemName)
+ {
+ if (succeeded)
+ {
+ // refresh the information for downloaded gems
+ const AZ::Outcome, AZStd::string>& allGemInfosResult = PythonBindingsInterface::Get()->GetAllGemInfos(m_projectPath);
+ if (allGemInfosResult.IsSuccess())
+ {
+ // we should find the gem name now in all gem infos
+ for (const GemInfo& gemInfo : allGemInfosResult.GetValue())
+ {
+ if (gemInfo.m_name == gemName)
+ {
+ QModelIndex index = m_gemModel->FindIndexByNameString(gemName);
+ if (index.isValid())
+ {
+ m_gemModel->setData(index, GemInfo::Downloaded, GemModel::RoleDownloadStatus);
+ m_gemModel->setData(index, gemInfo.m_path, GemModel::RolePath);
+ m_gemModel->setData(index, gemInfo.m_path, GemModel::RoleDirectoryLink);
+ }
+
+ return;
+ }
+ }
+ }
+ }
+ }
+
ProjectManagerScreen GemCatalogScreen::GetScreenEnum()
{
return ProjectManagerScreen::GemCatalog;
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
index 69ec85586d..6acf43b3eb 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
@@ -33,7 +33,6 @@ namespace O3DE::ProjectManager
ProjectManagerScreen GetScreenEnum() override;
void ReinitForProject(const QString& projectPath);
- void Refresh(const QString& projectPath);
enum class EnableDisableGemsResult
{
@@ -50,6 +49,8 @@ namespace O3DE::ProjectManager
void OnGemStatusChanged(const QString& gemName, uint32_t numChangedDependencies);
void OnAddGemClicked();
void SelectGem(const QString& gemName);
+ void OnGemDownloadResult(bool succeeded, const QString& gemName);
+ void Refresh();
protected:
void hideEvent(QHideEvent* event) override;
@@ -76,5 +77,6 @@ namespace O3DE::ProjectManager
DownloadController* m_downloadController = nullptr;
bool m_notificationsEnabled = true;
QSet m_gemsToRegisterWithProject;
+ QString m_projectPath = nullptr;
};
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp
index b0b8cca29a..afbac189ad 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp
@@ -106,10 +106,10 @@ namespace O3DE::ProjectManager
}
// Depending gems
- QStringList dependingGems = m_model->GetDependingGemNames(modelIndex);
- if (!dependingGems.isEmpty())
+ const QVector& dependingGemTags = m_model->GetDependingGemTags(modelIndex);
+ if (!dependingGemTags.isEmpty())
{
- m_dependingGems->Update(tr("Depending Gems"), tr("The following Gems will be automatically enabled with this Gem."), dependingGems);
+ m_dependingGems->Update(tr("Depending Gems"), tr("The following Gems will be automatically enabled with this Gem."), dependingGemTags);
m_dependingGems->show();
}
else
@@ -222,7 +222,7 @@ namespace O3DE::ProjectManager
// Depending gems
m_dependingGems = new GemsSubWidget();
- connect(m_dependingGems, &GemsSubWidget::TagClicked, this, [=](const QString& tag){ emit TagClicked(tag); });
+ connect(m_dependingGems, &GemsSubWidget::TagClicked, this, [=](const Tag& tag){ emit TagClicked(tag); });
m_mainLayout->addWidget(m_dependingGems);
m_mainLayout->addSpacing(20);
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h
index c6548527ab..9a6ad84dea 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h
@@ -44,7 +44,7 @@ namespace O3DE::ProjectManager
inline constexpr static const char* s_textColor = "#DDDDDD";
signals:
- void TagClicked(const QString& tag);
+ void TagClicked(const Tag& tag);
private slots:
void OnSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
index 7c217db65b..88c54de0b3 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
@@ -65,7 +65,6 @@ namespace O3DE::ProjectManager
appendRow(item);
const QModelIndex modelIndex = index(rowCount()-1, 0);
- m_nameToIndexMap[gemInfo.m_displayName] = modelIndex;
m_nameToIndexMap[gemInfo.m_name] = modelIndex;
}
@@ -178,18 +177,6 @@ namespace O3DE::ProjectManager
return {};
}
- void GemModel::FindGemDisplayNamesByNameStrings(QStringList& inOutGemNames)
- {
- for (QString& name : inOutGemNames)
- {
- QModelIndex modelIndex = FindIndexByNameString(name);
- if (modelIndex.isValid())
- {
- name = GetDisplayName(modelIndex);
- }
- }
- }
-
QStringList GemModel::GetDependingGems(const QModelIndex& modelIndex)
{
return modelIndex.data(RoleDependingGems).toStringList();
@@ -209,16 +196,23 @@ namespace O3DE::ProjectManager
}
}
- QStringList GemModel::GetDependingGemNames(const QModelIndex& modelIndex)
+ QVector GemModel::GetDependingGemTags(const QModelIndex& modelIndex)
{
- QStringList result = GetDependingGems(modelIndex);
- if (result.isEmpty())
+ QVector tags;
+
+ QStringList dependingGemNames = GetDependingGems(modelIndex);
+ tags.reserve(dependingGemNames.size());
+
+ for (QString& gemName : dependingGemNames)
{
- return {};
+ const QModelIndex& dependingIndex = FindIndexByNameString(gemName);
+ if (dependingIndex.isValid())
+ {
+ tags.push_back({ GetDisplayName(dependingIndex), GetName(dependingIndex) });
+ }
}
- FindGemDisplayNamesByNameStrings(result);
- return result;
+ return tags;
}
QString GemModel::GetVersion(const QModelIndex& modelIndex)
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
index e548d9d3f7..e25a1c7703 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
@@ -10,6 +10,7 @@
#if !defined(Q_MOC_RUN)
#include
+#include
#include
#include
#include
@@ -58,7 +59,7 @@ namespace O3DE::ProjectManager
void UpdateGemDependencies();
QModelIndex FindIndexByNameString(const QString& nameString) const;
- QStringList GetDependingGemNames(const QModelIndex& modelIndex);
+ QVector GetDependingGemTags(const QModelIndex& modelIndex);
bool HasDependentGems(const QModelIndex& modelIndex) const;
static QString GetName(const QModelIndex& modelIndex);
@@ -113,7 +114,6 @@ namespace O3DE::ProjectManager
void OnRowsAboutToBeRemoved(const QModelIndex& parent, int first, int last);
private:
- void FindGemDisplayNamesByNameStrings(QStringList& inOutGemNames);
void GetAllDependingGems(const QModelIndex& modelIndex, QSet& inOutGems);
QStringList GetDependingGems(const QModelIndex& modelIndex);
diff --git a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoInspector.cpp b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoInspector.cpp
index 6655aef86d..f816e86733 100644
--- a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoInspector.cpp
+++ b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoInspector.cpp
@@ -86,7 +86,7 @@ namespace O3DE::ProjectManager
}
// Included Gems
- m_includedGems->Update(tr("Included Gems"), "", m_model->GetIncludedGemNames(modelIndex));
+ m_includedGems->Update(tr("Included Gems"), "", m_model->GetIncludedGemTags(modelIndex));
m_mainWidget->adjustSize();
m_mainWidget->show();
diff --git a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.cpp b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.cpp
index 7a9617e6c1..6189b6d8bf 100644
--- a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.cpp
+++ b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.cpp
@@ -103,17 +103,17 @@ namespace O3DE::ProjectManager
return modelIndex.data(RoleIncludedGems).toStringList();
}
- QStringList GemRepoModel::GetIncludedGemNames(const QModelIndex& modelIndex)
+ QVector GemRepoModel::GetIncludedGemTags(const QModelIndex& modelIndex)
{
- QStringList gemNames;
- QVector gemInfos = GetIncludedGemInfos(modelIndex);
-
+ QVector tags;
+ const QVector& gemInfos = GetIncludedGemInfos(modelIndex);
+ tags.reserve(gemInfos.size());
for (const GemInfo& gemInfo : gemInfos)
{
- gemNames.append(gemInfo.m_displayName);
+ tags.append({ gemInfo.m_displayName, gemInfo.m_name });
}
- return gemNames;
+ return tags;
}
QVector GemRepoModel::GetIncludedGemInfos(const QModelIndex& modelIndex)
diff --git a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.h b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.h
index f36b66ca48..66fe972a95 100644
--- a/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.h
+++ b/Code/Tools/ProjectManager/Source/GemRepo/GemRepoModel.h
@@ -40,7 +40,7 @@ namespace O3DE::ProjectManager
static QString GetPath(const QModelIndex& modelIndex);
static QStringList GetIncludedGemPaths(const QModelIndex& modelIndex);
- static QStringList GetIncludedGemNames(const QModelIndex& modelIndex);
+ static QVector GetIncludedGemTags(const QModelIndex& modelIndex);
static QVector GetIncludedGemInfos(const QModelIndex& modelIndex);
static bool IsEnabled(const QModelIndex& modelIndex);
diff --git a/Code/Tools/ProjectManager/Source/GemsSubWidget.cpp b/Code/Tools/ProjectManager/Source/GemsSubWidget.cpp
index 8b7b183008..2572a39db3 100644
--- a/Code/Tools/ProjectManager/Source/GemsSubWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/GemsSubWidget.cpp
@@ -33,14 +33,14 @@ namespace O3DE::ProjectManager
m_layout->addWidget(m_textLabel);
m_tagWidget = new TagContainerWidget();
- connect(m_tagWidget, &TagContainerWidget::TagClicked, this, [=](const QString& tag){ emit TagClicked(tag); });
+ connect(m_tagWidget, &TagContainerWidget::TagClicked, this, [=](const Tag& tag){ emit TagClicked(tag); });
m_layout->addWidget(m_tagWidget);
}
- void GemsSubWidget::Update(const QString& title, const QString& text, const QStringList& gemNames)
+ void GemsSubWidget::Update(const QString& title, const QString& text, const QVector& tags)
{
m_titleLabel->setText(title);
m_textLabel->setText(text);
- m_tagWidget->Update(gemNames);
+ m_tagWidget->Update(tags);
}
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemsSubWidget.h b/Code/Tools/ProjectManager/Source/GemsSubWidget.h
index a9fabf5e92..5e670b930a 100644
--- a/Code/Tools/ProjectManager/Source/GemsSubWidget.h
+++ b/Code/Tools/ProjectManager/Source/GemsSubWidget.h
@@ -26,10 +26,10 @@ namespace O3DE::ProjectManager
public:
GemsSubWidget(QWidget* parent = nullptr);
- void Update(const QString& title, const QString& text, const QStringList& gemNames);
+ void Update(const QString& title, const QString& text, const QVector& tags);
signals:
- void TagClicked(const QString& tag);
+ void TagClicked(const Tag& tag);
private:
QLabel* m_titleLabel = nullptr;
diff --git a/Code/Tools/ProjectManager/Source/TagWidget.cpp b/Code/Tools/ProjectManager/Source/TagWidget.cpp
index 39231ace4b..007f0839d1 100644
--- a/Code/Tools/ProjectManager/Source/TagWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/TagWidget.cpp
@@ -12,15 +12,16 @@
namespace O3DE::ProjectManager
{
- TagWidget::TagWidget(const QString& text, QWidget* parent)
- : QLabel(text, parent)
+ TagWidget::TagWidget(const Tag& tag, QWidget* parent)
+ : QLabel(tag.text, parent)
+ , m_tag(tag)
{
setObjectName("TagWidget");
}
void TagWidget::mousePressEvent([[maybe_unused]] QMouseEvent* event)
{
- emit(TagClicked(text()));
+ emit TagClicked(m_tag);
}
TagContainerWidget::TagContainerWidget(QWidget* parent)
@@ -39,20 +40,34 @@ namespace O3DE::ProjectManager
void TagContainerWidget::Update(const QStringList& tags)
{
- FlowLayout* flowLayout = static_cast(layout());
+ Clear();
- // remove old tags
+ foreach (const QString& tag, tags)
+ {
+ TagWidget* tagWidget = new TagWidget({tag, tag});
+ connect(tagWidget, &TagWidget::TagClicked, this, [=](const Tag& clickedTag){ emit TagClicked(clickedTag); });
+ layout()->addWidget(tagWidget);
+ }
+ }
+
+ void TagContainerWidget::Update(const QVector& tags)
+ {
+ Clear();
+
+ foreach (const Tag& tag, tags)
+ {
+ TagWidget* tagWidget = new TagWidget(tag);
+ connect(tagWidget, &TagWidget::TagClicked, this, [=](const Tag& clickedTag){ emit TagClicked(clickedTag); });
+ layout()->addWidget(tagWidget);
+ }
+ }
+
+ void TagContainerWidget::Clear()
+ {
QLayoutItem* layoutItem = nullptr;
while ((layoutItem = layout()->takeAt(0)) != nullptr)
{
layoutItem->widget()->deleteLater();
}
-
- foreach (const QString& tag, tags)
- {
- TagWidget* tagWidget = new TagWidget(tag);
- connect(tagWidget, &TagWidget::TagClicked, this, [=](const QString& tag){ emit TagClicked(tag); });
- flowLayout->addWidget(tagWidget);
- }
}
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/TagWidget.h b/Code/Tools/ProjectManager/Source/TagWidget.h
index 7b4a5b1aaa..fce6eaf863 100644
--- a/Code/Tools/ProjectManager/Source/TagWidget.h
+++ b/Code/Tools/ProjectManager/Source/TagWidget.h
@@ -10,12 +10,19 @@
#if !defined(Q_MOC_RUN)
#include
-#include
#include
+#include
+#include
#endif
namespace O3DE::ProjectManager
{
+ struct Tag
+ {
+ QString text;
+ QString id;
+ };
+
// Single tag
class TagWidget
: public QLabel
@@ -23,14 +30,17 @@ namespace O3DE::ProjectManager
Q_OBJECT // AUTOMOC
public:
- explicit TagWidget(const QString& text, QWidget* parent = nullptr);
+ explicit TagWidget(const Tag& id, QWidget* parent = nullptr);
~TagWidget() = default;
signals:
- void TagClicked(const QString& tag);
+ void TagClicked(const Tag& tag);
protected:
void mousePressEvent(QMouseEvent* event) override;
+
+ private:
+ Tag m_tag;
};
// Widget containing multiple tags, automatically wrapping based on the size
@@ -43,9 +53,13 @@ namespace O3DE::ProjectManager
explicit TagContainerWidget(QWidget* parent = nullptr);
~TagContainerWidget() = default;
+ void Update(const QVector& tags);
void Update(const QStringList& tags);
signals:
- void TagClicked(const QString& tag);
+ void TagClicked(const Tag& tag);
+
+ private:
+ void Clear();
};
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp
index e76b4093a9..fb16484961 100644
--- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp
+++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp
@@ -43,7 +43,7 @@ namespace O3DE::ProjectManager
m_gemRepoScreen = new GemRepoScreen(this);
connect(m_gemCatalogScreen, &ScreenWidget::ChangeScreenRequest, this, &UpdateProjectCtrl::OnChangeScreenRequest);
- connect(m_gemRepoScreen, &GemRepoScreen::OnRefresh, [this](){ m_gemCatalogScreen->Refresh(m_projectInfo.m_path); });
+ connect(m_gemRepoScreen, &GemRepoScreen::OnRefresh, m_gemCatalogScreen, &GemCatalogScreen::Refresh);
m_stack = new QStackedWidget(this);
m_stack->setObjectName("body");
@@ -163,6 +163,7 @@ namespace O3DE::ProjectManager
QMessageBox::critical(this, tr("Gems downloading"), tr("You must wait for gems to finish downloading before continuing."));
return;
}
+
// Enable or disable the gems that got adjusted in the gem catalog and apply them to the given project.
const GemCatalogScreen::EnableDisableGemsResult result = m_gemCatalogScreen->EnableDisableGemsForProject(m_projectInfo.m_path);
if (result == GemCatalogScreen::EnableDisableGemsResult::Failed)
diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h
index 5fef296ee7..ee6fc792f2 100644
--- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h
+++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h
@@ -26,6 +26,7 @@ namespace O3DE::ProjectManager
class UpdateProjectCtrl : public ScreenWidget
{
+ Q_OBJECT
public:
explicit UpdateProjectCtrl(QWidget* parent = nullptr);
~UpdateProjectCtrl() = default;