From 8a079da914ceadb07846d66230dd031a3b8cccc6 Mon Sep 17 00:00:00 2001
From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com>
Date: Sat, 5 Jun 2021 00:04:26 +0200
Subject: [PATCH] GemCatalog: Gem cart widget and overlay window
* [LYN-4174] Added icons for gem catalog summary cart
* [LYN-4174] Gem Catalog: Text eliding for too long gem names and creators
* [LYN-4174] Gem catalog: Resetting filters when re-initializing for another project
* [LYN-4174] Gem Catalog: Fixed a bug with filters being applied/remembered after leaving gem catalog and coming back editing another project
* [LYN-4174] GemCatalog: Gem cart widget and overlay window
* Added cart button with dynamic label to display the number of gems to be enabled/disabled and a arrow down button to indicate some sort of pop-up/overlay window will appear on click.
* Overlay gem tags update dynamically while the dialog is open based on the gem model.
* Moved some styling from C++ to the style sheet.
---
.../Resources/CarrotArrowDown.svg | 3 +
.../Resources/ProjectManager.qrc | 3 +
.../Resources/ProjectManager.qss | 40 ++-
.../ProjectManager/Resources/Summary.svg | 3 +
.../ProjectManager/Resources/WindowClose.svg | 4 +
.../GemCatalog/GemCatalogHeaderWidget.cpp | 235 +++++++++++++++++-
.../GemCatalog/GemCatalogHeaderWidget.h | 64 ++++-
.../Source/GemCatalog/GemCatalogScreen.cpp | 8 +-
.../Source/GemCatalog/GemCatalogScreen.h | 2 +
.../Source/GemCatalog/GemItemDelegate.cpp | 8 +-
.../GemCatalog/GemSortFilterProxyModel.cpp | 11 +
.../GemCatalog/GemSortFilterProxyModel.h | 1 +
12 files changed, 350 insertions(+), 32 deletions(-)
create mode 100644 Code/Tools/ProjectManager/Resources/CarrotArrowDown.svg
create mode 100644 Code/Tools/ProjectManager/Resources/Summary.svg
create mode 100644 Code/Tools/ProjectManager/Resources/WindowClose.svg
diff --git a/Code/Tools/ProjectManager/Resources/CarrotArrowDown.svg b/Code/Tools/ProjectManager/Resources/CarrotArrowDown.svg
new file mode 100644
index 0000000000..73545968d5
--- /dev/null
+++ b/Code/Tools/ProjectManager/Resources/CarrotArrowDown.svg
@@ -0,0 +1,3 @@
+
diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
index 04d5e98a10..62b7d23e9c 100644
--- a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
+++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
@@ -26,5 +26,8 @@
Backgrounds/FirstTimeBackgroundImage.jpg
ArrowDownLine.svg
ArrowUpLine.svg
+ CarrotArrowDown.svg
+ Summary.svg
+ WindowClose.svg
diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qss b/Code/Tools/ProjectManager/Resources/ProjectManager.qss
index 224574f522..6fd4086c58 100644
--- a/Code/Tools/ProjectManager/Resources/ProjectManager.qss
+++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qss
@@ -115,7 +115,7 @@ QTabBar::tab:pressed
/************** General (Modal windows) **************/
#header {
- background-color:#111111;
+ background-color:#111111;
min-height:80px;
max-height:80px;
}
@@ -172,8 +172,8 @@ QTabBar::tab:pressed
#footer > QPushButton {
qproperty-flat: true;
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #0095f2, stop: 1.0 #1e70eb);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #0095f2, stop: 1.0 #1e70eb);
border-radius: 3px;
min-height: 28px;
max-height: 28px;
@@ -181,26 +181,26 @@ QTabBar::tab:pressed
margin-right:30px;
}
#footer > QPushButton:hover {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #10A5f2, stop: 1.0 #2e80eb);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #10A5f2, stop: 1.0 #2e80eb);
}
#footer > QPushButton:pressed {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #0085e2, stop: 1.0 #0e60db);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #0085e2, stop: 1.0 #0e60db);
}
#footer > QPushButton[secondary="true"] {
margin-right: 10px;
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #888888, stop: 1.0 #555555);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #888888, stop: 1.0 #555555);
}
#footer > QPushButton[secondary="true"]:hover {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #999999, stop: 1.0 #666666);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #999999, stop: 1.0 #666666);
}
#footer > QPushButton[secondary="true"]:pressed {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #555555, stop: 1.0 #777777);
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #555555, stop: 1.0 #777777);
}
/************** Project Settings **************/
@@ -356,6 +356,20 @@ QTabBar::tab:pressed
font-size: 18px;
}
+#GemCatalogCart {
+ background-color: #555555;
+}
+
+#GemCatalogCartCountLabel {
+ font-size: 12px;
+ background-color: #4285F4;
+ border-radius: 3px;
+}
+
+#GemCatalogCartOverlaySectionLabel {
+ font-weight: 600;
+}
+
/************** Gem Catalog (Inspector) **************/
#GemCatalogInspector {
diff --git a/Code/Tools/ProjectManager/Resources/Summary.svg b/Code/Tools/ProjectManager/Resources/Summary.svg
new file mode 100644
index 0000000000..fe26718aff
--- /dev/null
+++ b/Code/Tools/ProjectManager/Resources/Summary.svg
@@ -0,0 +1,3 @@
+
diff --git a/Code/Tools/ProjectManager/Resources/WindowClose.svg b/Code/Tools/ProjectManager/Resources/WindowClose.svg
new file mode 100644
index 0000000000..0485ff95cd
--- /dev/null
+++ b/Code/Tools/ProjectManager/Resources/WindowClose.svg
@@ -0,0 +1,4 @@
+
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
index 6402121e4a..a98135d3e6 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
@@ -10,24 +10,229 @@
*
*/
-#include
#include
#include
+#include
#include
+#include
+#include
namespace O3DE::ProjectManager
{
- GemCatalogHeaderWidget::GemCatalogHeaderWidget(GemSortFilterProxyModel* filterProxyModel, QWidget* parent)
+ CartOverlayWidget::CartOverlayWidget(GemModel* gemModel, QWidget* parent)
+ : QWidget(parent)
+ , m_gemModel(gemModel)
+ {
+ setObjectName("GemCatalogCart");
+
+ m_layout = new QVBoxLayout();
+ m_layout->setSpacing(0);
+ m_layout->setMargin(0);
+ m_layout->setAlignment(Qt::AlignTop);
+ setLayout(m_layout);
+
+ QHBoxLayout* hLayout = new QHBoxLayout();
+
+ QPushButton* closeButton = new QPushButton();
+ closeButton->setFlat(true);
+ closeButton->setFocusPolicy(Qt::NoFocus);
+ closeButton->setIcon(QIcon(":/WindowClose.svg"));
+ connect(closeButton, &QPushButton::clicked, this, [=]
+ {
+ deleteLater();
+ });
+ hLayout->addSpacerItem(new QSpacerItem(10, 0, QSizePolicy::Expanding));
+ hLayout->addWidget(closeButton);
+ m_layout->addLayout(hLayout);
+
+ // enabled
+ {
+ m_enabledWidget = new QWidget();
+ m_enabledWidget->setFixedWidth(s_width);
+ m_layout->addWidget(m_enabledWidget);
+
+ QVBoxLayout* layout = new QVBoxLayout();
+ layout->setAlignment(Qt::AlignTop);
+ m_enabledWidget->setLayout(layout);
+
+ m_enabledLabel = new QLabel();
+ m_enabledLabel->setObjectName("GemCatalogCartOverlaySectionLabel");
+ layout->addWidget(m_enabledLabel);
+ m_enabledTagContainer = new TagContainerWidget();
+ layout->addWidget(m_enabledTagContainer);
+ }
+
+ // disabled
+ {
+ m_disabledWidget = new QWidget();
+ m_disabledWidget->setFixedWidth(s_width);
+ m_layout->addWidget(m_disabledWidget);
+
+ QVBoxLayout* layout = new QVBoxLayout();
+ layout->setAlignment(Qt::AlignTop);
+ m_disabledWidget->setLayout(layout);
+
+ m_disabledLabel = new QLabel();
+ m_disabledLabel->setObjectName("GemCatalogCartOverlaySectionLabel");
+ layout->addWidget(m_disabledLabel);
+ m_disabledTagContainer = new TagContainerWidget();
+ layout->addWidget(m_disabledTagContainer);
+ }
+
+ setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
+
+ Update();
+ connect(gemModel, &GemModel::dataChanged, this, [=]
+ {
+ Update();
+ });
+ }
+
+ void CartOverlayWidget::Update()
+ {
+ const QVector toBeAdded = m_gemModel->GatherGemsToBeAdded();
+ if (toBeAdded.isEmpty())
+ {
+ m_enabledWidget->hide();
+ }
+ else
+ {
+ m_enabledTagContainer->Update(ConvertFromModelIndices(toBeAdded));
+ m_enabledLabel->setText(QString("%1 %2").arg(QString::number(toBeAdded.size()), tr("Gems to be enabled")));
+ m_enabledWidget->show();
+ }
+
+ const QVector toBeRemoved = m_gemModel->GatherGemsToBeRemoved();
+ if (toBeRemoved.isEmpty())
+ {
+ m_disabledWidget->hide();
+ }
+ else
+ {
+ m_disabledTagContainer->Update(ConvertFromModelIndices(toBeRemoved));
+ m_disabledLabel->setText(QString("%1 %2").arg(QString::number(toBeRemoved.size()), tr("Gems to be disabled")));
+ m_disabledWidget->show();
+ }
+ }
+
+ QStringList CartOverlayWidget::ConvertFromModelIndices(const QVector& gems) const
+ {
+ QStringList gemNames;
+ gemNames.reserve(gems.size());
+ for (const QModelIndex& modelIndex : gems)
+ {
+ gemNames.push_back(GemModel::GetName(modelIndex));
+ }
+ return gemNames;
+ }
+
+ CartButton::CartButton(GemModel* gemModel, QWidget* parent)
+ : QWidget(parent)
+ , m_gemModel(gemModel)
+ {
+ m_layout = new QHBoxLayout();
+ m_layout->setMargin(0);
+ setLayout(m_layout);
+
+ QPushButton* iconButton = new QPushButton();
+ iconButton->setFlat(true);
+ iconButton->setFocusPolicy(Qt::NoFocus);
+ iconButton->setIcon(QIcon(":/Summary.svg"));
+ iconButton->setFixedSize(s_iconSize, s_iconSize);
+ connect(iconButton, &QPushButton::clicked, this, &CartButton::ShowOverlay);
+ m_layout->addWidget(iconButton);
+
+ m_countLabel = new QLabel();
+ m_countLabel->setObjectName("GemCatalogCartCountLabel");
+ m_countLabel->setFixedHeight(s_iconSize - 1); // Compensate for the empty icon space by using a slightly smaller label height.
+ m_layout->addWidget(m_countLabel);
+
+ m_dropDownButton = new QPushButton();
+ m_dropDownButton->setFlat(true);
+ m_dropDownButton->setFocusPolicy(Qt::NoFocus);
+ m_dropDownButton->setIcon(QIcon(":/CarrotArrowDown.svg"));
+ m_dropDownButton->setFixedSize(s_arrowDownIconSize, s_arrowDownIconSize);
+ connect(m_dropDownButton, &QPushButton::clicked, this, &CartButton::ShowOverlay);
+ m_layout->addWidget(m_dropDownButton);
+
+ // Adjust the label text whenever the model gets updated.
+ connect(gemModel, &GemModel::dataChanged, [=]
+ {
+ const QVector toBeAdded = m_gemModel->GatherGemsToBeAdded();
+ const QVector toBeRemoved = m_gemModel->GatherGemsToBeRemoved();
+
+ const int count = toBeAdded.size() + toBeRemoved.size();
+ m_countLabel->setText(QString::number(count));
+
+ m_dropDownButton->setVisible(!toBeAdded.isEmpty() || !toBeRemoved.isEmpty());
+
+ // Automatically close the overlay window in case there are no gems to be enabled or disabled anymore.
+ if (m_cartOverlay && toBeAdded.isEmpty() && toBeRemoved.isEmpty())
+ {
+ m_cartOverlay->deleteLater();
+ m_cartOverlay = nullptr;
+ }
+ });
+ }
+
+ void CartButton::mousePressEvent([[maybe_unused]] QMouseEvent* event)
+ {
+ ShowOverlay();
+ }
+
+ void CartButton::ShowOverlay()
+ {
+ const QVector toBeAdded = m_gemModel->GatherGemsToBeAdded();
+ const QVector toBeRemoved = m_gemModel->GatherGemsToBeRemoved();
+ if (toBeAdded.isEmpty() && toBeRemoved.isEmpty())
+ {
+ return;
+ }
+
+ if (m_cartOverlay)
+ {
+ // Directly delete the former overlay before creating the new one.
+ // Don't use deleteLater() here. This might overwrite the new overlay pointer
+ // depending on the event queue.
+ delete m_cartOverlay;
+ }
+
+ m_cartOverlay = new CartOverlayWidget(m_gemModel, this);
+ connect(m_cartOverlay, &QWidget::destroyed, this, [=]
+ {
+ // Reset the overlay pointer on destruction to prevent dangling pointers.
+ m_cartOverlay = nullptr;
+ });
+ m_cartOverlay->show();
+
+ const QPoint parentPos = m_dropDownButton->mapToParent(m_dropDownButton->pos());
+ const QPoint globalPos = m_dropDownButton->mapToGlobal(m_dropDownButton->pos());
+ const QPoint offset(-4, 10);
+ m_cartOverlay->setGeometry(globalPos.x() - parentPos.x() - m_cartOverlay->width() + width() + offset.x(),
+ globalPos.y() + offset.y(),
+ m_cartOverlay->width(),
+ m_cartOverlay->height());
+ }
+
+ CartButton::~CartButton()
+ {
+ // Make sure the overlay window is automatically closed in case the gem catalog is destroyed.
+ if (m_cartOverlay)
+ {
+ m_cartOverlay->deleteLater();
+ }
+ }
+
+ GemCatalogHeaderWidget::GemCatalogHeaderWidget(GemModel* gemModel, GemSortFilterProxyModel* filterProxyModel, QWidget* parent)
: QFrame(parent)
{
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->setAlignment(Qt::AlignLeft);
- hLayout->setMargin(0);
+ hLayout->setContentsMargins(10, 7, 10, 7);
setLayout(hLayout);
setObjectName("GemCatalogHeaderWidget");
-
- hLayout->addSpacing(7);
+ setFixedHeight(s_height);
QLabel* titleLabel = new QLabel(tr("Gem Catalog"));
titleLabel->setObjectName("GemCatalogTitle");
@@ -35,17 +240,23 @@ namespace O3DE::ProjectManager
hLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
- AzQtComponents::SearchLineEdit* filterLineEdit = new AzQtComponents::SearchLineEdit();
- filterLineEdit->setStyleSheet("background-color: #DDDDDD;");
- connect(filterLineEdit, &QLineEdit::textChanged, this, [=](const QString& text)
+ m_filterLineEdit = new AzQtComponents::SearchLineEdit();
+ m_filterLineEdit->setStyleSheet("background-color: #DDDDDD;");
+ connect(m_filterLineEdit, &QLineEdit::textChanged, this, [=](const QString& text)
{
filterProxyModel->SetSearchString(text);
});
- hLayout->addWidget(filterLineEdit);
+ hLayout->addWidget(m_filterLineEdit);
hLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
- hLayout->addSpacerItem(new QSpacerItem(140, 0, QSizePolicy::Fixed));
-
- setFixedHeight(60);
+ hLayout->addSpacerItem(new QSpacerItem(75, 0, QSizePolicy::Fixed));
+
+ CartButton* cartButton = new CartButton(gemModel);
+ hLayout->addWidget(cartButton);
+ }
+
+ void GemCatalogHeaderWidget::ReinitForProject()
+ {
+ m_filterLineEdit->setText({});
}
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
index 3e065edd8f..bef7555618 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
@@ -13,19 +13,81 @@
#pragma once
#if !defined(Q_MOC_RUN)
+#include
+#include
#include
+#include
#include
+#include
+#include
+#include
+#include
#endif
namespace O3DE::ProjectManager
{
+ class CartOverlayWidget
+ : public QWidget
+ {
+ Q_OBJECT // AUTOMOC
+
+ public:
+ CartOverlayWidget(GemModel* gemModel, QWidget* parent = nullptr);
+ void Update();
+
+ private:
+ QStringList ConvertFromModelIndices(const QVector& gems) const;
+
+ QVBoxLayout* m_layout = nullptr;
+ GemModel* m_gemModel = nullptr;
+
+ QWidget* m_enabledWidget = nullptr;
+ QLabel* m_enabledLabel = nullptr;
+ TagContainerWidget* m_enabledTagContainer = nullptr;
+
+ QWidget* m_disabledWidget = nullptr;
+ QLabel* m_disabledLabel = nullptr;
+ TagContainerWidget* m_disabledTagContainer = nullptr;
+
+ inline constexpr static int s_width = 240;
+ };
+
+ class CartButton
+ : public QWidget
+ {
+ Q_OBJECT // AUTOMOC
+
+ public:
+ CartButton(GemModel* gemModel, QWidget* parent = nullptr);
+ ~CartButton();
+ void ShowOverlay();
+
+ private:
+ void mousePressEvent(QMouseEvent* event) override;
+
+ GemModel* m_gemModel = nullptr;
+ QHBoxLayout* m_layout = nullptr;
+ QLabel* m_countLabel = nullptr;
+ QPushButton* m_dropDownButton = nullptr;
+ CartOverlayWidget* m_cartOverlay = nullptr;
+
+ inline constexpr static int s_iconSize = 24;
+ inline constexpr static int s_arrowDownIconSize = 8;
+ };
+
class GemCatalogHeaderWidget
: public QFrame
{
Q_OBJECT // AUTOMOC
public:
- explicit GemCatalogHeaderWidget(GemSortFilterProxyModel* filterProxyModel, QWidget* parent = nullptr);
+ explicit GemCatalogHeaderWidget(GemModel* gemModel, GemSortFilterProxyModel* filterProxyModel, QWidget* parent = nullptr);
~GemCatalogHeaderWidget() = default;
+
+ void ReinitForProject();
+
+ private:
+ AzQtComponents::SearchLineEdit* m_filterLineEdit = nullptr;
+ inline constexpr static int s_height = 60;
};
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
index aa36c1b0ab..4424767c0b 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
@@ -12,7 +12,6 @@
#include
#include
-#include
#include
#include
#include
@@ -35,8 +34,8 @@ namespace O3DE::ProjectManager
vLayout->setSpacing(0);
setLayout(vLayout);
- GemCatalogHeaderWidget* headerWidget = new GemCatalogHeaderWidget(m_proxModel);
- vLayout->addWidget(headerWidget);
+ m_headerWidget = new GemCatalogHeaderWidget(m_gemModel, m_proxModel);
+ vLayout->addWidget(m_headerWidget);
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->setMargin(0);
@@ -77,10 +76,11 @@ namespace O3DE::ProjectManager
m_filterWidget->deleteLater();
}
+ m_proxModel->ResetFilters();
m_filterWidget = new GemFilterWidget(m_proxModel);
m_filterWidgetLayout->addWidget(m_filterWidget);
- m_proxModel->InvalidateFilter();
+ m_headerWidget->ReinitForProject();
// Select the first entry after everything got correctly sized
QTimer::singleShot(200, [=]{
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
index 0847d9b74e..f5092e837a 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h
@@ -14,6 +14,7 @@
#if !defined(Q_MOC_RUN)
#include
+#include
#include
#include
#include
@@ -40,6 +41,7 @@ namespace O3DE::ProjectManager
GemListView* m_gemListView = nullptr;
GemInspector* m_gemInspector = nullptr;
GemModel* m_gemModel = nullptr;
+ GemCatalogHeaderWidget* m_headerWidget = nullptr;
GemSortFilterProxyModel* m_proxModel = nullptr;
QVBoxLayout* m_filterWidgetLayout = nullptr;
GemFilterWidget* m_filterWidget = nullptr;
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp
index 0fc0d89fcb..8aa68fb7a2 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp
@@ -53,6 +53,7 @@ namespace O3DE::ProjectManager
QFont standardFont(options.font);
standardFont.setPixelSize(s_fontSize);
+ QFontMetrics standardFontMetrics(standardFont);
painter->save();
painter->setClipping(true);
@@ -78,8 +79,10 @@ namespace O3DE::ProjectManager
}
// Gem name
- const QString gemName = GemModel::GetName(modelIndex);
+ QString gemName = GemModel::GetName(modelIndex);
QFont gemNameFont(options.font);
+ const int firstColumnMaxTextWidth = s_summaryStartX - 30;
+ gemName = QFontMetrics(gemNameFont).elidedText(gemName, Qt::TextElideMode::ElideRight, firstColumnMaxTextWidth);
gemNameFont.setPixelSize(s_gemNameFontSize);
gemNameFont.setBold(true);
QRect gemNameRect = GetTextRect(gemNameFont, gemName, s_gemNameFontSize);
@@ -90,7 +93,8 @@ namespace O3DE::ProjectManager
painter->drawText(gemNameRect, Qt::TextSingleLine, gemName);
// Gem creator
- const QString gemCreator = GemModel::GetCreator(modelIndex);
+ QString gemCreator = GemModel::GetCreator(modelIndex);
+ gemCreator = standardFontMetrics.elidedText(gemCreator, Qt::TextElideMode::ElideRight, firstColumnMaxTextWidth);
QRect gemCreatorRect = GetTextRect(standardFont, gemCreator, s_fontSize);
gemCreatorRect.moveTo(contentRect.left(), contentRect.top() + gemNameRect.height());
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.cpp
index 33936f417e..d8f41c077e 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.cpp
@@ -130,4 +130,15 @@ namespace O3DE::ProjectManager
invalidate();
emit OnInvalidated();
}
+
+ void GemSortFilterProxyModel::ResetFilters()
+ {
+ m_searchString.clear();
+ m_gemOriginFilter = {};
+ m_platformFilter = {};
+ m_typeFilter = {};
+ m_featureFilter = {};
+
+ InvalidateFilter();
+ }
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.h
index e5554c020c..f24a724ecf 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemSortFilterProxyModel.h
@@ -51,6 +51,7 @@ namespace O3DE::ProjectManager
void SetFeatures(const QSet& features) { m_featureFilter = features; InvalidateFilter(); }
void InvalidateFilter();
+ void ResetFilters();
signals:
void OnInvalidated();