@ -35,53 +35,48 @@
|
||||
*/
|
||||
|
||||
#include "VersionProxyModel.h"
|
||||
#include "Application.h"
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QPixmapCache>
|
||||
#include <Version.h>
|
||||
#include <meta/VersionList.h>
|
||||
#include <QPixmapCache>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include "Application.h"
|
||||
|
||||
class VersionFilterModel : public QSortFilterProxyModel
|
||||
{
|
||||
class VersionFilterModel : public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
VersionFilterModel(VersionProxyModel *parent) : QSortFilterProxyModel(parent)
|
||||
public:
|
||||
VersionFilterModel(VersionProxyModel* parent) : QSortFilterProxyModel(parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
setSortRole(BaseVersionList::SortRole);
|
||||
sort(0, Qt::DescendingOrder);
|
||||
}
|
||||
|
||||
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
|
||||
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
|
||||
{
|
||||
const auto &filters = m_parent->filters();
|
||||
const QString &search = m_parent->search();
|
||||
const auto& filters = m_parent->filters();
|
||||
const QString& search = m_parent->search();
|
||||
const QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
|
||||
|
||||
if (!search.isEmpty() && !sourceModel()->data(idx, BaseVersionList::VersionRole).toString().contains(search, Qt::CaseInsensitive))
|
||||
return false;
|
||||
|
||||
for (auto it = filters.begin(); it != filters.end(); ++it)
|
||||
{
|
||||
for (auto it = filters.begin(); it != filters.end(); ++it) {
|
||||
auto data = sourceModel()->data(idx, it.key());
|
||||
auto match = data.toString();
|
||||
if(!it.value()->accepts(match))
|
||||
{
|
||||
if (!it.value()->accepts(match)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void filterChanged()
|
||||
{
|
||||
invalidateFilter();
|
||||
}
|
||||
private:
|
||||
VersionProxyModel *m_parent;
|
||||
void filterChanged() { invalidateFilter(); }
|
||||
|
||||
private:
|
||||
VersionProxyModel* m_parent;
|
||||
};
|
||||
|
||||
VersionProxyModel::VersionProxyModel(QObject *parent) : QAbstractProxyModel(parent)
|
||||
VersionProxyModel::VersionProxyModel(QObject* parent) : QAbstractProxyModel(parent)
|
||||
{
|
||||
filterModel = new VersionFilterModel(this);
|
||||
connect(filterModel, &QAbstractItemModel::dataChanged, this, &VersionProxyModel::sourceDataChanged);
|
||||
@ -104,19 +99,17 @@ VersionProxyModel::VersionProxyModel(QObject *parent) : QAbstractProxyModel(pare
|
||||
|
||||
QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if(section < 0 || section >= m_columns.size())
|
||||
if (section < 0 || section >= m_columns.size())
|
||||
return QVariant();
|
||||
if(orientation != Qt::Horizontal)
|
||||
if (orientation != Qt::Horizontal)
|
||||
return QVariant();
|
||||
auto column = m_columns[section];
|
||||
if(role == Qt::DisplayRole)
|
||||
{
|
||||
switch(column)
|
||||
{
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch (column) {
|
||||
case Name:
|
||||
return tr("Version");
|
||||
case ParentVersion:
|
||||
return tr("Minecraft"); //FIXME: this should come from metadata
|
||||
return tr("Minecraft"); // FIXME: this should come from metadata
|
||||
case Branch:
|
||||
return tr("Branch");
|
||||
case Type:
|
||||
@ -128,15 +121,12 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation,
|
||||
case Time:
|
||||
return tr("Released");
|
||||
}
|
||||
}
|
||||
else if(role == Qt::ToolTipRole)
|
||||
{
|
||||
switch(column)
|
||||
{
|
||||
} else if (role == Qt::ToolTipRole) {
|
||||
switch (column) {
|
||||
case Name:
|
||||
return tr("The name of the version.");
|
||||
case ParentVersion:
|
||||
return tr("Minecraft version"); //FIXME: this should come from metadata
|
||||
return tr("Minecraft version"); // FIXME: this should come from metadata
|
||||
case Branch:
|
||||
return tr("The version's branch");
|
||||
case Type:
|
||||
@ -152,25 +142,19 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation,
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant VersionProxyModel::data(const QModelIndex &index, int role) const
|
||||
QVariant VersionProxyModel::data(const QModelIndex& index, int role) const
|
||||
{
|
||||
if(!index.isValid())
|
||||
{
|
||||
if (!index.isValid()) {
|
||||
return QVariant();
|
||||
}
|
||||
auto column = m_columns[index.column()];
|
||||
auto parentIndex = mapToSource(index);
|
||||
switch(role)
|
||||
{
|
||||
case Qt::DisplayRole:
|
||||
{
|
||||
switch(column)
|
||||
{
|
||||
case Name:
|
||||
{
|
||||
switch (role) {
|
||||
case Qt::DisplayRole: {
|
||||
switch (column) {
|
||||
case Name: {
|
||||
QString version = sourceModel()->data(parentIndex, BaseVersionList::VersionRole).toString();
|
||||
if(version == m_currentVersion)
|
||||
{
|
||||
if (version == m_currentVersion) {
|
||||
return tr("%1 (installed)").arg(version);
|
||||
}
|
||||
return version;
|
||||
@ -191,18 +175,14 @@ QVariant VersionProxyModel::data(const QModelIndex &index, int role) const
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
case Qt::ToolTipRole:
|
||||
{
|
||||
if(column == Name && hasRecommended)
|
||||
{
|
||||
case Qt::ToolTipRole: {
|
||||
if (column == Name && hasRecommended) {
|
||||
auto value = sourceModel()->data(parentIndex, BaseVersionList::RecommendedRole);
|
||||
if(value.toBool())
|
||||
{
|
||||
if (value.toBool()) {
|
||||
return tr("Recommended");
|
||||
} else if(hasLatest) {
|
||||
} else if (hasLatest) {
|
||||
auto value = sourceModel()->data(parentIndex, BaseVersionList::LatestRole);
|
||||
if(value.toBool())
|
||||
{
|
||||
if (value.toBool()) {
|
||||
return tr("Latest");
|
||||
}
|
||||
}
|
||||
@ -210,14 +190,10 @@ QVariant VersionProxyModel::data(const QModelIndex &index, int role) const
|
||||
return sourceModel()->data(parentIndex, BaseVersionList::VersionIdRole);
|
||||
}
|
||||
}
|
||||
case Qt::DecorationRole:
|
||||
{
|
||||
switch(column)
|
||||
{
|
||||
case Name:
|
||||
{
|
||||
if(hasRecommended)
|
||||
{
|
||||
case Qt::DecorationRole: {
|
||||
switch (column) {
|
||||
case Name: {
|
||||
if (hasRecommended) {
|
||||
auto recommenced = sourceModel()->data(parentIndex, BaseVersionList::RecommendedRole);
|
||||
if (recommenced.toBool()) {
|
||||
return APPLICATION->getThemedIcon("star");
|
||||
@ -229,9 +205,8 @@ QVariant VersionProxyModel::data(const QModelIndex &index, int role) const
|
||||
}
|
||||
QPixmap pixmap;
|
||||
QPixmapCache::find("placeholder", &pixmap);
|
||||
if(!pixmap)
|
||||
{
|
||||
QPixmap px(16,16);
|
||||
if (!pixmap) {
|
||||
QPixmap px(16, 16);
|
||||
px.fill(Qt::transparent);
|
||||
QPixmapCache::insert("placeholder", px);
|
||||
return px;
|
||||
@ -239,16 +214,13 @@ QVariant VersionProxyModel::data(const QModelIndex &index, int role) const
|
||||
return pixmap;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
default: {
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
if(roles.contains((BaseVersionList::ModelRoles)role))
|
||||
{
|
||||
default: {
|
||||
if (roles.contains((BaseVersionList::ModelRoles)role)) {
|
||||
return sourceModel()->data(parentIndex, role);
|
||||
}
|
||||
return QVariant();
|
||||
@ -261,56 +233,51 @@ QModelIndex VersionProxyModel::parent([[maybe_unused]] const QModelIndex& child)
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex VersionProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
|
||||
QModelIndex VersionProxyModel::mapFromSource(const QModelIndex& sourceIndex) const
|
||||
{
|
||||
if(sourceIndex.isValid())
|
||||
{
|
||||
if (sourceIndex.isValid()) {
|
||||
return index(sourceIndex.row(), 0);
|
||||
}
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex VersionProxyModel::mapToSource(const QModelIndex &proxyIndex) const
|
||||
QModelIndex VersionProxyModel::mapToSource(const QModelIndex& proxyIndex) const
|
||||
{
|
||||
if(proxyIndex.isValid())
|
||||
{
|
||||
if (proxyIndex.isValid()) {
|
||||
return sourceModel()->index(proxyIndex.row(), 0);
|
||||
}
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex VersionProxyModel::index(int row, int column, const QModelIndex &parent) const
|
||||
QModelIndex VersionProxyModel::index(int row, int column, const QModelIndex& parent) const
|
||||
{
|
||||
// no trees here... shoo
|
||||
if(parent.isValid())
|
||||
{
|
||||
if (parent.isValid()) {
|
||||
return QModelIndex();
|
||||
}
|
||||
if(row < 0 || row >= sourceModel()->rowCount())
|
||||
if (row < 0 || row >= sourceModel()->rowCount())
|
||||
return QModelIndex();
|
||||
if(column < 0 || column >= columnCount())
|
||||
if (column < 0 || column >= columnCount())
|
||||
return QModelIndex();
|
||||
return QAbstractItemModel::createIndex(row, column);
|
||||
}
|
||||
|
||||
int VersionProxyModel::columnCount(const QModelIndex &parent) const
|
||||
int VersionProxyModel::columnCount(const QModelIndex& parent) const
|
||||
{
|
||||
return parent.isValid() ? 0 : m_columns.size();
|
||||
}
|
||||
|
||||
int VersionProxyModel::rowCount(const QModelIndex &parent) const
|
||||
int VersionProxyModel::rowCount(const QModelIndex& parent) const
|
||||
{
|
||||
if(sourceModel())
|
||||
{
|
||||
if (sourceModel()) {
|
||||
return sourceModel()->rowCount(parent);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void VersionProxyModel::sourceDataChanged(const QModelIndex &source_top_left,
|
||||
const QModelIndex &source_bottom_right)
|
||||
void VersionProxyModel::sourceDataChanged(const QModelIndex& source_top_left, const QModelIndex& source_bottom_right)
|
||||
{
|
||||
if(source_top_left.parent() != source_bottom_right.parent())
|
||||
if (source_top_left.parent() != source_bottom_right.parent())
|
||||
return;
|
||||
|
||||
// whole row is getting changed
|
||||
@ -319,22 +286,20 @@ void VersionProxyModel::sourceDataChanged(const QModelIndex &source_top_left,
|
||||
emit dataChanged(topLeft, bottomRight);
|
||||
}
|
||||
|
||||
void VersionProxyModel::setSourceModel(QAbstractItemModel *replacingRaw)
|
||||
void VersionProxyModel::setSourceModel(QAbstractItemModel* replacingRaw)
|
||||
{
|
||||
auto replacing = dynamic_cast<BaseVersionList *>(replacingRaw);
|
||||
auto replacing = dynamic_cast<BaseVersionList*>(replacingRaw);
|
||||
beginResetModel();
|
||||
|
||||
m_columns.clear();
|
||||
if(!replacing)
|
||||
{
|
||||
if (!replacing) {
|
||||
roles.clear();
|
||||
filterModel->setSourceModel(replacing);
|
||||
return;
|
||||
}
|
||||
|
||||
roles = replacing->providesRoles();
|
||||
if(roles.contains(BaseVersionList::VersionRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::VersionRole)) {
|
||||
m_columns.push_back(Name);
|
||||
}
|
||||
/*
|
||||
@ -343,32 +308,25 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel *replacingRaw)
|
||||
m_columns.push_back(ParentVersion);
|
||||
}
|
||||
*/
|
||||
if(roles.contains(BaseVersionList::ArchitectureRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::ArchitectureRole)) {
|
||||
m_columns.push_back(Architecture);
|
||||
}
|
||||
if(roles.contains(BaseVersionList::PathRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::PathRole)) {
|
||||
m_columns.push_back(Path);
|
||||
}
|
||||
if(roles.contains(Meta::VersionList::TimeRole))
|
||||
{
|
||||
if (roles.contains(Meta::VersionList::TimeRole)) {
|
||||
m_columns.push_back(Time);
|
||||
}
|
||||
if(roles.contains(BaseVersionList::BranchRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::BranchRole)) {
|
||||
m_columns.push_back(Branch);
|
||||
}
|
||||
if(roles.contains(BaseVersionList::TypeRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::TypeRole)) {
|
||||
m_columns.push_back(Type);
|
||||
}
|
||||
if(roles.contains(BaseVersionList::RecommendedRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::RecommendedRole)) {
|
||||
hasRecommended = true;
|
||||
}
|
||||
if(roles.contains(BaseVersionList::LatestRole))
|
||||
{
|
||||
if (roles.contains(BaseVersionList::LatestRole)) {
|
||||
hasLatest = true;
|
||||
}
|
||||
filterModel->setSourceModel(replacing);
|
||||
@ -378,16 +336,13 @@ void VersionProxyModel::setSourceModel(QAbstractItemModel *replacingRaw)
|
||||
|
||||
QModelIndex VersionProxyModel::getRecommended() const
|
||||
{
|
||||
if(!roles.contains(BaseVersionList::RecommendedRole))
|
||||
{
|
||||
if (!roles.contains(BaseVersionList::RecommendedRole)) {
|
||||
return index(0, 0);
|
||||
}
|
||||
int recommended = 0;
|
||||
for (int i = 0; i < rowCount(); i++)
|
||||
{
|
||||
for (int i = 0; i < rowCount(); i++) {
|
||||
auto value = sourceModel()->data(mapToSource(index(i, 0)), BaseVersionList::RecommendedRole);
|
||||
if (value.toBool())
|
||||
{
|
||||
if (value.toBool()) {
|
||||
recommended = i;
|
||||
}
|
||||
}
|
||||
@ -397,16 +352,13 @@ QModelIndex VersionProxyModel::getRecommended() const
|
||||
QModelIndex VersionProxyModel::getVersion(const QString& version) const
|
||||
{
|
||||
int found = -1;
|
||||
for (int i = 0; i < rowCount(); i++)
|
||||
{
|
||||
for (int i = 0; i < rowCount(); i++) {
|
||||
auto value = sourceModel()->data(mapToSource(index(i, 0)), BaseVersionList::VersionRole);
|
||||
if (value.toString() == version)
|
||||
{
|
||||
if (value.toString() == version) {
|
||||
found = i;
|
||||
}
|
||||
}
|
||||
if(found == -1)
|
||||
{
|
||||
if (found == -1) {
|
||||
return QModelIndex();
|
||||
}
|
||||
return index(found, 0);
|
||||
@ -419,23 +371,24 @@ void VersionProxyModel::clearFilters()
|
||||
filterModel->filterChanged();
|
||||
}
|
||||
|
||||
void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, Filter * f)
|
||||
void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, Filter* f)
|
||||
{
|
||||
m_filters[column].reset(f);
|
||||
filterModel->filterChanged();
|
||||
}
|
||||
|
||||
void VersionProxyModel::setSearch(const QString &search) {
|
||||
void VersionProxyModel::setSearch(const QString& search)
|
||||
{
|
||||
m_search = search;
|
||||
filterModel->filterChanged();
|
||||
}
|
||||
|
||||
const VersionProxyModel::FilterMap &VersionProxyModel::filters() const
|
||||
const VersionProxyModel::FilterMap& VersionProxyModel::filters() const
|
||||
{
|
||||
return m_filters;
|
||||
}
|
||||
|
||||
const QString &VersionProxyModel::search() const
|
||||
const QString& VersionProxyModel::search() const
|
||||
{
|
||||
return m_search;
|
||||
}
|
||||
@ -472,7 +425,7 @@ void VersionProxyModel::sourceRowsRemoved([[maybe_unused]] const QModelIndex& pa
|
||||
endRemoveRows();
|
||||
}
|
||||
|
||||
void VersionProxyModel::setCurrentVersion(const QString &version)
|
||||
void VersionProxyModel::setCurrentVersion(const QString& version)
|
||||
{
|
||||
m_currentVersion = version;
|
||||
}
|
||||
|
Reference in New Issue
Block a user