Skip to content

Commit d9d31ce

Browse files
bacali95nickygerritsen
authored andcommitted
Add group filtering on teams
1 parent ee353ee commit d9d31ce

12 files changed

+568
-373
lines changed

DOMjura.pro

+4-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ SOURCES += main.cpp \
3232
gradientcache.cpp \
3333
domjudgeapimanager.cpp \
3434
submission.cpp \
35-
judging.cpp
35+
judging.cpp \
36+
group.cpp
3637

3738
HEADERS += problemgraphicsitem.h \
3839
defines.h \
@@ -53,7 +54,8 @@ HEADERS += problemgraphicsitem.h \
5354
gradientcache.h \
5455
domjudgeapimanager.h \
5556
submission.h \
56-
judging.h
57+
judging.h \
58+
group.h
5759

5860
FORMS += \
5961
maindialog.ui \

domjudgeapimanager.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ void DomjudgeApiManager::loadContestData(QString cid) {
3030
this->accessManager->get(request);
3131
}
3232

33+
void DomjudgeApiManager::loadGroupsData(QString cid) {
34+
DomjudgeApiRequest request("contests/" + cid + "/groups");
35+
this->groupsRequests.append(request);
36+
37+
this->accessManager->get(request);
38+
}
39+
3340
void DomjudgeApiManager::loadTeamData(QString cid) {
3441
DomjudgeApiRequest request("contests/" + cid + "/teams");
3542
this->teamsRequests.append(request);
@@ -98,6 +105,11 @@ void DomjudgeApiManager::replyFinished(QNetworkReply *reply) {
98105
&DomjudgeApiManager::contestDataLoaded)) {
99106
return;
100107
}
108+
if (this->processReply(reply, &apiManager->groupsRequests,
109+
&DomjudgeApiManager::groupsDataFailedLoading,
110+
&DomjudgeApiManager::groupsDataLoaded)) {
111+
return;
112+
}
101113
if (this->processReply(reply, &apiManager->teamsRequests,
102114
&DomjudgeApiManager::teamsDataFailedLoading,
103115
&DomjudgeApiManager::teamsDataLoaded)) {

domjudgeapimanager.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class DomjudgeApiManager : public QObject
3232
void loadUserData();
3333
void loadContestData(QString contestId);
3434
void loadTeamData(QString cid);
35+
void loadGroupsData(QString cid);
3536
void loadProblemData(QString cid);
3637
void loadSubmissions(QString cid);
3738
void loadJudgings(QString cid);
@@ -50,6 +51,7 @@ class DomjudgeApiManager : public QObject
5051
QList<QNetworkRequest> userRequests;
5152
QList<QNetworkRequest> contestRequests;
5253
QList<QNetworkRequest> teamsRequests;
54+
QList<QNetworkRequest> groupsRequests;
5355
QList<QNetworkRequest> problemRequests;
5456
QList<QNetworkRequest> submissionRequests;
5557
QList<QNetworkRequest> judgingRequests;
@@ -67,8 +69,8 @@ class DomjudgeApiManager : public QObject
6769
void contestDataLoaded(QJsonDocument contestData);
6870
void contestDataFailedLoading(QString error);
6971

70-
void categoriesDataLoaded(QJsonDocument data);
71-
void categoriesDataFailedLoading(QString error);
72+
void groupsDataLoaded(QJsonDocument data);
73+
void groupsDataFailedLoading(QString error);
7274

7375
void teamsDataLoaded(QJsonDocument data);
7476
void teamsDataFailedLoading(QString error);

group.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "group.h"
2+
3+
#include <QJsonObject>
4+
5+
#include "team.h"
6+
7+
namespace DJ {
8+
namespace Model {
9+
Group::Group(QJsonObject group, QObject *parent) : QObject(parent) {
10+
this->id = group.value("id").toString();
11+
this->name = group.value("name").toString("UNKNOWN");
12+
this->color = group.value("color").toString("");
13+
}
14+
15+
QString Group::getName() {
16+
return this->name;
17+
}
18+
19+
QString Group::getId() {
20+
return this->id;
21+
}
22+
23+
QString Group::getColor() {
24+
return this->color;
25+
}
26+
27+
void Group::addTeam(Team *team) {
28+
this->teams[team->getId()] = team;
29+
}
30+
31+
int Group::numTeams() {
32+
return this->teams.size();
33+
}
34+
35+
QString Group::toString() {
36+
QString s;
37+
s += " id = " + this->id + "\n";
38+
s += " color = " + this->color + "\n";
39+
s += " name = " + this->name + "\n";
40+
return s;
41+
}
42+
43+
}
44+
}

group.h

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/** \file group.h
2+
* \brief Contains a class for a group.
3+
*/
4+
5+
#ifndef GROUP_H
6+
#define GROUP_H
7+
8+
#include <QObject>
9+
#include <QHash>
10+
11+
namespace DJ {
12+
namespace Model {
13+
14+
class Team;
15+
16+
/** A group (from the API).
17+
*/
18+
class Group : public QObject
19+
{
20+
Q_OBJECT
21+
public:
22+
/** Constructs a new group.
23+
* \param group The team as returned from the DOMjudge API
24+
* \param parent The parent of this object
25+
*/
26+
explicit Group(QJsonObject group, QObject *parent = nullptr);
27+
/** Returns the name of this group.
28+
* \return The name of this group.
29+
*/
30+
QString getName();
31+
/** Returns the ID of this group.
32+
* \return The ID of this group.
33+
*/
34+
QString getId();
35+
/** Returns the color of this group.
36+
* \return The color of this group.
37+
*/
38+
QString getColor();
39+
/** Returns a string representing this group.
40+
* \return A string representation of this group.
41+
* Useful for debug printing.
42+
*/
43+
QString toString();
44+
45+
/**
46+
* Add a team to this group
47+
* \param team The team to add
48+
*/
49+
void addTeam(Team *team);
50+
51+
/**
52+
* @brief Returns the number of teams in this group
53+
* @return The number of teams in this group
54+
*/
55+
int numTeams();
56+
57+
private:
58+
QString id;
59+
QString name;
60+
QString color;
61+
QHash<QString, Team *> teams;
62+
};
63+
}
64+
}
65+
66+
#endif // GROUP_H

maincontroller.cpp

+34-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "maincontroller.h"
2-
#include <iostream>
2+
33
#include <QMessageBox>
44
#include <QDebug>
55

@@ -8,12 +8,11 @@
88
#include "domjudgeapimanager.h"
99
#include "contest.h"
1010
#include "team.h"
11+
#include "group.h"
1112
#include "problem.h"
1213
#include "submission.h"
1314
#include "judging.h"
1415

15-
using namespace std;
16-
1716
namespace DJ {
1817
namespace Controller {
1918

@@ -38,6 +37,8 @@ MainController::MainController(QObject *parent) : QObject(parent) {
3837
connect(apiManager, &Shared::DomjudgeApiManager::contestDataFailedLoading, this, &MainController::processContestLoadError);
3938
connect(apiManager, &Shared::DomjudgeApiManager::teamsDataLoaded, this, &MainController::processTeamData);
4039
connect(apiManager, &Shared::DomjudgeApiManager::teamsDataFailedLoading, this, &MainController::processContestLoadError);
40+
connect(apiManager, &Shared::DomjudgeApiManager::groupsDataLoaded, this, &MainController::processGroupData);
41+
connect(apiManager, &Shared::DomjudgeApiManager::groupsDataFailedLoading, this, &MainController::processContestLoadError);
4142
connect(apiManager, &Shared::DomjudgeApiManager::problemsDataLoaded, this, &MainController::processProblemData);
4243
connect(apiManager, &Shared::DomjudgeApiManager::problemsDataFailedLoading, this, &MainController::processContestLoadError);
4344

@@ -68,6 +69,11 @@ void MainController::connectToServer() {
6869
this->contest = nullptr;
6970
}
7071

72+
if (!this->groups.empty()) {
73+
qDeleteAll(this->groups);
74+
this->groups.clear();
75+
}
76+
7177
if (!this->teams.empty()) {
7278
qDeleteAll(this->teams);
7379
this->teams.clear();
@@ -107,7 +113,7 @@ void MainController::processUser(QJsonDocument userData) {
107113
void MainController::processContestData(QJsonDocument contestData) {
108114
this->contest = new Model::Contest(contestData.object());
109115
Shared::DomjudgeApiManager *apiManager = Shared::DomjudgeApiManager::sharedApiManager();
110-
apiManager->loadTeamData(this->mainDialog->getContestId());
116+
apiManager->loadGroupsData(this->mainDialog->getContestId());
111117
}
112118

113119
void MainController::processContestLoadError(QString error) {
@@ -116,14 +122,28 @@ void MainController::processContestLoadError(QString error) {
116122
this->mainDialog->hideContest();
117123
}
118124

125+
void MainController::processGroupData(QJsonDocument groupsData) {
126+
foreach (auto groupValue, groupsData.array()) {
127+
auto groupObject = groupValue.toObject();
128+
Model::Group *group = new Model::Group(groupObject);
129+
this->groups[group->getId()] = group;
130+
}
131+
132+
Shared::DomjudgeApiManager *apiManager = Shared::DomjudgeApiManager::sharedApiManager();
133+
apiManager->loadTeamData(this->mainDialog->getContestId());
134+
}
135+
119136
void MainController::processTeamData(QJsonDocument teamData) {
120137
foreach (auto teamValue, teamData.array()) {
121138
auto teamObject = teamValue.toObject();
122-
Model::Team *team = new Model::Team(teamObject);
123-
this->teams[team->getId()] = team;
139+
Model::Team *team = new Model::Team(teamObject, this->groups);
140+
if (team->getGroup()) {
141+
// Only teams in a category are useful
142+
this->teams[team->getId()] = team;
143+
} else {
144+
delete team;
145+
}
124146
}
125-
cout << teamData.array().size() << endl;
126-
cout << this->teams.size() << endl;
127147

128148
Shared::DomjudgeApiManager *apiManager = Shared::DomjudgeApiManager::sharedApiManager();
129149
apiManager->loadProblemData(this->mainDialog->getContestId());
@@ -136,7 +156,7 @@ void MainController::processProblemData(QJsonDocument problemData) {
136156
this->problems[problem->getId()] = problem;
137157
}
138158

139-
this->mainDialog->displayContest(this->contest);
159+
this->mainDialog->displayContest(this->contest, this->groups);
140160
}
141161

142162
void MainController::processEventLoadError(QString error) {
@@ -160,7 +180,7 @@ void MainController::processSubmissionData(QJsonDocument submissionData) {
160180
apiManager->loadJudgings(this->mainDialog->getContestId());
161181
}
162182

163-
void MainController:: processJudgingData(QJsonDocument judgingData) {
183+
void MainController::processJudgingData(QJsonDocument judgingData) {
164184
foreach (QJsonValue judgingValue, judgingData.array()) {
165185
QJsonObject judgingObject = judgingValue.toObject();
166186
Model::Judging *judging = new Model::Judging(judgingObject,
@@ -177,14 +197,12 @@ void MainController:: processJudgingData(QJsonDocument judgingData) {
177197
this->standingsController = nullptr;
178198
}
179199

180-
cout << this->teams.size() << endl;
181-
cout << this->submissions.size() << endl;
182-
cout << this->problems.size() << endl;
183-
cout << this->judgings.size() << endl;
184-
185200
QHash<QString, Model::Team *> selectedTeams;
201+
QList<QString> selectedGroups = this->mainDialog->selectedGroups().keys();
186202
foreach (Model::Team *team, this->teams) {
187-
selectedTeams[team->getId()] = team;
203+
if (selectedGroups.contains(team->getGroup()->getId())) {
204+
selectedTeams[team->getId()] = team;
205+
}
188206
}
189207

190208
this->standingsController = new StandingsController(this->contest,

maincontroller.h

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class MainController : public QObject {
4343

4444
StandingsController *standingsController;
4545
Model::Contest *contest;
46+
QHash<QString, Model::Group *> groups;
4647
QHash<QString, Model::Team *> teams;
4748
QHash<QString, Model::Problem *> problems;
4849
QHash<QString, Model::Submission *> submissions;
@@ -52,6 +53,7 @@ private slots:
5253
void connectToServer();
5354
void processUser(QJsonDocument userData);
5455
void processContestData(QJsonDocument contestData);
56+
void processGroupData(QJsonDocument groupData);
5557
void processTeamData(QJsonDocument teamData);
5658
void processProblemData(QJsonDocument problemData);
5759
void processSubmissionData(QJsonDocument submissionData);

maindialog.cpp

+45-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QDebug>
66

77
#include "contest.h"
8+
#include "group.h"
89

910
namespace DJ {
1011
namespace View {
@@ -36,6 +37,7 @@ void MainDialog::on_buttonStart_clicked() {
3637
}
3738

3839
void MainDialog::hideContest() {
40+
this->ui->groupBoxGroups->setEnabled(false);
3941
this->ui->groupBoxContest->setEnabled(false);
4042
this->ui->groupBoxMode->setEnabled(false);
4143

@@ -45,9 +47,16 @@ void MainDialog::hideContest() {
4547
this->ui->labelContestEnd->setText("");
4648
this->ui->labelContestPenalty->setText("");
4749

50+
qDeleteAll(this->groupCheckboxes);
51+
this->groupCheckboxes.clear();
52+
this->selectedGroupsHash.clear();
4853
}
4954

50-
void MainDialog::displayContest(Model::Contest *contest) {
55+
void MainDialog::displayContest(Model::Contest *contest, QHash<QString, Model::Group *> groups) {
56+
qDeleteAll(this->groupCheckboxes);
57+
this->groupCheckboxes.clear();
58+
59+
this->ui->groupBoxGroups->setEnabled(true);
5160
this->ui->groupBoxContest->setEnabled(true);
5261
this->ui->groupBoxMode->setEnabled(true);
5362

@@ -56,6 +65,41 @@ void MainDialog::displayContest(Model::Contest *contest) {
5665
this->ui->labelContestFreeze->setText(contest->getFreeze().toString("yyyy-MM-dd hh:mm:ss"));
5766
this->ui->labelContestEnd->setText(contest->getEnd().toString("yyyy-MM-dd hh:mm:ss"));
5867
this->ui->labelContestPenalty->setText(QString::number(contest->getPenaltyMinutes()) + " minutes");
68+
69+
int row = 0;
70+
foreach (auto group, groups) {
71+
QString groupText = group->getName();
72+
groupText += " (";
73+
int numTeams = group->numTeams();
74+
groupText += QString::number(numTeams);
75+
groupText += " ";
76+
groupText += (numTeams == 1) ? "team)" : "teams)";
77+
QCheckBox *checkbox = new QCheckBox(groupText);
78+
checkbox->setProperty("group", QVariant::fromValue(group));
79+
this->ui->gridLayoutGroups->addWidget(checkbox, row, 0);
80+
this->groupCheckboxes.append(checkbox);
81+
++row;
82+
83+
connect(checkbox, &QCheckBox::clicked, this, &MainDialog::groupCheckboxClicked);
84+
}
85+
}
86+
87+
void MainDialog::groupCheckboxClicked(bool checked) {
88+
QCheckBox *sender = (QCheckBox *)this->sender();
89+
Model::Group *group = sender->property("group").value<Model::Group *>();
90+
if (checked) {
91+
this->selectedGroupsHash[group->getId()] = group;
92+
this->ui->groupBoxMode->setEnabled(true);
93+
} else {
94+
this->selectedGroupsHash.remove(group->getId());
95+
if (this->selectedGroupsHash.isEmpty()) {
96+
this->ui->groupBoxMode->setEnabled(false);
97+
}
98+
}
99+
}
100+
101+
QHash<QString, Model::Group *> MainDialog::selectedGroups() {
102+
return this->selectedGroupsHash;
59103
}
60104

61105
QString MainDialog::getProtocol() {

0 commit comments

Comments
 (0)