Prism Show Gem Requirements and Prompt when Adding Gems with Requirements (#1478)
* Added requirements section to gem inspector * Added Dialog when configuring for gems with extra requirementsmain
parent
570696ad76
commit
bc3aa45ed9
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="24" height="24" fill="#444444"/>
|
||||||
|
<rect x="10" y="6" width="4" height="15" fill="black"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 2L22 22H2L12 2ZM13 20V18H11V20H13ZM13 7H11V16.0862H13V7Z" fill="#F0C32D"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 333 B |
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GemCatalog/GemRequirementDelegate.h>
|
||||||
|
#include <GemCatalog/GemModel.h>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
GemRequirementDelegate::GemRequirementDelegate(QAbstractItemModel* model, QObject* parent)
|
||||||
|
: GemItemDelegate(model, parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GemRequirementDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) const
|
||||||
|
{
|
||||||
|
if (!modelIndex.isValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStyleOptionViewItem options(option);
|
||||||
|
initStyleOption(&options, modelIndex);
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
painter->setRenderHint(QPainter::Antialiasing);
|
||||||
|
|
||||||
|
QRect fullRect, itemRect, contentRect;
|
||||||
|
CalcRects(options, fullRect, itemRect, contentRect);
|
||||||
|
|
||||||
|
QFont standardFont(options.font);
|
||||||
|
standardFont.setPixelSize(s_fontSize);
|
||||||
|
QFontMetrics standardFontMetrics(standardFont);
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
painter->setClipping(true);
|
||||||
|
painter->setClipRect(fullRect);
|
||||||
|
painter->setFont(options.font);
|
||||||
|
|
||||||
|
// Draw background
|
||||||
|
painter->fillRect(fullRect, m_backgroundColor);
|
||||||
|
|
||||||
|
// Draw item background
|
||||||
|
const QColor itemBackgroundColor = m_itemBackgroundColor;
|
||||||
|
painter->fillRect(itemRect, itemBackgroundColor);
|
||||||
|
|
||||||
|
// Gem name
|
||||||
|
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);
|
||||||
|
gemNameRect.moveTo(contentRect.left(), contentRect.center().y() - s_gemNameFontSize);
|
||||||
|
|
||||||
|
painter->setFont(gemNameFont);
|
||||||
|
painter->setPen(m_textColor);
|
||||||
|
painter->drawText(gemNameRect, Qt::TextSingleLine, gemName);
|
||||||
|
|
||||||
|
// Gem requirement
|
||||||
|
const QSize requirementSize = QSize(contentRect.width() - s_summaryStartX - s_itemMargins.right(), contentRect.height());
|
||||||
|
const QRect requirementRect = QRect(QPoint(contentRect.left() + s_summaryStartX, contentRect.top()), requirementSize);
|
||||||
|
|
||||||
|
painter->setFont(standardFont);
|
||||||
|
painter->setPen(m_textColor);
|
||||||
|
|
||||||
|
const QString requirement = GemModel::GetRequirement(modelIndex);
|
||||||
|
painter->drawText(requirementRect, Qt::AlignLeft | Qt::TextWordWrap, requirement);
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GemRequirementDelegate::editorEvent(
|
||||||
|
[[maybe_unused]] QEvent* event,
|
||||||
|
[[maybe_unused]] QAbstractItemModel* model,
|
||||||
|
[[maybe_unused]] const QStyleOptionViewItem& option,
|
||||||
|
[[maybe_unused]] const QModelIndex& modelIndex)
|
||||||
|
{
|
||||||
|
// Do nothing here
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !defined(Q_MOC_RUN)
|
||||||
|
#include <GemCatalog/GemItemDelegate.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
class GemRequirementDelegate
|
||||||
|
: public GemItemDelegate
|
||||||
|
{
|
||||||
|
Q_OBJECT // AUTOMOC
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit GemRequirementDelegate(QAbstractItemModel* model, QObject* parent = nullptr);
|
||||||
|
~GemRequirementDelegate() = default;
|
||||||
|
|
||||||
|
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) const override;
|
||||||
|
bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) override;
|
||||||
|
|
||||||
|
const QColor m_backgroundColor = QColor("#444444"); // Outside of the actual gem item
|
||||||
|
const QColor m_itemBackgroundColor = QColor("#393939"); // Background color of the gem item
|
||||||
|
};
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GemCatalog/GemRequirementDialog.h>
|
||||||
|
#include <GemCatalog/GemRequirementListView.h>
|
||||||
|
#include <GemCatalog/GemRequirementFilterProxyModel.h>
|
||||||
|
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QSpacerItem>
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
GemRequirementDialog::GemRequirementDialog(GemModel* model, const QVector<QModelIndex>& gemsToAdd, QWidget* parent)
|
||||||
|
: QDialog(parent)
|
||||||
|
{
|
||||||
|
setWindowTitle(tr("Manual setup is required"));
|
||||||
|
setModal(true);
|
||||||
|
|
||||||
|
QVBoxLayout* vLayout = new QVBoxLayout();
|
||||||
|
vLayout->setMargin(0);
|
||||||
|
vLayout->setContentsMargins(25, 10, 25, 10);
|
||||||
|
vLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
|
setLayout(vLayout);
|
||||||
|
|
||||||
|
QHBoxLayout* instructionLayout = new QHBoxLayout();
|
||||||
|
instructionLayout->setMargin(0);
|
||||||
|
|
||||||
|
QLabel* instructionIconLabel = new QLabel();
|
||||||
|
instructionIconLabel->setPixmap(QIcon(":/Warning.svg").pixmap(32, 32));
|
||||||
|
instructionLayout->addWidget(instructionIconLabel);
|
||||||
|
|
||||||
|
instructionLayout->addSpacing(10);
|
||||||
|
|
||||||
|
QLabel* instructionLabel = new QLabel(tr("The following Gem(s) require manual setup before the project can be built successfully."));
|
||||||
|
instructionLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
instructionLayout->addWidget(instructionLabel);
|
||||||
|
|
||||||
|
QSpacerItem* instructionSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||||||
|
instructionLayout->addSpacerItem(instructionSpacer);
|
||||||
|
|
||||||
|
vLayout->addLayout(instructionLayout);
|
||||||
|
|
||||||
|
vLayout->addSpacing(20);
|
||||||
|
|
||||||
|
GemRequirementFilterProxyModel* proxModel = new GemRequirementFilterProxyModel(model, gemsToAdd, this);
|
||||||
|
|
||||||
|
GemRequirementListView* m_gemListView = new GemRequirementListView(proxModel, proxModel->GetSelectionModel(), this);
|
||||||
|
vLayout->addWidget(m_gemListView);
|
||||||
|
|
||||||
|
QDialogButtonBox* dialogButtons = new QDialogButtonBox();
|
||||||
|
dialogButtons->setObjectName("footer");
|
||||||
|
vLayout->addWidget(dialogButtons);
|
||||||
|
|
||||||
|
QPushButton* cancelButton = dialogButtons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
|
||||||
|
cancelButton->setProperty("secondary", true);
|
||||||
|
QPushButton* continueButton = dialogButtons->addButton(tr("Continue"), QDialogButtonBox::ApplyRole);
|
||||||
|
|
||||||
|
connect(cancelButton, &QPushButton::clicked, this, &GemRequirementDialog::CancelButtonPressed);
|
||||||
|
connect(continueButton, &QPushButton::clicked, this, &GemRequirementDialog::ContinueButtonPressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
QDialogButtonBox::ButtonRole GemRequirementDialog::GetButtonResult()
|
||||||
|
{
|
||||||
|
return m_buttonResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GemRequirementDialog::CancelButtonPressed()
|
||||||
|
{
|
||||||
|
m_buttonResult = QDialogButtonBox::RejectRole;
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GemRequirementDialog::ContinueButtonPressed()
|
||||||
|
{
|
||||||
|
m_buttonResult = QDialogButtonBox::ApplyRole;
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !defined(Q_MOC_RUN)
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
QT_FORWARD_DECLARE_CLASS(GemModel)
|
||||||
|
|
||||||
|
class GemRequirementDialog
|
||||||
|
: public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT // AUTOMOC
|
||||||
|
public:
|
||||||
|
explicit GemRequirementDialog(GemModel* model, const QVector<QModelIndex>& gemsToAdd, QWidget *parent = nullptr);
|
||||||
|
~GemRequirementDialog() = default;
|
||||||
|
|
||||||
|
QDialogButtonBox::ButtonRole GetButtonResult();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CancelButtonPressed();
|
||||||
|
void ContinueButtonPressed();
|
||||||
|
|
||||||
|
QDialogButtonBox::ButtonRole m_buttonResult = QDialogButtonBox::RejectRole;
|
||||||
|
};
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GemCatalog/GemRequirementFilterProxyModel.h>
|
||||||
|
#include <GemCatalog/GemModel.h>
|
||||||
|
|
||||||
|
#include <QItemSelectionModel>
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
GemRequirementFilterProxyModel::GemRequirementFilterProxyModel(GemModel* sourceModel, const QVector<QModelIndex>& addedGems, QObject* parent)
|
||||||
|
: QSortFilterProxyModel(parent)
|
||||||
|
, m_sourceModel(sourceModel)
|
||||||
|
, m_addedGems(addedGems)
|
||||||
|
{
|
||||||
|
setSourceModel(sourceModel);
|
||||||
|
m_selectionProxyModel = new AzQtComponents::SelectionProxyModel(sourceModel->GetSelectionModel(), this, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GemRequirementFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
|
||||||
|
{
|
||||||
|
// Do not use sourceParent->child because an invalid parent does not produce valid children (which our index function does)
|
||||||
|
QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent);
|
||||||
|
if (!sourceIndex.isValid())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_addedGems.contains(sourceIndex))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_sourceModel->HasRequirement(sourceIndex))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !defined(Q_MOC_RUN)
|
||||||
|
#include <AzQtComponents/Utilities/SelectionProxyModel.h>
|
||||||
|
#include <QtCore/QSortFilterProxyModel>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QT_FORWARD_DECLARE_CLASS(QItemSelectionModel)
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
QT_FORWARD_DECLARE_CLASS(GemModel)
|
||||||
|
|
||||||
|
class GemRequirementFilterProxyModel
|
||||||
|
: public QSortFilterProxyModel
|
||||||
|
{
|
||||||
|
Q_OBJECT // AUTOMOC
|
||||||
|
|
||||||
|
public:
|
||||||
|
GemRequirementFilterProxyModel(GemModel* sourceModel, const QVector<QModelIndex>& addedGems, QObject* parent = nullptr);
|
||||||
|
|
||||||
|
AzQtComponents::SelectionProxyModel* GetSelectionModel() const { return m_selectionProxyModel; }
|
||||||
|
|
||||||
|
bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
GemModel* m_sourceModel = nullptr;
|
||||||
|
AzQtComponents::SelectionProxyModel* m_selectionProxyModel = nullptr;
|
||||||
|
|
||||||
|
QVector<QModelIndex> m_addedGems;
|
||||||
|
};
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GemCatalog/GemRequirementListView.h>
|
||||||
|
#include <GemCatalog/GemRequirementDelegate.h>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
GemRequirementListView::GemRequirementListView(QAbstractItemModel* model, QItemSelectionModel* selectionModel, QWidget* parent)
|
||||||
|
: QListView(parent)
|
||||||
|
{
|
||||||
|
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||||
|
|
||||||
|
setStyleSheet("background-color: #444444;");
|
||||||
|
|
||||||
|
setModel(model);
|
||||||
|
setSelectionModel(selectionModel);
|
||||||
|
setItemDelegate(new GemRequirementDelegate(model, this));
|
||||||
|
}
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||||
|
* its licensors.
|
||||||
|
*
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||||
|
* distribution (the "License"). All use of this software is governed by the License,
|
||||||
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||||
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !defined(Q_MOC_RUN)
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
#include <QItemSelectionModel>
|
||||||
|
#include <QListView>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace O3DE::ProjectManager
|
||||||
|
{
|
||||||
|
class GemRequirementListView
|
||||||
|
: public QListView
|
||||||
|
{
|
||||||
|
Q_OBJECT // AUTOMOC
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit GemRequirementListView(QAbstractItemModel* model, QItemSelectionModel* selectionModel, QWidget* parent = nullptr);
|
||||||
|
~GemRequirementListView() = default;
|
||||||
|
};
|
||||||
|
} // namespace O3DE::ProjectManager
|
||||||
Loading…
Reference in New Issue