summaryrefslogtreecommitdiffstats
path: root/application/FtbListModel.cpp
blob: 290767ffb100134ac2feed269bdfbb8e698c0fbf (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "FtbListModel.h"
#include "MultiMC.h"

#include <MMCStrings.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) {
		QStringList leftList = leftPack.mcVersion.split(".");
		QStringList rightList = rightPack.mcVersion.split(".");

		if(leftList.size() < 1) {
			return true;
		} else if(rightList.size() < 1) {
			return false;
		} else {
			for(int i = 0; i < qMax(leftList.size(), rightList.size()); i++) {
				if(leftList.size() -1 < i) {
					return true;
				}

				if(rightList.size() -1 < i) {
					return false;
				}

				int leftV = leftList.at(i).toInt();
				int rightV = rightList.at(i).toInt();

				if(leftV != rightV) {
					return leftV < rightV;
				}

			}
			return false;
		}

	} 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) {
			return QColor(255, 0, 50);
		} else if(pack.bugged) {
			//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)
{
	this->modpacks = modpacks;
}

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