From 1a0bbdd9acaf1c5edaad6d3f0790c1b02674c0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 21 Feb 2016 01:44:27 +0100 Subject: GH-1453 report version file problems in the version page --- application/pages/VersionPage.cpp | 96 ++++++++++++++++++++++++++++++++++++- application/pages/VersionPage.h | 2 + application/pages/VersionPage.ui | 24 ++++++++-- application/widgets/ModListView.cpp | 4 ++ 4 files changed, 121 insertions(+), 5 deletions(-) (limited to 'application') diff --git a/application/pages/VersionPage.cpp b/application/pages/VersionPage.cpp index e1abcf0c..f01a2d62 100644 --- a/application/pages/VersionPage.cpp +++ b/application/pages/VersionPage.cpp @@ -47,6 +47,51 @@ #include "icons/IconList.h" #include "Exception.h" +#include "MultiMC.h" + +class IconProxy : public QIdentityProxyModel +{ + Q_OBJECT +public: + + IconProxy(QWidget *parentWidget) : QIdentityProxyModel(parentWidget) + { + connect(parentWidget, &QObject::destroyed, this, &IconProxy::widgetGone); + m_parentWidget = parentWidget; + } + + virtual QVariant data(const QModelIndex &proxyIndex, int role = Qt::DisplayRole) const override + { + QVariant var = QIdentityProxyModel::data(mapToSource(proxyIndex), role); + int column = proxyIndex.column(); + if(column == 0 && role == Qt::DecorationRole && m_parentWidget) + { + if(!var.isNull()) + { + auto string = var.toString(); + if(string == "warning") + { + return MMC->getThemedIcon("status-yellow"); + } + else if(string == "error") + { + return MMC->getThemedIcon("status-bad"); + } + } + return MMC->getThemedIcon("status-good"); + } + return var; + } +private slots: + void widgetGone() + { + m_parentWidget = nullptr; + } + +private: + QWidget *m_parentWidget = nullptr; +}; + QIcon VersionPage::icon() const { return ENV.icons()->getIcon(m_inst->iconKey()); @@ -72,11 +117,15 @@ VersionPage::VersionPage(OneSixInstance *inst, QWidget *parent) m_version = m_inst->getMinecraftProfile(); if (m_version) { - ui->packageView->setModel(m_version.get()); + auto proxy = new IconProxy(ui->packageView); + proxy->setSourceModel(m_version.get()); + ui->packageView->setModel(proxy); ui->packageView->installEventFilter(this); ui->packageView->setSelectionMode(QAbstractItemView::SingleSelection); connect(ui->packageView->selectionModel(), &QItemSelectionModel::currentChanged, this, &VersionPage::versionCurrent); + auto smodel = ui->packageView->selectionModel(); + connect(smodel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(packageCurrent(QModelIndex, QModelIndex))); updateVersionControls(); // select first item. preselect(0); @@ -94,6 +143,49 @@ VersionPage::~VersionPage() delete ui; } +void VersionPage::packageCurrent(const QModelIndex ¤t, const QModelIndex &previous) +{ + if (!current.isValid()) + { + ui->frame->clear(); + return; + } + int row = current.row(); + auto patch = m_version->versionPatch(row); + auto severity = patch->getProblemSeverity(); + switch(severity) + { + case PROBLEM_WARNING: + ui->frame->setModText(tr("%1 possibly has issues.").arg(patch->getPatchName())); + break; + case PROBLEM_ERROR: + ui->frame->setModText(tr("%1 has issues!").arg(patch->getPatchName())); + break; + default: + case PROBLEM_NONE: + ui->frame->clear(); + return; + } + + auto &problems = patch->getProblems(); + QString problemOut; + for (auto &problem: problems) + { + if(problem.getSeverity() == PROBLEM_ERROR) + { + problemOut += tr("Error: "); + } + else if(problem.getSeverity() == PROBLEM_WARNING) + { + problemOut += tr("Warning: "); + } + problemOut += problem.getDescription(); + problemOut += "\n"; + } + ui->frame->setModDescription(problemOut); +} + + void VersionPage::updateVersionControls() { ui->forgeBtn->setEnabled(true); @@ -453,3 +545,5 @@ void VersionPage::on_revertBtn_clicked() updateButtons(); preselect(currentIdx); } + +#include "VersionPage.moc" diff --git a/application/pages/VersionPage.h b/application/pages/VersionPage.h index 8f2bf024..216bc30e 100644 --- a/application/pages/VersionPage.h +++ b/application/pages/VersionPage.h @@ -90,4 +90,6 @@ public slots: private slots: void onGameUpdateError(QString error); + void packageCurrent(const QModelIndex ¤t, const QModelIndex &previous); + }; diff --git a/application/pages/VersionPage.ui b/application/pages/VersionPage.ui index e88888c8..c16208db 100644 --- a/application/pages/VersionPage.ui +++ b/application/pages/VersionPage.ui @@ -7,7 +7,7 @@ 0 0 693 - 575 + 750 @@ -32,8 +32,8 @@ Tab 1 - - + + Qt::ScrollBarAlwaysOn @@ -49,7 +49,7 @@ - + @@ -245,6 +245,16 @@ + + + + + 0 + 0 + + + + @@ -263,6 +273,12 @@
widgets/LineSeparator.h
1 + + MCModInfoFrame + QFrame +
widgets/MCModInfoFrame.h
+ 1 +
tabWidget diff --git a/application/widgets/ModListView.cpp b/application/widgets/ModListView.cpp index aa16ad05..51b4a475 100644 --- a/application/widgets/ModListView.cpp +++ b/application/widgets/ModListView.cpp @@ -46,6 +46,10 @@ void ModListView::setModel ( QAbstractItemModel* model ) head->setStretchLastSection(false); // HACK: this is true for the checkbox column of mod lists auto string = model->headerData(0,head->orientation()).toString(); + if(head->count() < 1) + { + return; + } if(!string.size()) { head->setSectionResizeMode(0, QHeaderView::ResizeToContents); -- cgit v1.2.3