Adds Download status info UI to Gem Catalog (#4602)
* Adds Download status info UI to Gem Catalog Signed-off-by: nggieber <nggieber@amazon.com> * Removed test code Signed-off-by: nggieber <nggieber@amazon.com> * Remove unused variable Signed-off-by: nggieber <nggieber@amazon.com> * Addressed PR feedback Signed-off-by: nggieber <nggieber@amazon.com> * Fixed Open3DEngine spelling Signed-off-by: nggieber <nggieber@amazon.com>
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include <GemCatalog/GemModel.h>
|
||||
#include <GemCatalog/GemSortFilterProxyModel.h>
|
||||
#include <AzCore/std/smart_ptr/unique_ptr.h>
|
||||
|
||||
#include <QEvent>
|
||||
#include <QAbstractItemView>
|
||||
#include <QPainter>
|
||||
@@ -20,6 +21,7 @@
|
||||
#include <QTextDocument>
|
||||
#include <QAbstractTextDocumentLayout>
|
||||
#include <QDesktopServices>
|
||||
#include <QMovie>
|
||||
|
||||
namespace O3DE::ProjectManager
|
||||
{
|
||||
@@ -32,6 +34,11 @@ namespace O3DE::ProjectManager
|
||||
AddPlatformIcon(GemInfo::Linux, ":/Linux.svg");
|
||||
AddPlatformIcon(GemInfo::macOS, ":/macOS.svg");
|
||||
AddPlatformIcon(GemInfo::Windows, ":/Windows.svg");
|
||||
|
||||
SetStatusIcon(m_notDownloadedPixmap, ":/Download.svg");
|
||||
SetStatusIcon(m_unknownStatusPixmap, ":/X.svg");
|
||||
|
||||
m_downloadingMovie = new QMovie(":/in_progress.gif");
|
||||
}
|
||||
|
||||
void GemItemDelegate::AddPlatformIcon(GemInfo::Platform platform, const QString& iconPath)
|
||||
@@ -41,6 +48,25 @@ namespace O3DE::ProjectManager
|
||||
m_platformIcons.insert(platform, QIcon(iconPath).pixmap(static_cast<int>(static_cast<qreal>(s_platformIconSize) * aspectRatio), s_platformIconSize));
|
||||
}
|
||||
|
||||
void GemItemDelegate::SetStatusIcon(QPixmap& m_iconPixmap, const QString& iconPath)
|
||||
{
|
||||
QPixmap pixmap(iconPath);
|
||||
float aspectRatio = static_cast<float>(pixmap.width()) / pixmap.height();
|
||||
int xScaler = s_statusIconSize;
|
||||
int yScaler = s_statusIconSize;
|
||||
|
||||
if (aspectRatio > 1.0f)
|
||||
{
|
||||
yScaler = static_cast<int>(1.0f / aspectRatio * s_statusIconSize);
|
||||
}
|
||||
else if (aspectRatio < 1.0f)
|
||||
{
|
||||
xScaler = static_cast<int>(aspectRatio * s_statusIconSize);
|
||||
}
|
||||
|
||||
m_iconPixmap = QPixmap(QIcon(iconPath).pixmap(xScaler, yScaler));
|
||||
}
|
||||
|
||||
void GemItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) const
|
||||
{
|
||||
if (!modelIndex.isValid())
|
||||
@@ -56,6 +82,8 @@ namespace O3DE::ProjectManager
|
||||
QRect fullRect, itemRect, contentRect;
|
||||
CalcRects(options, fullRect, itemRect, contentRect);
|
||||
|
||||
QRect buttonRect = CalcButtonRect(contentRect);
|
||||
|
||||
QFont standardFont(options.font);
|
||||
standardFont.setPixelSize(static_cast<int>(s_fontSize));
|
||||
QFontMetrics standardFontMetrics(standardFont);
|
||||
@@ -114,7 +142,8 @@ namespace O3DE::ProjectManager
|
||||
const QRect summaryRect = CalcSummaryRect(contentRect, hasTags);
|
||||
DrawText(summary, painter, summaryRect, standardFont);
|
||||
|
||||
DrawButton(painter, contentRect, modelIndex);
|
||||
DrawDownloadStatusIcon(painter, contentRect, buttonRect, modelIndex);
|
||||
DrawButton(painter, buttonRect, modelIndex);
|
||||
DrawPlatformIcons(painter, contentRect, modelIndex);
|
||||
DrawFeatureTags(painter, contentRect, featureTags, standardFont, summaryRect);
|
||||
|
||||
@@ -270,7 +299,7 @@ namespace O3DE::ProjectManager
|
||||
|
||||
QRect GemItemDelegate::CalcButtonRect(const QRect& contentRect) const
|
||||
{
|
||||
const QPoint topLeft = QPoint(contentRect.right() - s_buttonWidth - s_itemMargins.right(), contentRect.top() + contentRect.height() / 2 - s_buttonHeight / 2);
|
||||
const QPoint topLeft = QPoint(contentRect.right() - s_buttonWidth, contentRect.center().y() - s_buttonHeight / 2);
|
||||
const QSize size = QSize(s_buttonWidth, s_buttonHeight);
|
||||
return QRect(topLeft, size);
|
||||
}
|
||||
@@ -378,10 +407,9 @@ namespace O3DE::ProjectManager
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
void GemItemDelegate::DrawButton(QPainter* painter, const QRect& contentRect, const QModelIndex& modelIndex) const
|
||||
void GemItemDelegate::DrawButton(QPainter* painter, const QRect& buttonRect, const QModelIndex& modelIndex) const
|
||||
{
|
||||
painter->save();
|
||||
const QRect buttonRect = CalcButtonRect(contentRect);
|
||||
QPoint circleCenter;
|
||||
|
||||
if (GemModel::IsAdded(modelIndex))
|
||||
@@ -427,4 +455,45 @@ namespace O3DE::ProjectManager
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
void GemItemDelegate::DrawDownloadStatusIcon(QPainter* painter, const QRect& contentRect, const QRect& buttonRect, const QModelIndex& modelIndex) const
|
||||
{
|
||||
const GemInfo::DownloadStatus downloadStatus = GemModel::GetDownloadStatus(modelIndex);
|
||||
|
||||
// Show no icon if gem is already downloaded
|
||||
if (downloadStatus == GemInfo::DownloadStatus::Downloaded)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QPixmap currentFrame;
|
||||
const QPixmap* statusPixmap;
|
||||
if (downloadStatus == GemInfo::DownloadStatus::Downloading)
|
||||
{
|
||||
if (m_downloadingMovie->state() != QMovie::Running)
|
||||
{
|
||||
m_downloadingMovie->start();
|
||||
emit MovieStartedPlaying(m_downloadingMovie);
|
||||
}
|
||||
|
||||
currentFrame = m_downloadingMovie->currentPixmap();
|
||||
currentFrame = currentFrame.scaled(s_statusIconSize, s_statusIconSize);
|
||||
statusPixmap = ¤tFrame;
|
||||
}
|
||||
else if (downloadStatus == GemInfo::DownloadStatus::NotDownloaded)
|
||||
{
|
||||
statusPixmap = &m_notDownloadedPixmap;
|
||||
}
|
||||
else
|
||||
{
|
||||
statusPixmap = &m_unknownStatusPixmap;
|
||||
}
|
||||
|
||||
QSize statusSize = statusPixmap->size();
|
||||
|
||||
painter->drawPixmap(
|
||||
buttonRect.left() - s_statusButtonSpacing - statusSize.width(),
|
||||
contentRect.center().y() - statusSize.height() / 2,
|
||||
*statusPixmap);
|
||||
}
|
||||
} // namespace O3DE::ProjectManager
|
||||
|
||||
Reference in New Issue
Block a user