[LYN-2522] Preparation work for the filter pane (#799)

* [LYN-2522] Preparation work for the filter pane

* Added arrow up/down icons.
* Extended the gem info with the type (Asset, Code, Tool).
* Extended the model with the type and a helper for converting gem uuids into display names.
* Extended the link widget to be clickable with a custom action, needed for the "Show all/less" for the filters.
* Converting the uuids we get from Python to AZ::Uuids and then back to strings to have them all in the same format.
main
Benjamin Jillich 5 years ago committed by GitHub
parent 525840fb2a
commit 03b41b620d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.1359 15.3956L19.6728 7.8125L21.087 9.22671L12 18.5245L12 18.5245L2.86273 9.27696L4.27695 7.86275L12.1359 15.3956Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 286 B

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2732 10.1288L19.8101 17.7119L21.2243 16.2977L12.1373 6.99994L12.1373 6.99995L3 16.2475L4.41421 17.6617L12.2732 10.1288Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 292 B

@ -58,13 +58,6 @@ namespace O3DE::ProjectManager
hLayout->addWidget(m_gemListView);
hLayout->addWidget(m_gemInspector);
// Select the first entry after everything got correctly sized
QTimer::singleShot(100, [=]{
QModelIndex firstModelIndex = m_gemListView->model()->index(0,0);
m_gemListView->selectionModel()->select(firstModelIndex, QItemSelectionModel::ClearAndSelect);
});
}
QVector<GemInfo> GemCatalogScreen::GenerateTestData()

@ -32,21 +32,36 @@ namespace O3DE::ProjectManager
{
switch (platform)
{
case O3DE::ProjectManager::GemInfo::Android:
case Android:
return "Android";
case O3DE::ProjectManager::GemInfo::iOS:
case iOS:
return "iOS";
case O3DE::ProjectManager::GemInfo::Linux:
case Linux:
return "Linux";
case O3DE::ProjectManager::GemInfo::macOS:
case macOS:
return "macOS";
case O3DE::ProjectManager::GemInfo::Windows:
case Windows:
return "Windows";
default:
return "<Unknown Platform>";
}
}
QString GemInfo::GetTypeString(Type type)
{
switch (type)
{
case Asset:
return "Asset";
case Code:
return "Code";
case Tool:
return "Tool";
default:
return "<Unknown Type>";
}
}
bool GemInfo::IsPlatformSupported(Platform platform) const
{
return (m_platforms & platform);

@ -36,6 +36,16 @@ namespace O3DE::ProjectManager
Q_DECLARE_FLAGS(Platforms, Platform)
static QString GetPlatformString(Platform platform);
enum Type
{
Asset = 1 << 0,
Code = 1 << 1,
Tool = 1 << 2,
NumTypes = 3
};
Q_DECLARE_FLAGS(Types, Type)
static QString GetTypeString(Type type);
GemInfo() = default;
GemInfo(const QString& name, const QString& creator, const QString& summary, Platforms platforms, bool isAdded);
bool IsPlatformSupported(Platform platform) const;
@ -50,6 +60,7 @@ namespace O3DE::ProjectManager
bool m_isAdded = false; //! Is the gem currently added and enabled in the project?
QString m_summary;
Platforms m_platforms;
Types m_types; //! Asset and/or Code and/or Tool
QStringList m_features;
QString m_directoryLink;
QString m_documentationLink;
@ -62,3 +73,4 @@ namespace O3DE::ProjectManager
} // namespace O3DE::ProjectManager
Q_DECLARE_OPERATORS_FOR_FLAGS(O3DE::ProjectManager::GemInfo::Platforms)
Q_DECLARE_OPERATORS_FOR_FLAGS(O3DE::ProjectManager::GemInfo::Types)

@ -10,7 +10,8 @@
*
*/
#include "GemModel.h"
#include <AzCore/std/string/string.h>
#include <GemCatalog/GemModel.h>
namespace O3DE::ProjectManager
{
@ -32,8 +33,11 @@ namespace O3DE::ProjectManager
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
item->setData(gemInfo.m_name, RoleName);
const QString uuidString = gemInfo.m_uuid.ToString<AZStd::string>().c_str();
item->setData(uuidString, RoleUuid);
item->setData(gemInfo.m_creator, RoleCreator);
item->setData(static_cast<int>(gemInfo.m_platforms), RolePlatforms);
item->setData(aznumeric_cast<int>(gemInfo.m_platforms), RolePlatforms);
item->setData(aznumeric_cast<int>(gemInfo.m_types), RoleTypes);
item->setData(gemInfo.m_summary, RoleSummary);
item->setData(gemInfo.m_isAdded, RoleIsAdded);
@ -48,6 +52,8 @@ namespace O3DE::ProjectManager
item->setData(gemInfo.m_features, RoleFeatures);
appendRow(item);
m_uuidToNameMap[uuidString] = gemInfo.m_displayName;
}
void GemModel::Clear()
@ -65,11 +71,21 @@ namespace O3DE::ProjectManager
return modelIndex.data(RoleCreator).toString();
}
QString GemModel::GetUuidString(const QModelIndex& modelIndex)
{
return modelIndex.data(RoleUuid).toString();
}
GemInfo::Platforms GemModel::GetPlatforms(const QModelIndex& modelIndex)
{
return static_cast<GemInfo::Platforms>(modelIndex.data(RolePlatforms).toInt());
}
GemInfo::Types GemModel::GetTypes(const QModelIndex& modelIndex)
{
return static_cast<GemInfo::Types>(modelIndex.data(RoleTypes).toInt());
}
QString GemModel::GetSummary(const QModelIndex& modelIndex)
{
return modelIndex.data(RoleSummary).toString();
@ -90,9 +106,35 @@ namespace O3DE::ProjectManager
return modelIndex.data(RoleDocLink).toString();
}
AZ::Outcome<QString> GemModel::FindGemNameByUuidString(const QString& uuidString) const
{
const auto iterator = m_uuidToNameMap.find(uuidString);
if (iterator != m_uuidToNameMap.end())
{
return AZ::Success(iterator.value());
}
return AZ::Failure();
}
QStringList GemModel::GetDependingGems(const QModelIndex& modelIndex)
{
return modelIndex.data(RoleDependingGems).toStringList();
QStringList result = modelIndex.data(RoleDependingGems).toStringList();
if (result.isEmpty())
{
return {};
}
for (QString& dependingGemString : result)
{
AZ::Outcome<QString> gemNameOutcome = FindGemNameByUuidString(dependingGemString);
if (gemNameOutcome.IsSuccess())
{
dependingGemString = gemNameOutcome.GetValue();
}
}
return result;
}
QStringList GemModel::GetConflictingGems(const QModelIndex& modelIndex)

@ -13,7 +13,8 @@
#pragma once
#if !defined(Q_MOC_RUN)
#include "GemInfo.h"
#include <AzCore/Outcome/Outcome.h>
#include <GemCatalog/GemInfo.h>
#include <QAbstractItemModel>
#include <QStandardItemModel>
#include <QItemSelectionModel>
@ -33,14 +34,18 @@ namespace O3DE::ProjectManager
void AddGem(const GemInfo& gemInfo);
void Clear();
AZ::Outcome<QString> FindGemNameByUuidString(const QString& uuidString) const;
QStringList GetDependingGems(const QModelIndex& modelIndex);
static QString GetName(const QModelIndex& modelIndex);
static QString GetCreator(const QModelIndex& modelIndex);
static QString GetUuidString(const QModelIndex& modelIndex);
static GemInfo::Platforms GetPlatforms(const QModelIndex& modelIndex);
static GemInfo::Types GetTypes(const QModelIndex& modelIndex);
static QString GetSummary(const QModelIndex& modelIndex);
static bool IsAdded(const QModelIndex& modelIndex);
static QString GetDirectoryLink(const QModelIndex& modelIndex);
static QString GetDocLink(const QModelIndex& modelIndex);
static QStringList GetDependingGems(const QModelIndex& modelIndex);
static QStringList GetConflictingGems(const QModelIndex& modelIndex);
static QString GetVersion(const QModelIndex& modelIndex);
static QString GetLastUpdated(const QModelIndex& modelIndex);
@ -51,6 +56,7 @@ namespace O3DE::ProjectManager
enum UserRole
{
RoleName = Qt::UserRole,
RoleUuid,
RoleCreator,
RolePlatforms,
RoleSummary,
@ -63,8 +69,10 @@ namespace O3DE::ProjectManager
RoleLastUpdated,
RoleBinarySize,
RoleFeatures,
RoleTypes
};
QHash<QString, QString> m_uuidToNameMap;
QItemSelectionModel* m_selectionModel = nullptr;
};
} // namespace O3DE::ProjectManager

@ -27,7 +27,12 @@ namespace O3DE::ProjectManager
void LinkLabel::mousePressEvent([[maybe_unused]] QMouseEvent* event)
{
QDesktopServices::openUrl(m_url);
if (m_url.isValid())
{
QDesktopServices::openUrl(m_url);
}
emit clicked();
}
void LinkLabel::enterEvent([[maybe_unused]] QEvent* event)

@ -26,10 +26,16 @@ namespace O3DE::ProjectManager
class LinkLabel
: public QLabel
{
Q_OBJECT // AUTOMOC
public:
LinkLabel(const QString& text, const QUrl& url = {}, QWidget* parent = nullptr);
LinkLabel(const QString& text = {}, const QUrl& url = {}, QWidget* parent = nullptr);
void SetUrl(const QUrl& url);
signals:
void clicked();
private:
void mousePressEvent(QMouseEvent* event) override;
void enterEvent(QEvent* event) override;

@ -426,7 +426,7 @@ namespace O3DE::ProjectManager
{
// required
gemInfo.m_name = Py_To_String(data["Name"]);
gemInfo.m_uuid = AZ::Uuid(Py_To_String(data["Uuid"]));
gemInfo.m_uuid = AZ::Uuid(Py_To_String(data["Uuid"]));
// optional
gemInfo.m_displayName = Py_To_String_Optional(data, "DisplayName", gemInfo.m_name);
@ -437,7 +437,8 @@ namespace O3DE::ProjectManager
{
for (auto dependency : data["Dependencies"])
{
gemInfo.m_dependingGemUuids.push_back(Py_To_String(dependency["Uuid"]));
const AZ::Uuid uuid = Py_To_String(dependency["Uuid"]);
gemInfo.m_dependingGemUuids.push_back(uuid.ToString<AZStd::string>().c_str());
}
}
if (data.contains("Tags"))

@ -9,6 +9,8 @@
<file>Resources/iOS.svg</file>
<file>Resources/Linux.svg</file>
<file>Resources/macOS.svg</file>
<file>Resources/ArrowDownLine.svg</file>
<file>Resources/ArrowUpLine.svg</file>
<file>Resources/Backgrounds/FirstTimeBackgroundImage.jpg</file>
</qresource>
</RCC>

Loading…
Cancel
Save