summaryrefslogtreecommitdiffstats
path: root/application/FtbListModel.cpp
blob: d79bcac068b1ba3035243b086e5fe99c4c96923b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "FtbListModel.h"
#include "MultiMC.h"

#include <MMCStrings.h>
#include <Version.h>

#include <QtMath>

FtbFilterModel::FtbFilterModel(QObject *parent) : QSortFilterProxyModel(parent)
{
	currentSorting = Sorting::ByGameVersion;
	sortings.insert("Sort by name", Sorting::ByName);
	sortings.insert("Sort by game version", Sorting::ByGameVersion);
}

bool FtbFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
	FtbModpack leftPack = sourceModel()->data(left, Qt::UserRole).value<FtbModpack>();
	FtbModpack rightPack = sourceModel()->data(right, Qt::UserRole).value<FtbModpack>();

	if(currentSorting == Sorting::ByGameVersion) {
		Version lv(leftPack.mcVersion);
		Version rv(rightPack.mcVersion);
		return lv < rv;

	} else if(currentSorting == Sorting::ByName) {
		return Strings::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0;
	}

	//UHM, some inavlid value set?!
	qWarning() << "Invalid sorting set!";
	return true;
}

bool FtbFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
	return true;
}

const QMap<QString, FtbFilterModel::Sorting> FtbFilterModel::getAvailableSortings()
{
	return sortings;
}

void FtbFilterModel::setSorting(Sorting s)
{
	currentSorting = s;
	invalidate();
}

FtbFilterModel::Sorting FtbFilterModel::getCurrentSorting()
{
	return currentSorting;
}

FtbListModel::FtbListModel(QObject *parent) : QAbstractListModel(parent)
{
}

int FtbListModel::rowCount(const QModelIndex &parent) const
{
	return modpacks.size();
}

int FtbListModel::columnCount(const QModelIndex &parent) const
{
	return 1;
}

QVariant FtbListModel::data(const QModelIndex &index, int role) const
{
	int pos = index.row();
	if(modpacks.size() <= pos || pos < 0) {
		return QString("INVALID INDEX %1").arg(pos);
	}

	FtbModpack pack = modpacks.at(pos);

	if(role == Qt::DisplayRole) {
		return pack.name;
	} else if (role == Qt::ToolTipRole) {
		if(pack.description.length() > 100) {
			//some magic to prevent to long tooltips and replace html linebreaks
			QString edit = pack.description.left(97);
			edit = edit.left(edit.lastIndexOf("<br>")).left(edit.lastIndexOf(" ")).append("...");
			return edit;

		}
		return pack.description;
	} else if(role == Qt::DecorationRole) {
		//TODO: Add pack logos or something... but they have a weird size. This needs some design hacks
	} else if(role == Qt::TextColorRole) {
		if(pack.broken) {
			//FIXME: Hardcoded color
			return QColor(255, 0, 50);
		} else if(pack.bugged) {
			//FIXME: Hardcoded color
			//bugged pack, currently only indicates bugged xml
			return QColor(244, 229, 66);
		}
	} else if(role == Qt::UserRole) {
		QVariant v;
		v.setValue(pack);
		return v;
	}
	return QVariant();
}

void FtbListModel::fill(FtbModpackList modpacks)
{
	beginResetModel();
	this->modpacks = modpacks;
	endResetModel();
}

FtbModpack FtbListModel::at(int row)
{
	return modpacks.at(row);
}